【发布时间】:2017-10-27 23:55:05
【问题描述】:
我正在编译一些没有优化但在启用优化时中断的代码。我怀疑代码的某些关键部分被优化了,导致逻辑中断。
我想做这样的事情:
code...
#disable opt
more code...
#enable opt
如果我可以为该部分设置优化级别(如 O0、O1...),那就更好了
对于那些建议它是代码的人:
被删除的代码部分是(通过反汇编目标文件检查):
void wait(uint32_t time)
{
while (time > 0) {
time--;
}
}
我严重怀疑该代码有问题
【问题讨论】:
-
这是为了调试目的,还是为了“修复”错误?我希望你不要试图用这个想法来修复你的程序。
-
嗯,它是针对嵌入式系统的,所以硬件操作被认为毫无意义的可能性很高,甚至使用 volatile 也无济于事,所以我打算用它来修复它:p
-
请注意,现代编译器会积极优化调用未定义行为的代码——它们是被允许的,因为行为未定义。如果您确实发现优化时出现问题,请仔细查看代码;检查未定义的行为。
-
消失的代码是:while(var > 0) var-- 甚至不是无限循环
-
使用像
while循环这样的旋转是在嵌入式系统上自找麻烦。你不应该相信嵌入式硬件会给你周期准确的延迟。您应该使用用于小延迟的标准库函数。我不知道您需要什么时间,但usleep()会延迟到微秒级。如果延迟很长(例如毫秒),您应该使用中断或 RTOS 睡眠功能。
标签: c gcc optimization