为n个cpu周期添加延迟/什么都不做的最佳方法

meg*_*gle 5 c embedded arm stm32 stm32f0

我需要在n个CPU周期的代码中添加一个延迟(~30).我目前的解决方案是下面的解决方案,但有效但不是很优雅.

此外,必须在编译时知道延迟.我可以使用它,但如果我可以在运行时更改延迟,那将是理想的.(如果有一些开销可以,但我需要1个周期的分辨率.)

我没有任何外围定时器,我可以使用,所以它需要是一个软件解决方案.

do_something();
#define NUMBER_OF_NOPS   (SOME_DELAY + 3)
#include "nops.h"
#undef NUMBER_OF_NOPS
do_the_next_thing();
Run Code Online (Sandbox Code Playgroud)

nops.h:

#if NUMBER_OF_NOPS > 0
    __ASM volatile ("nop");
#endif
#if NUMBER_OF_NOPS > 1
    __ASM volatile ("nop");
#endif
#if NUMBER_OF_NOPS > 2
    __ASM volatile ("nop");
#endif
...
Run Code Online (Sandbox Code Playgroud)

P__*_*J__ 1

在皮质设备中,NOP 实际上没有任何意义。不能保证 NOP 会消耗任何时间。它们仅用于填充。我将有几个连续的 NOP,它们只会从管道中清除。

有关更多信息,请参阅 Cortex-M0 文档。http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/CHDJJGFB.html

在 Cortex 设备中,软件延迟非常棘手,您应该使用其他指令+可能的屏障指令。

使用 ISB 指令 4 个时钟 + 闪存访问时间,这取决于内核运行的速度。为了获得非常精确的延迟,请将这部分代码放入 SRAM 中

  • @berendi 恐怕,在有如此强烈的意见之前,你应该阅读更多有关 Cortex 核心的内容。最好的来源是 ATM 网站。即使M0核心也实现了多级流水线,从程序员的角度来看,你无法预测有多少NOP被丢弃,除非你使用ISB指令。但如果你比 ARM 更了解 - 当然可以,但我更愿意相信官方文档。Cortex 内核与 AVR 或 '51 uC 不同 (3认同)