【CortexM】咬尾中断
一、咬尾中断
咬尾中断是 Cortex-M 处理器中由 NVIC (嵌套向量中断控制器) 实现的一种高效中断处理机制,允许在一个中断服务程序 (ISR) 执行完毕后立即处理下一个挂起的中断,无需执行完整的出栈和再次入栈操作,从而显著减少中断切换延迟。
二、工作原理
1. 常规中断处理流程
- 入栈:硬件自动保存 8 个关键寄存器 (XPSR, PC, LR, R12, R3-R0) 到堆栈
- 取向量:从向量表获取 ISR 入口地址
- 执行 ISR:处理中断服务
- 出栈:恢复之前保存的寄存器
- 返回:回到被中断的程序
2. 咬尾中断工作流程
当一个中断 (ISR1) 执行完毕且存在挂起的另一中断 (ISR2) 时:
- 跳过出栈:不执行 ISR1 的寄存器出栈操作
- 直接跳转:NVIC 强制 CPU 直接跳转到 ISR2 的入口
- 复用栈帧:ISR2 直接使用 ISR1 已经压入栈中的寄存器值
- 执行 ISR2:处理完后,执行一次统一的出栈返回
三、触发条件
咬尾中断在以下两种情况下触发:
- 连续中断处理:当一个中断处理完毕后,立即有另一个优先级不高于当前中断的中断处于挂起状态
- 中断嵌套后的返回:在高优先级中断 (ISR2) 抢占低优先级中断 (ISR1) 后,ISR2 执行完毕返回时,会以咬尾方式直接执行被挂起的 ISR1,而无需先完全返回主程序再重新响应 ISR1
性能优势
连续中断间延迟 | 约 30 个时钟周期 | 仅 6 个时钟周期 | 减少约 80% |
中断响应时间 | 12 个时钟周期 | 12 个时钟周期 (首次) | 首次响应不变 |
堆栈操作 | 两次完整压栈 / 出栈 | 一次压栈、一次出栈 | 减少 50% 堆栈操作 |
实际应用延迟 | 基准值 | 降低约 70% | 显著提升实时性能 |
原理:通过省略一次完整的 8 个寄存器压栈 / 出栈操作(共 16 次内存访问),节省大量 CPU 时间,特别适合处理密集中断的实时系统。
CortexM 文章被收录于专栏
cortexm相关