SuperAPI AI 工具集

interrupts-and-exceptions-baremetal

编程与开发

查看项目

更新于 10-15 17:20

技能介绍

用途:指导在 ARM Cortex-M 裸机上处理中断与异常,涵盖 NVIC 配置、ISR 编写规则、异常处理器(HardFault、BusFault)、优先级分组、嵌套、尾链与延迟考量。

适用时机:配置外设 IRQ 优先级;编写不可阻塞的 ISR;使能中断后调试 HardFault;在 ISR 与主循环间共享数据;优化中断延迟。

工作流程:NVIC 接收 IRQ 并比较优先级,自动入栈保存 r0-r3、r12、lr、pc、psr,从向量表跳转到处理器,处理器应短小,退出时出栈返回,若有挂起 IRQ 则尾链。启用优先级示例: NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 0)); NVIC_EnableIRQ(USART2_IRQn); 多数 Cortex-M 上数值越小优先级越高,分组位需查厂商文档。

ISR 规则:不得调用阻塞函数(printf、malloc、长循环);尽量少做事,通过标志或环形缓冲区延后到主循环;按数据手册清中断标志(读清除或写 1 清除)。

关键区:用 __get_PRIMASK / __disable_irq / __set_PRIMASK 保存恢复,或抬高 BASEPRI 只屏蔽低优先级 IRQ。

HardFault 处理:在汇编中用 tst lr,#4 判断 msp/psp 取得栈指针,再跳转 C 函数解析入栈的 r0、pc、psr,并解码 SCB->CFSR、HFSR、BFAR 定位原因。

延迟与尾链:高优先级 IRQ 抢占低优先级;尾链使背靠背 IRQ 跳过出栈/再入栈;M4F/M7 的 FPU 惰性入栈增加延迟;过长的 ISR 会饿死其他 IRQ 与主循环。可用 GPIO 翻转加示波器或 DWT->CYCCNT 测量。

常见问题:IRQ 不触发多因 NVIC 未使能或被屏蔽;重复进入多因标志未清(ORE 需读 DR);ISR 中 HardFault 多因栈溢出;丢字节多因 ISR 太慢,可用环形缓冲区并提高优先级;优先级反转多因关键区过长。

限制:资料针对 Cortex-M 与 CMSIS,其他架构不适用;具体寄存器位与优先级分组需查厂商手册。