我有一些遗留代码,其中包含了一个时间浪费循环,以便有时间让eeprom读取完成(不良做法):
for(i = 0; i < 50; i++);
然而,当编译器优化开启以提高速度时会发生特殊情况。它不一定与该语句相关联,但我想知道编译器是否可能只是优化时间延迟
答案 0 :(得分:13)
这取决于i
的类型。如果它只是一个普通的整数类型,不能在循环内部使用,那么就没有副作用,编译器可以自由地优化整个事物。
但是,如果将i
声明为volatile
,编译器将被强制生成代码,该代码会在循环的每一圈生成变量并读取它。
这是为什么你不应该使用&#34;烧掉&#34;在嵌入式系统中循环。您还占用100%的CPU并消耗100%的电流。并且您在系统时钟和循环之间建立紧密耦合,这不一定是线性的。
专业解决方案始终是使用片上硬件定时器而不是&#34;烧毁&#34;循环。