我正在开发基于ARM Cortex M3的微控制器上运行的嵌入式项目。我们供应商提供的一些代码使用延迟功能,设置内置硬件定时器,然后旋转直到定时器到期。通常用于等待1到几百微秒。这些延迟几乎是因为他们在等待一些寄存器,芯片或总线来完成一个动作,并且需要等待至少给定的微秒数。硬件计时器的开销似乎至少需要6微秒才能完成设置。ARM嵌入式延迟硬件定时器与CPU周期计数器
在多线程环境中,这是一个问题,因为有N个线程,但只有1个硬件定时器。我可以禁止中断,而定时器正在使用,以防止上下文切换,因此竞争条件,但它似乎有点难看。我想用一个使用ARM CPU周期计数器(CCNT)的函数替换使用硬件定时器的函数。我是否缺少缺陷或其他选择?很明显,周期计数器功能要求将其调整到适当的CPU频率,这对我们的系统来说永远不会改变,但我想可以在使用硬件定时器以编程方式引导时检测到。
哪种ARM M3有单个硬件定时器?你说你有一个多线程环境,所以调度器的计时器是必需的:你是否说你唯一的计时器是分配给调度器的计时器? – LPs
实际上有2个硬件定时器,还有一个系统时钟中断,每隔1毫秒触发一次。系统滴答中断不是一个计时器,你不能查询已经过了多少时间,你只需要每1毫秒获取一次中断,这通常用于通知抢先调度器。 1毫秒的分辨率对于我感兴趣的延迟来说也太长了。 – satur9nine
对于现代MCU来说,忙碌的这么长时间是一个非常糟糕的方法。如果他们使用这样的东西,我会怀疑其余的质量.. – Olaf