3. 中断控制器基础:中断向量、中断优先级、中断嵌套、中断控制器架构
中断控制器是嵌入式系统响应外部和内部异步事件的核心硬件单元。在 VxWorks BSP 中,中断控制器的初始化与配置直接决定了系统的实时响应能力。本节将系统梳理中断控制器的核心概念与典型架构,为后续时钟定时器与中断服务程序(ISR)的编写奠定基础。
3.1 中断向量与中断向量表
中断向量是每个中断源对应的唯一标识符,通常为一个整数索引。CPU 在响应中断时,通过中断向量在中断向量表(IVT)中查找对应的中断服务程序入口地址。
| 概念 | 说明 | 典型值/范围 |
|---|---|---|
| 中断向量号 | 硬件中断源映射的数字编号 | 0–255(x86 PIC 模式) |
| 中断向量表基址 | IVT 在内存中的起始物理地址 | 0x0000 0000(x86实模式) |
| 向量表项大小 | 每个表项占用的字节数 | 4 字节(实模式)/ 8 字节(保护模式) |
| VxWorks 中断连接 | intConnect() 将 ISR 绑定到向量 | VOIDFUNCPTR *vector |
BSP 实践提示:在 VxWorks BSP 中,中断向量号通常由硬件数据手册定义,BSP 开发者需在 sysHwInit() 中调用 intConnect() 完成向量与 ISR 的绑定。向量号与中断控制器(如 i8259 或 GIC)的 IRQ 编号存在固定映射关系,不可随意更改。
3.2 中断优先级与中断嵌套
中断优先级决定了当多个中断同时发生时,CPU 优先响应哪一个。中断嵌套则允许高优先级中断打断正在执行的低优先级 ISR。
3.2.1 中断优先级模型
| 优先级模型 | 描述 | 典型应用 |
|---|---|---|
| 固定优先级 | 每个 IRQ 线有固定优先级,IRQ0 最高 | i8259(级联模式) |
| 可编程优先级 | 软件可动态调整每个中断的优先级 | GIC(ARM Cortex-A/R) |
| 轮询优先级 | 所有中断同等优先级,按轮询顺序处理 | 简单 MCU 系统 |
3.2.2 中断嵌套机制
中断嵌套的使能条件:
- 硬件支持:中断控制器必须支持优先级分组和抢占。
- CPU 状态:ISR 中必须显式开中断(如 x86 的 STI 指令)。
- VxWorks 配置:BSP 中需设置 INCLUDE_INT_LIB 并合理配置中断栈大小。
工程陷阱:过度使用中断嵌套会导致栈溢出和优先级反转。VxWorks 官方建议:ISR 应尽量短小,嵌套深度不超过 3 层。在 BSP 开发中,默认关闭嵌套,仅在确定需要高优先级抢占时通过 intLock()/intUnlock() 精细控制。
3.3 中断控制器架构对比:i8259 与 GIC
VxWorks BSP 开发中最常面对的两类中断控制器是 Intel i8259(x86 平台)和 ARM Generic Interrupt Controller(GIC,ARM 平台)。两者在架构和编程模型上存在显著差异。
3.3.1 i8259 可编程中断控制器(PIC)
- 架构:支持级联(最多 2 片,提供 15 个 IRQ)。
- 优先级:固定优先级,IRQ0 最高,IRQ7 最低。
- 中断向量:每个 IRQ 对应一个固定向量号,由初始化命令字(ICW)配置。
- EOI(End of Interrupt):ISR 结束时必须向 i8259 发送 EOI 命令。
3.3.2 ARM GIC(v2/v3/v4)
- 架构:分发器(Distributor)+ CPU 接口(CPU Interface),支持多核。
- 优先级:可编程,支持 16–256 级优先级。
- 中断类型:SPI(共享外设中断)、PPI(私有外设中断)、SGI(软件生成中断)。
- EOI:通过写 GICC_EOIR 寄存器完成。
| 特性 | i8259(PIC) | ARM GIC(v2) |
|---|---|---|
| 最大中断源 | 15(级联) | 最多 1020 |
| 优先级可编程 | 否(固定) | 是(0–255) |
| 多核支持 | 否 | 是 |
| 中断嵌套 | 需软件模拟 | 硬件原生支持 |
| VxWorks 驱动 | sysPciIntr.c / sysIntr.c | sysGic.c / sysIntr.c |
3.4 VxWorks 中断控制器 BSP 编程要点
在 VxWorks BSP 中,中断控制器的初始化与操作集中在以下文件中:
// 典型 BSP 中断相关文件结构
target/config/bspName/
├── sysIntr.c // 中断控制器初始化与中断使能/屏蔽
├── sysPciIntr.c // PCI 设备中断路由(x86 平台)
├── sysGic.c // GIC 初始化(ARM 平台)
├── sysHwInit.c // 硬件初始化入口,调用中断控制器初始化
└── sysAlib.s // 汇编级中断入口与上下文切换
关键 API 速查:
intConnect(INUM_TO_IVEC(intVec), isrRoutine, arg)— 绑定 ISR 到中断向量intLock() / intUnlock()— 全局中断锁定/解锁sysIntEnablePIC(intVec)— 使能 i8259 特定 IRQsysGicIrqEnable(intVec)— 使能 GIC 特定 SPI/PPI
3.5 本章小结
- 中断向量是中断源与 ISR 之间的桥梁,IVT 是系统响应中断的第一级查找表。
- 中断优先级决定响应顺序,中断嵌套提升实时性但增加栈风险和复杂度。
- i8259 适用于传统 x86 单核系统,GIC 是现代 ARM 多核平台的标准选择。
- VxWorks BSP 开发者需根据硬件平台选择对应的中断控制器驱动,并在 sysHwInit() 中完成初始化。