STM32 HAL Library简单C编码错误

STM32 HAL Library simple C coding error

我正在将 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,对吗?

从技术上讲是的,尽管根据我使用嵌入式目标编译器的经验,该循环不会得到优化。如果您考虑一下,除非程序员故意这样做,否则拥有无意义的循环并不是您真正会在程序中看到的结构,所以我怀疑许多编译器是否会为此进行优化。

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

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

这取决于编译器和优化级别。确认结果,直接进入debug模式,查看这段代码的反汇编代码即可。