我正在开发一个在基于 ARM Cortex M3 的微 Controller 上运行的嵌入式项目。我们的供应商提供的一些代码使用延迟函数来设置内置硬件计时器,然后旋转直到计时器到期。通常,这用于等待 1 到几百微秒。这些延迟几乎是因为它们在某个寄存器、芯片或总线上等待完成一个 Action ,并且需要等待至少给定的微秒数。硬件计时器的设置似乎也花费了至少 6 微秒的开销。
在多线程环境中这是一个问题,因为有 N 个线程但只有 1 个硬件计时器。我可以在使用计时器来防止上下文切换和竞争条件时禁用中断,但这似乎有点难看。我正在考虑将使用硬件定时器的函数替换为使用 ARM CPU 周期计数器 (CCNT) 的函数。是否有我遗漏的陷阱或其他替代方案?显然,循环计数器功能需要将它调整到正确的 CPU 频率,这对于我们的系统来说永远不会改变,但我想可以在启动时使用硬件计时器以编程方式检测到。
最佳答案
在启动时设置一次计时器,让计数器连续运行。当您想开始延迟时,请读取计数器值并记住此起始值。然后在延迟循环中再次读取计数器值并循环,直到计数器值减去起始值大于或等于请求的延迟滴答声。 (如果你正确地做减法,那么翻转就会被洗掉,你不需要特殊的处理来检查它们。)
关于ARM嵌入式延迟硬件计时器与CPU周期计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40599676/