我如何 "tell" 向 C 编译器指出不应该优化的代码?

How do I "tell" to C compiler that the code shouldn't be optimized out?

有时我需要 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 指令可以执行此操作?

唯一的标准 C 方式是 volatile。如果这不符合您的要求,您将需要使用特定于您的平台的东西。

您确实应该使用 volatile 作为 GCC 文档的 . See also this 章节。

如果你使用最近的GCC compiler, you could disable optimizations in a single function by using appropriate function specific options pragmas (or some optimize function attribute),例如

#pragma GCC optimize ("-O0");

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

也许你想要extended asm statements with the volatile keyword

您有几个选择:

  1. 编译时不进行优化。与某些编译器不同,GCC 默认情况下不会优化,因此除非您告诉它进行优化,否则您应该得到与 C 源代码非常相似的生成代码。当然,您可以选择优化一些 C 文件而不是其他文件,使用简单的 make 规则。

  2. 等式把编译器去掉,用汇编写相关函数。然后就可以准确的得到你想要的生成代码了

  3. 使用 volatile,它可以防止编译器对某个变量做出任何假设,因此对于 C 中变量的任何使用,编译器都被迫生成 LOAD 或 STORE,即使表面上没有必要.