C 什么';STM32中的s单次操作持续时间

C 什么';STM32中的s单次操作持续时间,c,timer,microcontroller,stm32,stm32f4discovery,C,Timer,Microcontroller,Stm32,Stm32f4discovery,我做了一个简单的延迟函数: void Delay(__IO uint32_t nCount) { while(nCount--) {} } 我想用一些值来预测单次执行的持续时间。我知道这是个坏主意,但我不需要准确的时间,也不会被打断 我正在使用STM32F405@168 MHz和8 MHz外部晶体 到目前为止,我注意到使用0x80 0000调用它会给我大约半秒的延迟。执行该函数所需的时间可能会因编译器和设置的不同而有很大差异。由于您的函数不执行任何操作,因此优化器会将此函数转换为简单的bx

我做了一个简单的延迟函数:

void Delay(__IO uint32_t nCount)
{
  while(nCount--) {}
}
我想用一些值来预测单次执行的持续时间。我知道这是个坏主意,但我不需要准确的时间,也不会被打断

我正在使用STM32F405@168 MHz和8 MHz外部晶体


到目前为止,我注意到使用0x80 0000调用它会给我大约半秒的延迟。

执行该函数所需的时间可能会因编译器和设置的不同而有很大差异。由于您的函数不执行任何操作,因此优化器会将此函数转换为简单的bx lr,这只需要很少的时间。如果您能够测量时间,那么您就没有进行优化(并且您对这一部分和代码的其他部分的总体执行情况会有更大的变化)

假设您以确定性和可重复的方式解决该问题,您可以通过执行它并使用参考时钟对其计时,大致了解执行所需的时间。cortex-m4中的计时器是一个很好的选择

任何时候,当您更改使用此代码的方式、打开缓存、更改处理器时钟、更改闪存上的定时设置等时,都需要重新调整延迟功能

直接使用其中一个计时器执行延迟要容易得多,而且精度也提高了不少。防止必须继续维护计数器循环代码和/或对其进行调用。

因此,不应使用空while循环,而应使用
\uu no\u操作()(2个下划线,而不是1个)。在我的主板上,在168MHz的频率下,每个指令周期大约需要29ns,并且它直接将内部汇编程序插入到代码流中,因此它可以抵抗任何优化

最后一点注意:您的循环计数器是
\uu IO
,这意味着它是不稳定的。这意味着循环计数器不会被放入CPU寄存器中。您可以在放入
\uu no\u操作()后更改该值循环中的行,因为它将保护它不被编译器删除

通常,您应该使用计时器,但有时我们都需要一个破解:)


-杰西

如果你想要计时器,为什么不使用计时器?我不需要计时器。。。。但你在试着计时。我可能不太理解你的问题。你能用你半秒的发现做一个测试吗,但是这次你的编译器设置为产生优化的代码?优化会改变时间。这就是为什么Cortex-M4芯片带有一系列硬件定时器的原因之一。没错!。。。有时候我们只是需要一个快速的黑客。在嵌入式系统中,带有for循环的延迟非常常见。而且我们对它也很习惯。因此,每当我们来到一个新的平台,我们才刚刚开始学习。最好使用循环延迟,而不是使用计时器。