1. 中断基础概念
1.1 中断的定义
中断(Interrupt)是一种硬件或软件触发的机制,用于通知处理器发生了需要立即关注的事件。当中断发生时,处理器会暂停当前正在执行的程序,保存其上下文(寄存器、程序计数器等),然后跳转到一个预先定义的中断服务例程(Interrupt Service Routine, ISR)去处理该事件。处理完成后,处理器恢复被中断程序的上下文,继续执行。
核心定义:中断是处理器与外部设备或内部异常之间的一种异步通信机制,它允许处理器在等待事件时执行其他任务,从而大幅提高系统效率。
1.2 中断的作用
中断机制是现代操作系统和嵌入式系统的基石,其主要作用体现在以下几个方面:
- 提高CPU利用率:避免CPU轮询等待,让CPU在设备未就绪时执行其他任务。
- 实时响应:对外部事件(如按键、网络数据到达)做出快速响应,满足实时性要求。
- 多任务支持:通过定时器中断实现时间片轮转,支撑操作系统多任务调度。
- 错误处理:捕获硬件故障(如除零、内存访问越界)并执行恢复或记录。
- 电源管理:在嵌入式系统中,中断可唤醒休眠状态的CPU,降低功耗。
1.3 中断的分类
中断可以从多个维度进行分类,理解这些分类有助于正确配置中断控制器和编写中断服务程序。
1.3.1 同步中断 vs 异步中断
| 特性 | 同步中断(异常) | 异步中断(硬件中断) |
|---|---|---|
| 触发源 | CPU内部指令执行产生 | 外部设备或硬件信号 |
| 触发时机 | 指令执行过程中,可预测 | 任意时刻,不可预测 |
| 典型例子 | 除零异常、缺页异常、系统调用(trap) | 定时器中断、UART接收中断、GPIO中断 |
| 处理方式 | 通常与当前进程上下文相关 | 与当前进程上下文无关 |
| 可重入性 | 通常不可重入 | 可设计为可重入 |
1.3.2 可屏蔽中断 vs 不可屏蔽中断
| 特性 | 可屏蔽中断(Maskable Interrupt) | 不可屏蔽中断(Non-Maskable Interrupt, NMI) |
|---|---|---|
| 屏蔽能力 | 可通过CPU的中断标志位或中断控制器屏蔽 | 无法被软件屏蔽,必须立即处理 |
| 优先级 | 可配置优先级,受中断控制器管理 | 最高优先级,通常用于紧急事件 |
| 典型用途 | 普通外设中断(键盘、鼠标、网络) | 硬件故障(电源掉电、内存ECC错误、看门狗) |
| GIC中的对应 | PPI、SPI、LPI(可配置为可屏蔽) | 通常映射到FIQ或特定NMI线 |
实践提示:在ARM GIC(Generic Interrupt Controller)中,NMI通常通过FIQ(Fast Interrupt Request)线实现,或者通过配置中断为"安全中断"并设置最高优先级来模拟NMI行为。
1.4 中断与轮询的对比
轮询(Polling)是中断出现之前最常用的I/O处理方式。下表从多个维度对比两种机制:
| 对比维度 | 中断驱动 | 轮询方式 |
|---|---|---|
| CPU利用率 | 高——CPU只在事件发生时被占用 | 低——CPU持续检查状态,浪费周期 |
| 响应延迟 | 低——事件发生后立即响应(微秒级) | 取决于轮询间隔,通常较高 |
| 实现复杂度 | 高——需要中断控制器配置、ISR编写、上下文保存 | 低——简单的循环检查状态寄存器 |
| 适用场景 | 事件频率低、实时性要求高、多任务系统 | 事件频率极高、硬件简单、单任务裸机系统 |
| 功耗 | 低——CPU可进入休眠,中断唤醒 | 高——CPU持续运行,无法休眠 |
| 可扩展性 | 好——支持大量设备共享CPU | 差——设备增多时轮询周期变长 |
设计权衡:对于极高频率的事件(如每秒百万次的数据采样),中断可能因频繁的上下文切换导致系统性能下降,此时轮询或中断节流(Interrupt Throttling)可能是更好的选择。
1.5 中断处理的关键指标
在嵌入式系统和操作系统设计中,以下指标用于衡量中断系统的性能:
- 中断延迟(Interrupt Latency):从硬件中断信号产生到CPU开始执行第一条ISR指令的时间。典型值在几十纳秒到几微秒之间。
- 中断吞吐量(Interrupt Throughput):单位时间内系统能处理的中断数量。受中断控制器带宽和ISR执行时间影响。
- 中断嵌套深度(Nesting Depth):允许高优先级中断打断低优先级ISR的层数。GIC支持无限嵌套,但受栈空间限制。
- 上下文切换开销(Context Switch Overhead):保存和恢复CPU寄存器所需的时间。ARM Cortex-A系列通常需要保存16~32个寄存器。
工程经验:在实时操作系统(RTOS)中,中断延迟通常要求小于100μs。对于GIC配置,合理设置优先级分组和抢占策略是控制延迟的关键。建议将时间敏感的中断(如定时器)配置为最高优先级,并保持ISR尽可能短小精悍。