1. 中断基础概念
中断(Interrupt)是嵌入式系统与计算机体系结构中最核心的异步事件处理机制。它允许硬件在发生特定事件时,暂停当前正在执行的程序,转而执行一个预先定义好的处理程序(Interrupt Service Routine, ISR),处理完成后再恢复原来的执行流。理解中断的本质、与轮询的差异以及在嵌入式系统中的关键作用,是掌握 GICv3 中断控制器架构的基石。
1.1 中断的定义
中断是一种由硬件或软件触发的信号,它使处理器暂停当前正在执行的指令序列,保存当前上下文(如程序计数器、寄存器状态),然后跳转到一个预先注册的处理函数(ISR)中执行。中断处理完成后,处理器恢复之前保存的上下文,继续执行被中断的程序。
中断的本质特征:
- 异步性:中断事件的发生与当前正在执行的指令流在时间上无关,CPU 无法预测中断何时到来。
- 抢占性:中断可以打断正在执行的程序(包括低优先级中断),实现紧急事件的快速响应。
- 硬件驱动:中断信号通常由外设、定时器、DMA 控制器等硬件模块产生。
1.2 中断与轮询的对比
轮询(Polling)是另一种检测硬件事件的方式:CPU 周期性地检查某个状态寄存器或标志位,判断事件是否发生。中断与轮询在效率、实时性、资源消耗等方面存在显著差异。
| 对比维度 | 中断(Interrupt) | 轮询(Polling) |
|---|---|---|
| CPU 利用率 | 高:无事时 CPU 可执行其他任务或进入低功耗模式 | 低:CPU 需要不断检查状态,浪费大量指令周期 |
| 响应延迟 | 低:事件发生时立即通知 CPU,延迟可预测 | 高:延迟取决于轮询间隔,最坏情况可能错过事件 |
| 实时性 | 强:支持优先级嵌套,适合硬实时系统 | 弱:无法保证确定性响应,适合非实时场景 |
| 功耗 | 低:CPU 可在空闲时休眠,中断唤醒 | 高:CPU 必须持续运行轮询循环 |
| 实现复杂度 | 高:需要配置中断控制器、注册 ISR、处理嵌套与共享 | 低:只需读取状态寄存器,逻辑简单 |
| 适用场景 | 低频率事件、实时响应要求高、多外设并发 | 高频率事件(如 ADC 连续采样)、简单系统 |
工程经验:在嵌入式 Linux 或 RTOS 系统中,中断是首选的事件通知机制。轮询通常仅用于以下场景:中断不可用(如早期原型调试)、事件频率极高(中断开销反而更大)、或硬件不支持中断。
1.3 中断在嵌入式系统中的核心作用
在嵌入式系统中,中断机制是系统实时性、低功耗和并发处理能力的基石。以下是中断在嵌入式系统中的几个核心作用:
- 实时响应:中断允许系统对外部事件(如按键按下、传感器数据就绪、通信数据到达)做出即时响应,满足硬实时系统的时序要求。
- CPU 效率最大化:CPU 无需浪费指令周期去轮询外设状态,可以将算力集中在主任务上,仅在事件发生时通过中断介入处理。
- 低功耗管理:在电池供电的 IoT 设备中,CPU 大部分时间处于休眠或低功耗模式,中断作为唤醒源,在事件发生时快速唤醒系统处理。
- 多外设并发支持:中断控制器(如 GICv3)支持多个中断源,通过优先级和亲和性路由,实现多核 SoC 中不同外设中断的并行处理。
- 操作系统调度基础:在 Linux、FreeRTOS 等操作系统中,中断是任务调度、时间片轮转、系统调用的底层驱动机制。例如,定时器中断驱动调度器进行上下文切换。
常见误区:中断并非万能。中断服务例程(ISR)应尽量短小精悍,避免在 ISR 中执行耗时操作(如复杂计算、阻塞 I/O)。长时间占用 CPU 会阻塞其他中断,导致系统响应恶化。正确的做法是:ISR 中仅完成必要的数据保存和标志设置,将繁重处理推迟到任务级(Bottom Half / Tasklet / Workqueue)。
1.4 中断处理的基本流程
一个完整的中断处理流程通常包含以下步骤,这些步骤在 GICv3 架构中由硬件和软件协同完成:
- 中断产生:外设或内部模块(如定时器、DMA)检测到事件,向中断控制器(GIC)发送中断请求信号。
- 中断仲裁与路由:GIC 根据中断优先级、目标 CPU 亲和性配置,选择最合适的中断转发给指定的 CPU 核心。
- CPU 响应:CPU 核心接收到中断信号后,保存当前上下文(PC、PSR、寄存器等),跳转到中断向量表(Vector Table)中对应的入口地址。
- 中断服务例程执行:执行注册的 ISR,完成必要的硬件操作(如读取数据、清除中断标志)。
- 中断结束与恢复:ISR 执行完毕后,CPU 恢复之前保存的上下文,继续执行被中断的程序。
GICv3 中的关键硬件加速:在 GICv3 架构中,中断仲裁、优先级分组、中断屏蔽、以及中断结束(EOI)等操作均由硬件高效完成,软件仅需通过 MMIO 寄存器与 GIC 交互,极大降低了中断延迟。
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 核心 | 全局共享 |