工具/软件:Code Composer Studio
如标题所示。 如果我将优化拖至4、这将得到优化、这显然不是一件好事:
void LED_Blink(){
GPIO_toggleOutputOnPin (
GPIO_PORT_P3、
GPIO_PIN6
);
}
除了 Blinky LED、还有更重要的事情、例如使能引脚等。 除了将所有与 IO 相关的内容标记为#pragma FUNC_CANNOT_INLINE 之外,是否还有办法防止这种情况的发生?
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.
工具/软件:Code Composer Studio
如标题所示。 如果我将优化拖至4、这将得到优化、这显然不是一件好事:
void LED_Blink(){
GPIO_toggleOutputOnPin (
GPIO_PORT_P3、
GPIO_PIN6
);
}
除了 Blinky LED、还有更重要的事情、例如使能引脚等。 除了将所有与 IO 相关的内容标记为#pragma FUNC_CANNOT_INLINE 之外,是否还有办法防止这种情况的发生?
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 系统检测信号计时器来运行调度程序。
我将查看我是否有时间准备一个测试项目。 对于完整的固件和单功能测试用例、如果"程序范围优化"不会产生相同的问题、我不会感到惊讶。