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)
在皮质设备中,NOP 实际上没有任何意义。不能保证 NOP 会消耗任何时间。它们仅用于填充。我将有几个连续的 NOP,它们只会从管道中清除。
有关更多信息,请参阅 Cortex-M0 文档。http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/CHDJJGFB.html
在 Cortex 设备中,软件延迟非常棘手,您应该使用其他指令+可能的屏障指令。
使用 ISB 指令 4 个时钟 + 闪存访问时间,这取决于内核运行的速度。为了获得非常精确的延迟,请将这部分代码放入 SRAM 中