我正在使用 for/while 循环在我的代码中实现延迟。延迟的持续时间在这里并不重要,尽管它足够大以至于可以注意到。这是代码片段。
uint32_t i;
// Do something useful
for (i = 0; i < 50000000U; ++i)
{}
// Do something useful
我观察到的问题是这个 for 循环不会被执行。它可能会被编译器忽略/优化。但是,如果我通过 volatile 限定循环计数器i
,则 for 循环似乎正在执行,并且我确实注意到执行中所需的延迟。
这种行为似乎有点违反我对带有/不带有 volatile 关键字的编译器优化的理解。
即使循环计数器得到优化并存储在处理器寄存器中,计数器不应该仍然工作,也许延迟更小吗?(因为消除了内存获取开销。)
我正在构建的平台是 Xtensa 处理器(由 Tensilica 提供),而 C 编译器是由 Tensilica 提供的,Xtensa C/C++ 编译器以最高级别的优化运行。
我对gcc 4.4.7
with-o3
和 ofast 优化级别进行了同样的尝试。在这种情况下,延迟似乎有效。