对复杂应用的需求不断增加,多核设备越来越流行是一个明显的趋势。众所周知,“如果我们开发它,就会进行调试”。但是,当应用程序非常复杂时,您如何捕获随机中断或控制中断处理?在本文中,我将讨论如何处理这些随机中断,并提供一些有关在开发基于 Arm 的应用程序时可能有用的工具的指导。
中断基础
在嵌入式系统中,使用中断是一种处理本质上与系统上运行的软件不同步的外部事件的方法。例如,检测按钮被按下。通常,当中断事件发生时,内核会立即停止执行它正在运行的代码,并开始执行中断服务程序或 ISR。
当中断服务代码完成对外部事件做出反应所需的操作后,处理器应从 ISR 开始运行时正在执行的指令之后的指令恢复。如果操作得当,主应用程序代码甚至不应该“意识到”任何事情发生了变化。它只是在中断服务例程运行时暂停了一段时间。
处理中断后恢复机器状态很重要——这包括处理器寄存器和处理器状态寄存器的值。这使得可以在处理中断的代码执行后继续执行原始代码。
专业的编译器支持在 C/C++ 中编写中断、软件中断和快速中断的语法。对于每种中断类型,都可以编写中断例程,但语法和处理将取决于 MCU 实现。例如,当 Arm 定义 Cortex A、R 和 M 的 Cortex 变体时,他们还为这些系列中的每一个定义了中断处理硬件和机制。在 Arm 7、Arm 9 等以前的芯片中,中断控制器的设计和操作因芯片供应商而异,因此难以移植。
然而,现代商业工具链将考虑这些差异,并在您的代码中尽可能透明地实现中断支持,而不管底层中断硬件和中断管理机制如何。
一个很好理解和经常讨论的做法是中断代码应该尽可能短。这确保了 CPU 可以及时返回主任务。中断服务程序应该只执行关键代码,其余的任务可以通过设置一个标志变量被降级到主进程。如果您从中断服务