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

标签 arm embedded

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

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

最佳答案

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

关于ARM嵌入式延迟硬件计时器与CPU周期计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40599676/

相关文章:

C# 到 C++ 的转换

c - atmega16 串行通信不工作(uart_send 和 uart_receive)

c - 如何使用 PSoC 5LP 芯片的 SPI 写入 SD 卡?

c - ARMv7 汇编函数中查找数组最大元素时出现总线错误

arm - 链接到 libssh 时针对 ARM 进行交叉编译 - libssh.so : file not recognized

arm - 如何解决错误 "Exception in thread "AWT-EventQueue- 0"java.lang.NullPointerException:"?

c - ld : cannot find crt1. o:没有这样的文件或目录

c - 如何从 ELF 文件中提取通过编译器优化添加的常量地址?

c - 在 Tiva C 中按下开关时 LED 闪烁

c - 嵌入式解析器内存使用 XML vs JSON vs?