1. 中断控制器基础概念
1.1 什么是中断控制器
中断控制器(Interrupt Controller)是 SoC 内部一个关键的硬件模块,负责管理来自多个外设的中断请求,并按优先级、使能状态和触发条件,将中断信号路由到 CPU 核心。它相当于中断系统的“交通指挥中心”,协调外设与 CPU 之间的异步事件通信。
核心定义:中断控制器是一个可编程硬件单元,它收集、仲裁、屏蔽和分发中断信号,使 CPU 能够高效响应外部或内部事件,而无需持续轮询外设状态。
1.2 中断控制器在 SoC 中的作用与地位
在嵌入式系统中,中断控制器是 CPU 与外设之间的关键桥梁。没有中断控制器,CPU 将不得不采用轮询方式检查每个外设的状态,导致严重的性能浪费。下表总结了中断控制器的核心作用:
| 作用维度 | 具体功能 | 对系统的影响 |
|---|---|---|
| 中断收集 | 接收来自多个外设(UART、I2C、GPIO、定时器等)的中断请求线 | 将分散的中断源统一管理,减少 CPU 引脚占用 |
| 优先级仲裁 | 根据预设优先级决定哪个中断先被处理 | 保证高实时性任务(如定时器、紧急错误)优先响应 |
| 中断屏蔽 | 允许软件单独启用或禁用某个中断源 | 实现临界区保护,避免不必要的中断干扰 |
| 中断分发 | 将中断信号路由到指定的 CPU 核心(多核系统) | 支持 SMP 系统中的负载均衡和亲和性调度 |
| 中断类型转换 | 支持电平触发、边沿触发、脉冲触发等多种模式 | 适配不同外设的中断信号特性 |
1.3 典型中断处理流程
一个完整的中断处理流程涉及外设、中断控制器和 CPU 三个角色。下图展示了从外设触发中断到 CPU 执行中断服务例程(ISR)的典型路径:
1.4 常见中断控制器类型
不同架构和厂商的 SoC 采用不同类型的中断控制器。下表对比了嵌入式领域最常见的几种中断控制器:
| 类型 | 全称 | 典型架构 | 特点 |
|---|---|---|---|
| GIC | Generic Interrupt Controller | ARM Cortex-A 系列 | 支持多核分发、SPI/PPI/SGI 三种中断类型、安全扩展 |
| NVIC | Nested Vectored Interrupt Controller | ARM Cortex-M 系列 | 硬件中断嵌套、向量化中断、低延迟(~12 个时钟周期) |
| PLIC | Platform-Level Interrupt Controller | RISC-V | 可扩展、支持大量中断源、软件可配置优先级 |
| PIC | Programmable Interrupt Controller | x86 / 旧式 SoC | 经典 8259A 架构、级联支持、固定优先级 |
| INTC | Interrupt Controller(厂商自定义) | NXP / TI / STM32 等 | 厂商定制、通常集成在 SoC 内部、功能因芯片而异 |
1.5 中断控制器在设备树中的角色
在设备树(Device Tree)中,中断控制器通过特定的节点和属性来描述。Linux 内核在启动时解析这些描述,建立中断映射关系,使驱动能够正确注册和响应中断。设备树中与中断控制器相关的核心概念包括:
- interrupt-controller 属性:标记节点为中断控制器,表明该节点可以接收和分发中断。
- #interrupt-cells 属性:定义中断描述符所需的单元数(如 1、2 或 3 个 cell)。
- interrupt-parent 属性:指定外设节点连接到哪个中断控制器。
- interrupts 属性:描述外设的中断请求参数(中断号、触发类型等)。
- interrupt-map 属性:用于中断控制器的级联或路由映射。
学习提示:理解中断控制器的基础概念是掌握 DTS 中断节点定义的前提。后续章节将深入讲解每个属性的语法规则、cell 编码方式以及实际案例。建议先熟悉本节的 SoC 级中断架构图,建立整体认知。
1.6 中断控制器在 SoC 中的位置
下图展示了中断控制器在典型 SoC 架构中的位置及其与各模块的连接关系:
常见误解:初学者常认为中断控制器只负责“转发”中断信号。实际上,现代中断控制器(如 GICv3)还承担中断虚拟化、安全状态隔离、消息信号中断(MSI)转换等高级功能。在设备树中描述这些功能时,需要额外的属性和 cell 配置。
1.7 中断控制器与设备树的映射关系
在设备树中,中断控制器节点与硬件中断控制器一一对应。每个外设节点通过 interrupt-parent 和 interrupts 属性描述其中断连接。这种映射关系可以概括为:
- 硬件层:外设 → 中断请求线 → 中断控制器 → CPU
- 软件层(DTS):外设节点 → interrupts 属性 → interrupt-parent → 中断控制器节点
这种分层映射使得 Linux 内核可以在不修改驱动代码的情况下,通过设备树适配不同 SoC 的中断拓扑结构,这也是设备树设计的核心优势之一。