c - 如何防止 GCC 优化繁忙的等待循环?

标签 c optimization gcc avr-gcc

我想为 Atmel AVR 微 Controller 编写 C 代码固件。我将使用 GCC 编译它。此外,我想启用编译器优化(-Os-O2),因为我认为没有理由不启用它们,它们可能会更快地生成更好的汇编方式而不是手动编写汇编。

但是我想要一小段没有优化的代码。我想延迟某个函数的执行,因此我想写一个什么都不做的循环来浪费一些时间。无需精确,稍等片刻即可。

/* How to NOT optimize this, while optimizing other code? */
unsigned char i, j;
j = 0;
while(--j) {
    i = 0;
    while(--i);
}

由于 AVR 中的内存访问速度很慢,我希望将 ij 保存在 CPU 寄存器中。


更新:我刚找到 util/delay.hutil/delay_basic.h来自 AVR Libc .尽管大多数时候使用这些函数可能是更好的主意,但这个问题仍然有效且有趣。


相关问题:

最佳答案

我在点击来自 dmckee's answer 的链接后得出了这个答案。 , 但它采用了与他/她的回答不同的方法。

Function Attributes GCC 的文档提到:

noinline This function attribute prevents a function from being considered for inlining. If the function does not have side-effects, there are optimizations other than inlining that causes function calls to be optimized away, although the function call is live. To keep such calls from being optimized away, put asm ("");

这给了我一个有趣的想法......我没有在内部循环中添加一条 nop 指令,而是尝试在其中添加一个空的汇编代码,如下所示:

unsigned char i, j;
j = 0;
while(--j) {
    i = 0;
    while(--i)
        asm("");
}

成功了!该循环尚未优化,也没有插入额外的 nop 指令。

此外,如果你使用volatile,gcc会将那些变量存储在RAM中,并添加一堆lddstd来复制它们到临时寄存器。另一方面,这种方法不使用 volatile 并且不会产生此类开销。


更新:如果您使用-ansi-std 编译代码,您必须替换asm带有 __asm__ 的关键字,如 described in GCC documentation .

此外,如果您的 assembly statement must execute where we put it, (i.e. must not be moved out of a loop as an optimization) 也可以使用 __asm__ __volatile__("") .

关于c - 如何防止 GCC 优化繁忙的等待循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23210361/

相关文章:

c - 为什么C中标识符可以包含 '$'?

c - 为什么输出应该是垃圾却一直是 0 2 ?

c - 如何在数组中使用字符串查找所需的特定字母

r - 以优化的方式将现有二维点移动到新生成的二维点

c++ - Gnuplot 和 std::filesystem::remove

c++ - 如何避免 C 和 C++ 中的命名空间冲突

c - 计算整数的所有因子的最快算法是什么?

python - Pandas => 按组获取第一个和最后一个元素的索引

javascript - 需要优化的解决方案,并且不使用 jquery 函数

c++ - 数组不是命名空间::std 的成员