如何"告诉"C编译器不应该优化代码?

Vla*_*aya 7 c gcc compiler-optimization

有时我需要一些代码才能由CPU执行,就像我把它放在源代码中一样.但任何C编译器都有它的优化算法,所以我可以期待一些技巧.例如:

unsigned char  flag=0;

interrupt ADC_ISR(){
  ADC_result = ADCH;
  flag = 1;
}

void main(){
  while(!flag);
  echo ADC_result;
}
Run Code Online (Sandbox Code Playgroud)

有些编译器肯定会使while(!flag);循环不定式,因为它会假设flag等于false(!flag因此总是如此).

有时我可以使用volatile关键字.有时它可以提供帮助.但实际上在我的情况下(AVR GCC)volatile关键字强制编译器将变量定位到SRAM而不是寄存器(由于某些原因这是不好的).此外,互联网上的许多文章建议使用volatile关键字作为结果可能变得不稳定(取决于编译器,其优化设置,平台等).

所以我肯定更喜欢以某种方式指出源代码指令并告诉编译器这个代码应该完全按原样编译.像这样:volatile while(!flag);

有没有标准的C指令来做这个?

Dav*_*rtz 8

唯一标准的C方式是volatile.如果没有按照您的要求进行,您将需要使用特定于您的平台的东西.


Bas*_*tch 3

您确实应该使用David Schwartz 的volatile回答。另请参阅GCC 文档的本章

如果您使用最新的GCC编译器,则可以通过使用适当的函数特定选项编译指示(或某些optimize函数属性)来禁用单个函数中的优化,例如

#pragma GCC optimize ("-O0");
Run Code Online (Sandbox Code Playgroud)

在你的main. 我不确定这是个好主意。

也许您需要带有关键字的扩展asm语句volatile