中断的工作流程
扫描二维码
随时随地手机看文章
中断的运行并非 “瞬间完成”,而是遵循一套严谨的硬件与软件协同流程,从 “事件触发” 到 “任务恢复” 可分为五个核心阶段:中断请求、中断响应、现场保护、执行 ISR、现场恢复与返回。每个阶段都有明确的硬件逻辑与软件规则,确保中断处理的正确性与高效性。
(一)中断请求:事件的 “信号传递”
中断流程的起点是 “中断请求(IRQ, Interrupt Request)”—— 当外设或内部模块发生特定事件时(如按键按下导致 GPIO 引脚电平变化、定时器计数达到设定值、串口接收缓冲区有数据),会向 MCU 的 “中断控制器” 发送一个硬件信号(通常是电平信号或脉冲信号),表明 “需要紧急处理”。
不同嵌入式芯片的中断请求机制存在差异,但核心逻辑一致:首先,外设需具备 “中断使能” 开关 —— 只有当外设自身的中断使能位被置 1 时,事件发生才会触发 IRQ(例如,要让串口接收数据触发中断,需先开启串口的 “接收中断使能位”);其次,中断请求需经过 “同步电路”—— 由于外设时钟与 MCU 核心时钟可能不同步(如外设用 32kHz 时钟,核心用 100MHz 时钟),IRQ 信号需经过 1-2 个核心时钟周期的同步,避免 metastability(亚稳态)导致的信号误判;最后,中断请求会被暂存在中断控制器的 “挂起寄存器(Pending Register)” 中,等待 MCU 响应 —— 即使 MCU 暂时无法处理(如正在执行更高优先级任务),IRQ 信号也会被挂起保存,不会丢失。
(二)中断响应:MCU 的 “优先级判断”
当 MCU 接收到中断请求后,并非立即响应,而是先进行 “中断响应条件判断”,核心是 “是否允许中断” 与 “中断优先级是否足够高”。
首先是 “全局中断使能” 判断:MCU 有一个 “全局中断使能位”(如 ARM Cortex-M 系列的 PRIMASK 寄存器),只有当该位为 0 时(全局中断允许),MCU 才会响应中断;若该位为 1(全局中断禁止),则所有可屏蔽中断都会被忽略,仅不可屏蔽中断(NMI)能强制响应 —— 这一机制用于处理 “临界区”(如主程序与 ISR 共享数据时,需禁止中断避免数据混乱)。
其次是 “中断优先级判断”:当多个中断请求同时挂起时,中断控制器会根据预设的 “中断优先级”,选择优先级最高的中断进行响应。嵌入式系统的中断优先级通常分为 “抢占优先级” 与 “子优先级”(如 Cortex-M 的 NVIC 控制器):抢占优先级高的中断可打断正在执行的低抢占优先级 ISR(即 “中断嵌套”);若两个中断的抢占优先级相同,则比较子优先级,子优先级高的先响应;若抢占优先级与子优先级均相同,则按 “中断编号” 的默认顺序响应(如编号小的优先)。例如,“电机过载保护中断”(抢占优先级 1)可打断正在执行的 “按键扫描中断”(抢占优先级 2),而 “串口接收中断” 与 “SPI 接收中断”(均为抢占优先级 2,子优先级 1 与 2)则按子优先级顺序响应。
当满足响应条件时,MCU 会启动 “中断响应序列”:首先,禁止同优先级及更低优先级的中断(防止响应过程中被打断);其次,自动保存 “上下文现场”—— 将当前的程序计数器(PC,记录下一条要执行的指令地址)、程序状态寄存器(PSR,记录 CPU 状态)、通用寄存器(R0-R3 等)的值压入栈(Stack)中,确保后续能准确恢复常规任务;最后,根据 “中断向量表” 找到对应的 ISR 入口地址,将 PC 指向该地址,正式进入 ISR 执行阶段。
(三)现场保护与 ISR 执行:事件的 “核心处理”
尽管 MCU 在中断响应阶段已自动保存部分寄存器(如 R0-R3、PC、PSR),但对于其他通用寄存器(如 R4-R11),若 ISR 中会修改这些寄存器的值,则需要在 ISR 开头手动进行 “现场保护”—— 将这些寄存器的值压入栈中;若 ISR 中不修改,则无需保护,以减少处理延迟。这一环节的核心原则是 “谁修改,谁保护”,避免 ISR 执行后,常规任务的寄存器值被篡改,导致程序运行异常。
中断服务程序(ISR)是中断处理的 “核心逻辑”,其设计直接决定中断处理的效率与可靠性。ISR 的核心要求是 “短小精悍”—— 仅处理与中断事件直接相关的必要操作,避免执行复杂运算、循环或调用耗时函数(如 printf、动态内存分配)。例如,按键中断的 ISR 应仅做 “置位按键标志位” 或 “读取按键值并缓存”,而将 “按键防抖处理”“执行按键对应的功能(如开灯)” 交给主程序;串口接收中断的 ISR 应仅做 “将接收数据存入缓冲区”,而将 “数据解析”“数据处理” 交给主程序。这样设计的原因在于:ISR 执行时间越长,中断延迟与嵌套冲突的风险越高,甚至可能导致低优先级中断被长期阻塞,丢失重要事件。
此外,ISR 中还需注意 “中断清除”—— 部分外设的中断请求会在事件发生后持续有效(如定时器溢出中断),若 ISR 中不手动清除 “中断挂起位”,则 ISR 执行完成后,中断控制器会认为中断请求仍存在,立即再次触发中断,导致 “中断风暴”(ISR 无限循环执行)。中断清除的方式因外设而异:有的需要清除外设自身的中断挂起位(如定时器的 SR 寄存器),有的需要通过读取数据自动清除(如串口接收数据后,读取 DR 寄存器即可清除接收中断挂起位)。
(四)现场恢复与中断返回:任务的 “无缝衔接”
ISR 执行完成后,需要进行 “现场恢复” 与 “中断返回”,确保常规任务能从被暂停的位置继续执行。现场恢复与现场保护相对应:若 ISR 开头手动保护了 R4-R11 等寄存器,则需在 ISR 结尾手动将这些寄存器的值从栈中弹出,恢复原值;若未保护,则无需操作。
中断返回的核心是执行 “中断返回指令”(如 ARM Cortex-M 的 BX LR 指令,x86 的 IRET 指令)。当 MCU 执行该指令时,会自动从栈中弹出之前保存的 PC、PSR、R0-R3 等寄存器的值,恢复 CPU 的状态与程序计数器指向 ——PC 重新指向被中断的常规任务的下一条指令,PSR 恢复中断前的 CPU 状态(如中断屏蔽位、条件标志位),R0-R3 恢复原值。同时,中断控制器会自动清除当前中断的挂起位,并重新允许同优先级及更低优先级的中断(若之前禁止),至此,整个中断流程完成,常规任务无缝衔接继续执行。




