我正在使用STM32 HAL库进行微控制器项目。在ADC部分,我找到了以下代码:
uint32_t WaitLoopIndex = 0;
/...
.../
/* Delay for ADC stabilization time. */
/* Delay fixed to worst case: maximum CPU frequency */
while(WaitLoopIndex < ADC_STAB_DELAY_CPU_CYCLES)
{
WaitLoopIndex++;
}
我的理解是,由于WaitLoopIndex
未在函数中的任何其他位置使用且未声明为volatile,因此此代码很可能会被优化掉,对吧?
答案 0 :(得分:4)
技术上是的,尽管根据我对嵌入式目标编译器的经验,该循环不会得到优化。如果你考虑一下,拥有一个没有意义的循环并不是一个你将在程序中看到的构造,除非程序员故意这样做,所以我怀疑许多编译器都不愿意为它进行优化。
你必须对如何优化它做出假设的事实意味着它肯定是一个错误,并且是最糟糕的类型之一。很可能ST只想在他们的库中使用C,所以这样做而不是他们应该使用的内联汇编器延迟。但是,由于他们试图解决的问题在很大程度上依赖于平台,因此一个令人讨厌的平台/编译器依赖解决方案是不可避免的,他们在这里所做的只是试图隐藏这种依赖。
声明变量volatile会有所帮助,但你仍然不知道循环执行多长时间而不假设编译器是如何构建它的。这仍然是非常糟糕的做法,但如果他们添加了一个断言,提醒您手动检查可能可以通过的延迟。
答案 1 :(得分:1)
这取决于编译器和优化级别。要确认结果,只需进入调试模式并检查该段代码的反汇编代码。