【发布时间】:2015-05-13 07:16:14
【问题描述】:
我正在使用 for/while 循环在我的代码中实现延迟。延迟的持续时间在这里并不重要,尽管它足够大以至于可以注意到。这是代码sn-p。
uint32_t i;
// Do something useful
for (i = 0; i < 50000000U; ++i)
{}
// Do something useful
我观察到的问题是这个 for 循环不会被执行。它可能会被编译器忽略/优化。但是,如果我将循环计数器 i 限定为 volatile,则 for 循环似乎正在执行,并且我确实注意到了所需的执行延迟。
这种行为似乎有点违反我对带有/不带有 volatile 关键字的编译器优化的理解。
即使循环计数器得到优化并存储在处理器寄存器中,计数器不应该仍然工作,也许延迟更小吗? (由于消除了内存获取开销。)
我正在构建的平台是 Xtensa 处理器(由 Tensilica 提供),而 C 编译器是 Tensilica 提供的,Xtensa C/C++ 编译器以最高级别的优化运行。
我对@987654326@ 和-o3 和ofast 优化级别进行了同样的尝试。在这种情况下,延迟似乎有效。
【问题讨论】:
-
老实说,如果我是编译器,我会将 i 设置为 50000000U 并完成,尤其是在高优化级别上。使用 volatile,它可能会在外部进行更改,因此我无法优化它并在任何迭代中从寄存器/缓存/任何地方读取它。
-
编译器不关心保留变量或循环;它关心保留输入和输出等内容。撕掉一个无所事事的循环是完全允许的。
-
另外,因为还没有人提到它:不要这样做。这不是制造延迟的方法。 Use one of the functions designed for the job.
-
“我正在使用 for/while 循环在我的代码中实现延迟。”一开始是个非常糟糕的主意...
标签: c delay compiler-optimization timedelay xtensa