1. 中断基础概念

中断(Interrupt)是嵌入式系统与计算机体系结构中最核心的异步事件处理机制。它允许硬件在发生特定事件时,暂停当前正在执行的程序,转而执行一个预先定义好的处理程序(Interrupt Service Routine, ISR),处理完成后再恢复原来的执行流。理解中断的本质、与轮询的差异以及在嵌入式系统中的关键作用,是掌握 GICv3 中断控制器架构的基石。

中断触发与处理流程 中断触发与处理流程 主程序执行 (正常指令流) 硬件中断事件 (外设/定时器/IRQ) 中断控制器仲裁 (GIC 优先级/路由) ISR 执行 (中断服务例程) 恢复主程序 (现场恢复/继续执行) 关键点: 中断是异步事件,CPU 无需轮询等待;中断控制器(如 GIC)负责优先级仲裁与路由,确保高优先级中断及时响应。

1.1 中断的定义

中断是一种由硬件或软件触发的信号,它使处理器暂停当前正在执行的指令序列,保存当前上下文(如程序计数器、寄存器状态),然后跳转到一个预先注册的处理函数(ISR)中执行。中断处理完成后,处理器恢复之前保存的上下文,继续执行被中断的程序。

中断的本质特征:

  • 异步性:中断事件的发生与当前正在执行的指令流在时间上无关,CPU 无法预测中断何时到来。
  • 抢占性:中断可以打断正在执行的程序(包括低优先级中断),实现紧急事件的快速响应。
  • 硬件驱动:中断信号通常由外设、定时器、DMA 控制器等硬件模块产生。

1.2 中断与轮询的对比

轮询(Polling)是另一种检测硬件事件的方式:CPU 周期性地检查某个状态寄存器或标志位,判断事件是否发生。中断与轮询在效率、实时性、资源消耗等方面存在显著差异。

中断 vs 轮询:核心对比
对比维度 中断(Interrupt) 轮询(Polling)
CPU 利用率 高:无事时 CPU 可执行其他任务或进入低功耗模式 低:CPU 需要不断检查状态,浪费大量指令周期
响应延迟 低:事件发生时立即通知 CPU,延迟可预测 高:延迟取决于轮询间隔,最坏情况可能错过事件
实时性 强:支持优先级嵌套,适合硬实时系统 弱:无法保证确定性响应,适合非实时场景
功耗 低:CPU 可在空闲时休眠,中断唤醒 高:CPU 必须持续运行轮询循环
实现复杂度 高:需要配置中断控制器、注册 ISR、处理嵌套与共享 低:只需读取状态寄存器,逻辑简单
适用场景 低频率事件、实时响应要求高、多外设并发 高频率事件(如 ADC 连续采样)、简单系统

工程经验:在嵌入式 Linux 或 RTOS 系统中,中断是首选的事件通知机制。轮询通常仅用于以下场景:中断不可用(如早期原型调试)、事件频率极高(中断开销反而更大)、或硬件不支持中断。

中断 vs 轮询 时序对比 中断 vs 轮询 时序对比 轮询方式: 任务 轮询 任务 轮询 任务 轮询 任务 轮询 事件 (错过) 中断方式: 主程序执行 主程序执行 主程序执行 ISR 处理 主程序执行 事件 (立即响应)

1.3 中断在嵌入式系统中的核心作用

在嵌入式系统中,中断机制是系统实时性、低功耗和并发处理能力的基石。以下是中断在嵌入式系统中的几个核心作用:

  • 实时响应:中断允许系统对外部事件(如按键按下、传感器数据就绪、通信数据到达)做出即时响应,满足硬实时系统的时序要求。
  • CPU 效率最大化:CPU 无需浪费指令周期去轮询外设状态,可以将算力集中在主任务上,仅在事件发生时通过中断介入处理。
  • 低功耗管理:在电池供电的 IoT 设备中,CPU 大部分时间处于休眠或低功耗模式,中断作为唤醒源,在事件发生时快速唤醒系统处理。
  • 多外设并发支持:中断控制器(如 GICv3)支持多个中断源,通过优先级和亲和性路由,实现多核 SoC 中不同外设中断的并行处理。
  • 操作系统调度基础:在 Linux、FreeRTOS 等操作系统中,中断是任务调度、时间片轮转、系统调用的底层驱动机制。例如,定时器中断驱动调度器进行上下文切换。

常见误区:中断并非万能。中断服务例程(ISR)应尽量短小精悍,避免在 ISR 中执行耗时操作(如复杂计算、阻塞 I/O)。长时间占用 CPU 会阻塞其他中断,导致系统响应恶化。正确的做法是:ISR 中仅完成必要的数据保存和标志设置,将繁重处理推迟到任务级(Bottom Half / Tasklet / Workqueue)。

中断在嵌入式系统中的核心作用 中断在嵌入式系统中的核心作用 中断机制 (核心调度引擎) 实时响应 μs 级事件处理 CPU 效率 免轮询浪费 低功耗管理 休眠唤醒机制 多外设并发 GIC 优先级路由 中断是嵌入式系统实时性、低功耗、并发处理三大核心需求的统一解决方案。

1.4 中断处理的基本流程

一个完整的中断处理流程通常包含以下步骤,这些步骤在 GICv3 架构中由硬件和软件协同完成:

  1. 中断产生:外设或内部模块(如定时器、DMA)检测到事件,向中断控制器(GIC)发送中断请求信号。
  2. 中断仲裁与路由:GIC 根据中断优先级、目标 CPU 亲和性配置,选择最合适的中断转发给指定的 CPU 核心。
  3. CPU 响应:CPU 核心接收到中断信号后,保存当前上下文(PC、PSR、寄存器等),跳转到中断向量表(Vector Table)中对应的入口地址。
  4. 中断服务例程执行:执行注册的 ISR,完成必要的硬件操作(如读取数据、清除中断标志)。
  5. 中断结束与恢复:ISR 执行完毕后,CPU 恢复之前保存的上下文,继续执行被中断的程序。

GICv3 中的关键硬件加速:在 GICv3 架构中,中断仲裁、优先级分组、中断屏蔽、以及中断结束(EOI)等操作均由硬件高效完成,软件仅需通过 MMIO 寄存器与 GIC 交互,极大降低了中断延迟。

中断处理基本流程 中断处理基本流程 ① 中断产生 外设/定时器 ② 仲裁与路由 GIC 控制器 ③ CPU 响应 保存上下文 ④ ISR 执行 服务例程 ⑤ 恢复 继续执行 流程说明: 1. 外设产生中断请求(如 UART 接收数据) 2. GIC 根据优先级和亲和性选择目标 CPU 3. CPU 自动保存上下文并跳转到中断向量 4. ISR 处理事件,完成后执行 EOI(End Of Interrupt)

1.5 中断分类

在嵌入式系统中,中断可以从多个维度进行分类。理解这些分类有助于后续学习 GICv3 的中断类型(SPI、PPI、SGI、LPI)。

中断分类维度
分类维度 类型 说明 GICv3 对应
触发方式 电平触发 (Level-triggered) 中断信号保持有效电平直到被清除 支持电平与边沿配置
边沿触发 (Edge-triggered) 中断信号在电平跳变时触发 支持上升沿/下降沿
中断源 硬件中断 由外设、定时器、DMA 等硬件产生 SPI, PPI, LPI
软件中断 由软件通过写寄存器触发 SGI (Software Generated Interrupt)
可屏蔽性 可屏蔽中断 可通过 CPU 的 PSTATE 或 GIC 寄存器屏蔽 绝大多数中断
不可屏蔽中断 (NMI) 无法被屏蔽,用于致命错误 GICv3 支持 NMI 扩展
目标范围 私有外设中断 (PPI) 仅发送给指定 CPU 核心 每个 CPU 独立
共享外设中断 (SPI) 可路由到任意 CPU 核心 全局共享