-2

我做了简单的延迟函数:

void Delay(__IO uint32_t nCount)
{
  while(nCount--) {}
}

我想用一些值来预测单次执行的持续时间。我知道这是个坏主意,但我不需要准确的时间,也不会被打断。

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

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

4

2 回答 2

4

所以不要有一个的while循环,你应该放在__no_operation();那里(2个下划线,而不是1个)。这在我的板上以 168MHz 的频率每个指令周期需要大约 29ns,并且它会将内部汇编NOP 直接插入代码流中,因此它可以抵抗任何优化。

最后一点:您的循环计数器是__IO,这意味着它是易变的。这意味着循环计数器不会被放入 CPU 寄存器中。一旦将__no_operation();行放入循环中,您就可以更改它,因为它会保护它不被编译器消除。

您通常应该使用计时器,但有时我们都只需要一个hack-up :)

-杰西

于 2013-09-12T11:40:44.460 回答
2

根据您的编译器和设置,执行该函数所需的时间可能会有很大差异。由于您的函数什么都不做,优化器会将这个函数变成一个简单的 bx lr,这需要很少的时间。如果您能够测量时间,那么您就没有进行优化(并且您对代码的此部分和其他部分的整体执行将更加不同)。

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

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

直接使用其中一个计时器来执行延迟要容易得多,并且准确性提高了很多。防止必须继续维护计数器循环代码和/或对其的调用。

于 2013-08-19T05:44:11.570 回答