This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28P650DK:更改优化后、IF 条件的不可预测行为。

Guru**** 2872500 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1639957/tms320f28p650dk-unpredictable-behaviour-of-if-condition-after-changing-optimization

器件型号: TMS320F28P650DK

尊敬的专家:  
我已经宣布了

 易失性 uint16_t 状态 2;
#define ESC_EEPROM_STATUS_EEPROMLOAD_M 0x1000U
#define ESC_EEPROM_SUCCESS  0x0U
 
当我添加没有 op 指令在其他部分它进入行“return (ESC_EEPROM_Success ,截图 2 “条件检查后,否则没有 op 它进入到行(“ESC_EEPROM_LOAD_ERROR “,屏幕截图 1 ). 您能帮助我澄清一下吗? 如果一切都正确(有或没有操作)、它应该与(“Return ESC_EEPROM_Success“)语句对齐。 (check_status3 已添加到监视表达式以进行调试。)


  
 
类似于 e2e、 https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000-microcontrollers---internal/f/c2000-microcontrollers---internal-forum/1608054/tms320f28034-f28034-the-program-takes-the-wrong-branch-path
您能帮助我了解这种行为吗?

另外、请提出无噪声或无延迟地解决问题的方法。

(使用 LLM 找到此说明)


  
我已经创建了一个简单的程序来重新创建问题,只有这些代码行供参考和附加,观察到相同的行为:
器件 : f28p65x launchpad
优化: 2.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、仅添加该流程在优化级别零中是正确的、而与 nop 指令无关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    程序是否执行预期的操作? 或者、这只是与调试器放置光标的位置有关吗?

    我在没有 NOP 的情况下编译了您的测试用例、并认为代码有效。 如果 status2 的位 12 为 0、则返回 success;否则返回错误。

    但是、优化会以调试器在检查 status2 的位 12 时认为代码处于错误情况的方式来移动代码。 如果检查成功、仍将返回成功。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对不起,我没有得到你关于优化的最后一点. (您是否建议调试器将光标置于错误的位置,但最终结果将正确?)

    c29x 编译器的同一个代码可以正常工作,有或没有 op. 但对于 C28x 编译器来说、这一点有所不同。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我建议调试器将光标放置在编译器告诉调试器放置光标的位置、以便清除调试器中的错误。 此位置会因对代码执行的优化而改变、可能不是源精确的。 虽然位置不准确、但代码的含义没有改变。

    您能定义什么是“工作正常“吗? 如果您在调试期间谈到光标在源代码中的位置、那么我会断言代码正在正确执行、除非您另有观察到。 调试信息不定义程序的作用、而只是一个近似值、尤其是在启用了优化时。

    与 C29x 编译器的比较并不有效、因为两者完全不同的编译器工具链基础架构。 C29x 使用开源 Clang/LLVM 基础架构、而 C28x 使用专有的 TI 基础架构。 两个工具链生成调试信息的方式会有所不同。

    如果您熟悉 C28x 汇编、我可以尝试解释您看到的内容。 但是、除非程序实际上会在退出函数时返回 ESC_EEPROMW_LOAD_ERROR(如返回寄存器中的那样)、否则不会出现问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    了解您的观点。 我已经测试了它在我的侧也.  

    谢谢 James。