中断概念与处理流程

原始 Flomo:https://v.flomoapp.com/mine/?memo_id=MTMwNzYxMjU1

1. 什么是中断?

中断(Interrupt)是处理器执行当前程序时,因外部设备、内部硬件事件或软件异常而转入特定处理流程的机制。它让 CPU 不必持续轮询每个设备,而能在事件发生时响应。

需要区分三个相关概念:

  • 中断(Interrupt):通常指异步事件,例如定时器溢出、UART 接收完成、GPIO 边沿。
  • 异常(Exception):处理器执行过程中同步或近同步产生的事件,例如非法指令、除零、内存访问错误;不同架构对异常/中断的术语边界不同。
  • 软件中断/系统调用:由指令主动触发的同步入口,常用于系统服务请求,并非外部设备随机发出的信号。

2. 中断处理的完整流程

  1. 外设或内部模块产生中断请求,并设置状态标志。
  2. 中断控制器根据使能、屏蔽、优先级和当前处理状态决定是否递交 CPU。
  3. CPU 在满足架构规定的边界响应请求,保存必要返回状态并取得异常/中断入口。
  4. 入口代码(可能是硬件自动完成,也可能由汇编桩补充)保存需要保护的寄存器。
  5. ISR 读取状态、确认中断源、清除或处理请求,并完成最短必要工作。
  6. 若有耗时工作,ISR 将数据放入队列/环形缓冲区或发送事件,由任务/线程继续处理。
  7. ISR 恢复现场并执行异常返回指令,处理器恢复被打断的执行流。
flowchart TD
  A[外设事件发生] --> B[设置中断请求/状态位]
  B --> C[中断控制器检查使能与优先级]
  C --> D{CPU是否可响应}
  D -->|否| E[保持Pending等待]
  E --> C
  D -->|是| F[硬件异常入口与部分现场保存]
  F --> G[入口代码保存其余现场]
  G --> H[ISR确认来源并清标志]
  H --> I[记录数据/发送事件]
  I --> J[恢复现场]
  J --> K[异常返回并恢复原执行流]

3. 如何保护现场并恢复状态?

“现场”是指被中断程序继续正确执行所需的处理器状态,通常包括程序计数器/返回地址、状态寄存器、栈指针,以及 ISR 会修改且调用约定要求保护的通用寄存器。

保护方式取决于 CPU 架构和 ABI:

  • 有些处理器硬件自动压入部分状态;另一些需要入口汇编软件保存。
  • 编译器生成的 ISR 通常按工具链 ABI 自动保存必要寄存器,但必须使用正确的中断声明/属性。
  • Cortex-M 异常入口通常自动压入基础异常栈帧(R0-R3、R12、LR、PC、xPSR);使用 FPU、延迟压栈、TrustZone 或不同异常栈配置时,栈帧会更复杂。
  • 嵌套中断会形成多层现场,必须遵守优先级和栈空间预算。

不要在普通 C 函数里手工模拟 ISR 的压栈/出栈。 应使用目标架构启动文件、编译器中断属性和芯片厂商提供的异常入口机制。

4. 中断优先级、屏蔽与嵌套有什么作用?

优先级用于决定多个待处理请求的服务顺序,以及一个中断是否能抢占当前 ISR。屏蔽用于在临界区或资源状态不允许时暂时阻止某些中断响应。嵌套允许高优先级事件打断低优先级 ISR,但会增加栈深度、共享数据竞争和最坏响应时间。

设计时应回答:

  • 哪些中断必须有硬实时响应?
  • ISR 最坏执行时间是多少?
  • 是否允许嵌套,最大嵌套深度是多少?
  • 哪些共享数据需要原子访问或临界区保护?
  • 中断风暴、优先级反转或长时间关中断如何检测?

5. 为什么 ISR 应尽量短?

ISR 过长会延迟其他中断和任务,增加中断延迟、抖动和丢数据风险。ISR 中通常只做:读取必要寄存器、清除中断源、搬运少量数据、更新时间戳、投递队列/信号量。复杂协议解析、日志输出、等待资源和阻塞操作应放到任务上下文。

6. 工程验证清单

  • 确认中断向量表地址、入口符号和链接脚本布局正确。
  • 确认中断源使能、优先级、屏蔽位和清标志顺序正确。
  • 测量 ISR 最坏执行时间、响应延迟、嵌套深度和栈使用量。
  • 验证高负载下是否丢中断、丢数据或出现重复触发。
  • 检查 ISR 与任务共享数据的原子性、volatile 使用边界及同步机制。
  • 对 Cortex-M 故障,结合堆栈帧、CFSR/HFSR 和 ELF/map 文件定位,而不是只看 HardFault_Handler 停在哪里。

相关专题