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)可能是更好的选择。
中断处理完整流程 主程序执行 (用户代码/内核代码) 中断事件发生 (硬件信号触发) 中断控制器仲裁 (GIC优先级/路由决策) CPU响应中断 (保存上下文/跳转ISR) ISR执行 (中断服务例程) 恢复主程序 (恢复上下文/继续执行) 关键步骤说明 ① 主程序正常执行 ② 硬件中断信号到达 ③ GIC仲裁并转发给CPU ④ CPU保存现场并跳转ISR ⑤ ISR处理完成后恢复现场 中断分类体系 中断 (Interrupt) 同步中断(异常) 异步中断(硬件中断) 按可屏蔽性分类 故障 (Fault) 陷阱 (Trap) 中止 (Abort) 可屏蔽中断 (IRQ) 不可屏蔽中断 (FIQ/NMI) 可屏蔽中断 不可屏蔽中断 (NMI)

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尽可能短小精悍。