
短文标题异常与中断系统异常是“内忧”外设中断是“外患”你有没有想过一个问题复位和串口中断都叫“中断”它们有什么不同复位是“系统异常”内忧串口中断是“外设中断”外患。Cortex-M把所有能打断CPU正常运行的事件统称为异常分为两类系统异常内核的“紧急事件”系统异常由CPU内核自身产生优先级大多固定外设中断通过NVIC管理外设中断由片内外设产生通过NVIC管理抢占优先级决定能否嵌套子优先级决定同时到达时的顺序优先级分组决定4个优先级位的分配外设中断需要软件配置优先级和使能系统异常部分固定、部分可配置。中断响应流程硬件自动完成外设产生中断请求NVIC裁决优先级判断是否嵌套硬件自动压栈8个寄存器PC、xPSR、R0-R3、R12、LR32字节从向量表取ISR地址向量表在Flash起始0x08000000跳转执行ISRISR返回硬件自动出栈恢复现场压栈、取址、出栈都由硬件完成不依赖软件——这是Cortex-M中断响应快的核心原因。向量表及VTOR重定位向量表默认在Flash起始地址0x08000000第一个字是栈顶地址__initial_sp第二个字是复位向量。通过SCB-VTOR寄存器可将向量表重定位到RAMSCB-VTOR 0x20000000; // 搬移到RAM起始用途Bootloader跳转APP前需重设VTOR否则APP的中断向量指向Bootloader区运行时动态修改中断函数指针热补丁尾链优化连续中断更快中断A未退出中断B已挂起。传统架构出栈A→压栈B→执行B耗时长。Cortex-M尾链跳过A的出栈和B的压栈直接执行B连续响应仅6个时钟周期。这个故事的启示系统异常管“内忧”复位、故障外设中断管“外患”串口、定时器。它们都通过向量表、NVIC、硬件压栈构成统一的中断响应机制。写在最后异常和中断是同一种机制的不同来源。系统异常来自内核外设中断来自外设。前者保系统不死后者让外设干活。本文灵感源于于振南《新概念ARM32单片机》教程第5.4节、第5.5节、第5.8节。觉得有用点赞、转发让更多人看懂异常和中断的区分。