STM32 HAL库简单的C编码错误

时间:2015-03-18 09:38:25

标签: c microcontroller stm32

我正在使用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,因此此代码很可能会被优化掉,对吧?

2 个答案:

答案 0 :(得分:4)

技术上是的,尽管根据我对嵌入式目标编译器的经验,该循环不会得到优化。如果你考虑一下,拥有一个没有意义的循环并不是一个你将在程序中看到的构造,除非程序员故意这样做,所以我怀疑许多编译器都不愿意为它进行优化。

你必须对如何优化它做出假设的事实意味着它肯定是一个错误,并且是最糟糕的类型之一。很可能ST只想在他们的库中使用C,所以这样做而不是他们应该使用的内联汇编器延迟。但是,由于他们试图解决的问题在很大程度上依赖于平台,因此一个令人讨厌的平台/编译器依赖解决方案是不可避免的,他们在这里所做的只是试图隐藏这种依赖。

声明变量volatile会有所帮助,但你仍然不知道循环执行多长时间而不假设编译器是如何构建它的。这仍然是非常糟糕的做法,但如果他们添加了一个断言,提醒您手动检查可能可以通过的延迟。

答案 1 :(得分:1)

这取决于编译器和优化级别。要确认结果,只需进入调试模式并检查该段代码的反汇编代码。