【发布时间】:2016-11-14 23:37:54
【问题描述】:
我正在开发一个在基于 ARM Cortex M3 的微控制器上运行的嵌入式项目。我们的供应商提供的一些代码使用延迟函数来设置内置硬件计时器,然后旋转直到计时器到期。通常,这用于等待 1 到几百微秒。这些延迟几乎是因为它们在某个寄存器、芯片或总线上等待完成一个动作,并且需要等待至少给定的微秒数。硬件计时器的设置似乎也花费了至少 6 微秒的开销。
在多线程环境中,这是一个问题,因为有 N 个线程但只有 1 个硬件计时器。我可以在使用计时器来防止上下文切换和竞争条件时禁用中断,但这似乎有点难看。我正在考虑将使用硬件定时器的函数替换为使用 ARM CPU 周期计数器 (CCNT) 的函数。是否有我遗漏的陷阱或其他选择?显然,循环计数器功能需要将它调整到正确的 CPU 频率,这对于我们的系统来说永远不会改变,但我想可以在启动时使用硬件计时器以编程方式检测到。
【问题讨论】:
-
哪种ARM M3有一个硬件定时器?您是说您有一个多线程环境,因此需要调度程序的计时器:您是说您拥有的唯一计时器是分配给调度程序的计时器吗?
-
实际上有 2 个硬件计时器和一个系统滴答中断,它以 1 毫秒的间隔触发。系统滴答中断不是计时器,您无法查询已经过去了多少时间,您只需每 1 毫秒获得一个中断,用于通知抢占式调度程序。对于我感兴趣的延迟来说,1 毫秒的分辨率也太长了。
-
忙于旋转这么长时间对于现代 MCU 来说是一种非常糟糕的方法。如果他们使用这样的东西,我会怀疑其余的质量..