我如何“告诉” C编译器不应优化代码?

弗拉达(Vlada Katlinskaya)

有时,我需要一些代码来完全由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中,而不是将其定位到SRAM中(由于某些原因,这很糟糕)。此外,Internet上的许多文章建议volatile谨慎使用关键字,因为结果可能会变得不稳定(取决于编译器,其优化设置,平台等)。

因此,我绝对希望以某种方式指出源代码指令,并告诉编译器应完全按原样编译该代码。像这样:volatile while(!flag);

是否有任何标准的C指令来执行此操作?

巴西勒·斯塔林凯维奇

事实上,你应该使用volatile由大卫·施瓦茨回答另请参阅GCC文档的这一章。

如果您使用最新的GCC编译器,则可以通过使用适当的特定于功能的选项编译指示(或某些optimizefunction属性来禁用单个功能的优化

#pragma GCC optimize ("-O0");

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

也许您想要使用关键字的扩展asm语句volatile

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器如何优化这段代码

为什么编译器优化会破坏我的代码?

如何编写(测试)编译器/ JIT无法优化的代码?

JVM JIT编译器如何优化“重复的” Java代码?

如何告诉编译器我的可为空的 c# 泛型约束?

我可以告诉C ++编译器本身如何进行任意类型转换吗?

我如何告诉编译器/CPU 在内核空间的代码中背靠背执行指令?

如何告诉超级计算机上的C ++编译器我的R包需要C ++ 0x?

Java编译-有没有办法告诉编译器忽略我的部分代码?

如何告诉编译器我的朋友函数是函数模板

如何告诉编译器我返回的枚举变量始终没有生存期?

如何告诉编译器我的函数像process :: exit()一样终止程序?

GraalVM:如何实现编译器优化?

我应该自己优化代码还是让编译器/ gcc来做

我如何看待编译器进行的优化

如何告诉链接器/编译器包含看似“死”的代码

如何查看带有优化的C ++代码的编译器重构

如何使用 Visual Studio 编译器在 Windows 上编译 cython 编译的 c 代码

为什么我的C ++编译器不优化这些写入的内存?

C++ 编译器优化了我的 bool 检查功能

有没有办法告诉编译器忽略C中的某些代码块?

如何在我的编译器中运行Java代码

如何告诉我的IDE以特定方式编译CMake项目?

我如何告诉cgo不要编译文件?

我如何告诉 Sprockets 4 为供应的 gem 编译资产?

以某种方式告诉编译器“不处理代码行”

编译器如何优化C#中的异常过滤器?

C-编译器优化将如何影响没有主体的for循环?

在 C 中,ARM 编译器将如何优化此结构?