有时我需要一些代码由cpu执行,就像我把它放在源代码中一样.但任何C编译器都有它的优化算法,所以我可以期待一些技巧.例如:
unsigned char flag=0; interrupt ADC_ISR(){ ADC_result = ADCH; flag = 1; } void main(){ while(!flag); echo ADC_result; }
有些编译器肯定会生成while(!flag);循环不定式因为它会假设flag等于false(因此!flag总是为true).
有时我可以使用volatile关键字.有时它可以提供帮助.但实际上在我的情况下(AVR GCC)volatile关键字强制编译器将变量定位到SRAM而不是寄存器(由于某些原因这是不好的).此外,互联网上的许多文章建议使用volatile关键字作为结果可能变得不稳定(取决于编译器,其优化设置,平台等).
所以我肯定更喜欢以某种方式指出源代码指令并告诉编译器这个代码应该完全按原样编译.像这样:volatile while(!flag);
有没有标准的C指令来做这个?
解决方法
您确实应该使用volatile作为
answered by David Schwartz.另请参阅GCC文档的
this章节.
如果您使用最近的GCC编译器,则可以使用适当的function specific options pragmas(或某些优化函数attribute)在单个函数中禁用优化,例如
#pragma GCC optimize ("-O0");
在你的主要之前.我不确定这是个好主意.