Mer*_*lik 2 embedded microcontroller stm32 isr
我有一个程序应该在 MCU(例如 STM32)上定期运行。例如,它应该每 1 毫秒运行一次。如果我编写一个 1ms ISR 并在其中调用我的完整程序,假设它不会超过 1ms,这是一个好方法吗?我可能会遇到什么问题吗?会很精确吗?
通常的答案可能是 ISR 一般应保持在最低限度,并且大部分工作应在“后台循环”中执行。(因为您显然使用传统的“前景-背景”架构,又名“main+ISR”)。
但ARM Cortex-M(例如STM32)经过专门设计,使得ISR可以编写为纯C 函数。在这种情况下,使用 ISR 与使用任何其他 C 代码没有什么不同。这包括易于调试。
此外,ARM Cortex-M 还带有 NVIC(嵌套向量中断控制器)。NVIC 允许您确定中断的优先级,并且它们可以相互抢占。这意味着您可以非常轻松地构建周期性“任务”(ISR)集,这些任务在抢占式、基于优先级的调度程序下运行。有趣的是,这个调度程序(在 NVIC 硬件中实现)满足RMA/RMS(速率单调分析/调度)的所有要求,因此您可以证明系统的可调度性。当然,ISR“任务”不能在内部阻塞,但这对于 RMA/RMS 来说不是必需的。此外,如果在不同优先级运行的 ISR(或 ISR 和后台循环)之间有任何共享资源,则需要通过禁用中断来正确保护资源。
因此,您将 ISR 用作“任务”的想法对我来说很有意义。您的系统将是最佳的,这意味着任何其他方法的效率都会较低。(这包括使用任何类型的 RTOS。)此外,此设计可以是低功耗的,因为您可以使用 main() 中的“后台循环”将 CPU 和外设置于低功耗睡眠模式(WFI 指令、等等)事实上,你可以将“后台循环”视为这个“硬件-RTOS”中的空闲“任务”。
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |