Dir*_*ere 5 c optimization for-loop compiler-optimization
我有一些遗留代码,其中包含了一个时间浪费循环,以便有时间让eeprom读取完成(不好的做法):
for(i = 0; i < 50; i++);
Run Code Online (Sandbox Code Playgroud)
但是,当编译器优化开启以获得速度时,会发生特殊情况.它不一定与该语句相关联,但我想知道编译器是否可能只是优化时间延迟
Lun*_*din 13
这取决于的类型i.如果它只是一个普通的整数类型,不能在循环内部使用,则没有副作用,编译器可以自由地优化整个事物.
如果声明i作为volatile然而,编译器被强制产生递增变量并读取它的代码,在循环的每圈.
这就是为什么你不应该在嵌入式系统中使用像这样的"烧毁"循环的众多原因之一.您还占用100%的CPU并消耗100%的电流.并且您在系统时钟和循环之间创建紧密耦合,这不一定是线性的.
专业解决方案始终是使用片上硬件定时器而不是"烧坏"循环.
Lundin的回答解释了为什么它发生得恰到好处,所以不需要解释.
也就是说,如果你真的需要在循环中保留旧的行为但是优化其余部分,最简单的方法是将这个主动延迟循环放在一个文件中的一个函数中:
#include <active_delay.h> // the corresponding header file
void active_delay(int d)
{
// do not build with optimize flags on!
int i;
for(i = 0; i < d; i++);
}
Run Code Online (Sandbox Code Playgroud)
并在没有任何优化标志的情况下构建此文件.
通过优化标志构建其余代码,以便从"普通"代码的优化器中受益.
请注意,由于函数调用开销和循环的非常短的执行时间,当从内联调用移动到单独的目标文件中的函数时,延迟会略微增加.
您可能希望减少d值以匹配先前的时间(如果有必要)