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 编号存在固定映射关系,不可随意更改。
中断向量表(IVT)结构示意图 CPU 中断控制器 中断向量表(IVT) 向量 0:ISR_Addr_0 向量 1:ISR_Addr_1 向量 2:ISR_Addr_2 向量 3:ISR_Addr_3 … 更多向量项 … CPU 响应中断 → 中断控制器提供向量号 → CPU 查 IVT 获取 ISR 入口地址 → 跳转执行

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() 精细控制。
中断嵌套执行时序图 时间 → 主程序(Task) 低优先级 ISR 高优先级 ISR 恢复 嵌套流程: 1. 主程序执行中,低优先级中断到达 → 进入低优先级 ISR 2. 低优先级 ISR 执行中,高优先级中断到达 → 硬件自动抢占 3. 高优先级 ISR 执行完毕 → 返回低优先级 ISR 继续执行 4. 低优先级 ISR 执行完毕 → 返回主程序

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
i8259 与 GIC 架构对比图 i8259 级联架构 主片 i8259 从片 i8259 IRQ0–IRQ7(主片) + IRQ8–IRQ15(从片) 固定优先级:IRQ0 最高 → IRQ7 最低 ARM GIC v2 架构 Distributor CPU Interface SPI / PPI / SGI 可编程优先级:0–255 级 多核支持:每个核独立 CPU Interface

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 特定 IRQ
  • sysGicIrqEnable(intVec) — 使能 GIC 特定 SPI/PPI

3.5 本章小结

  • 中断向量是中断源与 ISR 之间的桥梁,IVT 是系统响应中断的第一级查找表。
  • 中断优先级决定响应顺序,中断嵌套提升实时性但增加栈风险和复杂度。
  • i8259 适用于传统 x86 单核系统,GIC 是现代 ARM 多核平台的标准选择。
  • VxWorks BSP 开发者需根据硬件平台选择对应的中断控制器驱动,并在 sysHwInit() 中完成初始化。