有时我需要一些代码由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
因此总是如此)。
有时我可以使用volatile
关键字。有时它可以提供帮助。但实际上在我的情况下(AVR GCC)volatile
关键字强制编译器将变量定位到SRAM而不是寄存器(由于某些原因这是不好的)。此外,互联网上的许多文章建议使用volatile
关键字作为结果可能变得不稳定(取决于编译器,其优化设置,平台等)。
所以我肯定更喜欢以某种方式指出源代码指令并告诉编译器这个代码应该完全按原样编译。像这样:volatile while(!flag);
是否有任何标准C指令可以执行此操作?
答案 0 :(得分:8)
唯一的标准C方式是volatile
。如果这并不能完全符合您的要求,那么您需要使用特定于您平台的内容。
答案 1 :(得分:3)
您确实应该使用volatile
作为answered by David Schwartz。另请参阅GCC文档的this章节。
如果您使用最近的GCC编译器,则可以使用适当的function specific options pragmas(或某些optimize
函数attribute)在单个函数中禁用优化,例如< / p>
#pragma GCC optimize ("-O0");
在main
之前。我不确定这是个好主意。
答案 2 :(得分:1)
您有几种选择:
无需优化即可编译。与某些编译器不同,GCC默认不进行优化,因此除非您告诉它进行优化,否则您应该获得与C源非常相似的生成代码。当然,您可以使用简单的制作规则来选择优化某些C文件而不是其他文件。
将编译器从等式中取出并在汇编中编写相关函数。然后,您可以准确地获得所需的生成代码。
使用volatile,这可以防止编译器对某个变量做出任何假设,因此对于C中变量的任何使用,编译器都被迫生成一个LOAD或STORE,即使表面上是不必要的。