ARM嵌入式延迟硬件定时器vs CPU周期计数器

sat*_*ine 3 embedded arm

我正在研究一个在基于ARM Cortex M3的微控制器上运行的嵌入式项目.我们的供应商提供的一些代码使用延迟功能来设置内置硬件定时器,然后旋转直到定时器到期.通常,这用于等待1到几百微秒.这些延迟几乎是因为它们正在等待一些寄存器,芯片或总线完成一个动作,并且需要至少等待给定的微秒数.硬件计时器的设置开销似乎也至少需要6微秒.

在多线程环境中,这是一个问题,因为有N个线程但只有1个硬件计时器.我可以在使用定时器时禁用中断,以防止上下文切换,从而防止竞争条件但看起来有点难看.我正在考虑将使用硬件定时器的功能替换为使用ARM CPU循环计数器(CCNT)的功能.是否存在我缺少的陷阱或其他替代方案?显然,循环计数器功能需要调整到适当的CPU频率,这对于我们的系统永远不会改变,但我想可以使用硬件定时器以编程方式在启动时检测到.

kkr*_*mbo 6

在启动时设置计时器一次,让计数器连续运行.如果要开始延迟,请读取计数器值并记住此起始值.然后在延迟循环中再次读取计数器值并循环,直到计数器值减去起始值大于或等于所请求的延迟滴答.(如果你正确地进行减法,那么翻转就会被淘汰,你不需要特殊处理来检查它们.)

  • 作为一个例子,请参阅Raymond Chen的文章:[使用模运算来避免计时溢出问题](https://blogs.msdn.microsoft.com/oldnewthing/20050531-22/?p=35493).使用无符号类型,数学运算正常. (2认同)