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.

[参考译文] CCS/MSP430FR5969:立即优化 GPIO。

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/586073/ccs-msp430fr5969-gpio-gets-optimized-away

器件型号:MSP430FR5969

工具/软件:Code Composer Studio

如标题所示。 如果我将优化拖至4、这将得到优化、这显然不是一件好事:

void LED_Blink(){
GPIO_toggleOutputOnPin (
GPIO_PORT_P3、
GPIO_PIN6
);
} 

除了 Blinky LED、还有更重要的事情、例如使能引脚等。 除了将所有与 IO 相关的内容标记为#pragma FUNC_CANNOT_INLINE 之外,是否还有办法防止这种情况的发生?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设您的意思是、它是内联的、而不是优化的。 "远离优化"意味着编译器已确定它不起作用、只需将其删除即可。

    内联它有什么问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、它已经过优化、不需要批发。 Anti-inline pragma 会阻止该反社会行为。

    具体而言、您可能在调试器中看不到问题、但在对器件进行下电上电时、GPIO 将不起作用。 回到优化级别3可以解决该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想您需要发布整个程序,包括对 LED_Blink()的调用
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    if (scheduler.scheduler&LED_task){
    LED_Blink ();
    scheduler.scheduler=scheduler.scheduler&~LED_task;
    continue;
    } 

    我不能(也不会)在公共场合发布成千上万行代码、这些代码是我的客户的财产。  然而、这个特定的示例非常简单。 调度程序会触发,但 LED_Blink();函数调用会被整体擦除,而不会被任何内容替换。 这仅在优化级别4上发生。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道为什么你的帖子被移动了、它位于正确的位置。 您能否创建具有相同问题的测试用例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Olli Mannisto"]我不能(也不会)在公共场合发布数千行代码

    嗯、几乎没有人会读取 成千上万行代码。 您应仅发布 相关代码、最好将其移至新的干净测试项目中、以便其他人可以使用该代码并进行检查(如果需要)。

    [引用 user="Olli Mannisto"]调度程序会触发,但 LED_Blink();函数调用会被整体擦除,而不会被任何内容替换。

    您是否使用调试器通过单步执行代码来检查此问题? 这样就可以使函数调用仍然存在、只需优化延迟、您就不会注意到 LED 闪烁。 对于延迟、您不应使用 empty for ()或 while ()循环、而应使用__delay_cycles ()或计时器、此外还应检查 GPIO 端口寄存器是否声明为 voltatile。

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

    您是否使用调试器通过单步执行代码来检查此问题? 这样就可以使函数调用仍然存在、只需优化延迟、您就不会注意到 LED 闪烁。 对于延迟、您不应使用 empty for ()或 while ()循环、而应使用__delay_cycles ()或计时器、此外还应检查 GPIO 端口寄存器是否声明为 voltatile。

    是的、汇编器代码在该点没有任何方式的函数调用。 再说一次、在优化级别3上一切都正常。  如果您的调度程序完全相同、我将继续使用500us 系统检测信号计时器来运行调度程序。  

    我将查看我是否有时间准备一个测试项目。 对于完整的固件和单功能测试用例、如果"程序范围优化"不会产生相同的问题、我不会感到惊讶。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人显然认为这是我的代码问题、而不是编译器优化问题。

    我会研究制造测试用例、但发现它不会以相同的方式"工作"、这并不是一件意外的事情。 我不介意将项目提供给 TI 员工进行测试、但出于某种原因、没有人选择了该项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们不知道怎么说。 我确实怀疑编译器操作、但如果它是死代码确定算法中的错误、状态的细微差异可能会有所不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它不能像预期的那样进行项目切割。 即、我删除了与调度器计时器和 LED 闪烁位无关的所有内容、它会愉快地闪烁。 但是、当您使用完整的项目尝试它时、它不会运行。 僵局。

    在任何情况下、我都很喜欢进程间优化、因此这几乎不是一个障碍。