2. 中断控制器基础:中断概念、中断向量、中断优先级、中断嵌套、常见中断控制器类型(GIC、APIC、NVIC)
2.1 中断核心概念
中断是嵌入式系统中处理器与外部设备或内部事件交互的核心机制。当外设或软件需要处理器关注时,通过中断信号打断当前执行流,跳转到预先定义的中断服务程序(ISR)进行处理。在VxWorks BSP开发中,理解中断的底层原理是移植和优化中断控制器的前提。
中断 vs 轮询:中断机制允许CPU在无事件时执行其他任务,仅在事件发生时响应,极大提升系统实时性和CPU利用率。轮询则持续检查状态,浪费CPU周期。
2.1.1 中断处理流程
- 中断请求:外设或内部模块产生中断信号,发送至中断控制器。
- 中断仲裁:中断控制器根据优先级选择最高优先级中断,向CPU发送中断请求。
- 中断响应:CPU保存当前上下文(PC、PSR等),跳转到中断向量表对应入口。
- 中断服务:执行ISR,处理事件。
- 中断返回:恢复上下文,继续执行被中断的任务。
VxWorks要点:在VxWorks中,中断服务程序运行在中断上下文,不能调用可能阻塞的系统调用(如semTake、taskDelay)。ISR应尽量短小,复杂处理可委托给任务级代码。
2.2 中断向量
中断向量是中断源与中断服务程序之间的映射表。每个中断源分配一个唯一的向量号,CPU根据向量号从向量表中取出ISR入口地址。向量表通常位于内存固定地址,由BSP在启动阶段初始化。
| 概念 | 说明 | 典型值/范围 |
|---|---|---|
| 向量号 | 唯一标识中断源的数字 | 0~255(ARM)、0~255(x86) |
| 向量表基址 | 向量表在内存中的起始地址 | 0x00000000(ARM)、IDTR(x86) |
| 向量表项 | 每个向量号对应的ISR入口地址 | 4字节(32位)/8字节(64位) |
| 异常向量 | CPU内部异常(复位、缺页等)对应的向量 | 0~15(ARM)、0~31(x86) |
BSP开发注意:向量表必须在中断使能前完成初始化。VxWorks通过
sysIntConnect()或intConnect()将ISR挂接到指定向量号。向量表位置需与MMU配置一致,避免中断时取指异常。
2.3 中断优先级与中断嵌套
中断优先级决定多个中断同时到达时的响应顺序。高优先级中断可以抢占低优先级中断的处理,形成中断嵌套。合理配置优先级是保证实时系统确定性的关键。
2.3.1 优先级模型对比
| 模型 | 特点 | 适用场景 |
|---|---|---|
| 固定优先级 | 每个中断源分配固定优先级,不可动态调整 | 简单系统,中断源少 |
| 可编程优先级 | 软件可动态配置每个中断的优先级 | 复杂系统,需灵活调整 |
| 轮转优先级 | 优先级随时间或事件循环变化 | 公平性要求高的场景 |
2.3.2 中断嵌套规则
- 允许嵌套:高优先级中断可以打断低优先级ISR的执行。嵌套深度受堆栈空间限制。
- 禁止嵌套:所有中断串行处理,简化设计但增加延迟。适用于中断频率低、处理快的系统。
- 部分嵌套:仅允许特定高优先级中断嵌套,其余中断屏蔽。
VxWorks实践:VxWorks默认在ISR中关闭所有中断(即禁止嵌套),但可通过
intLock()/intUnlock()精细控制中断屏蔽。在BSP中,sysIntEnablePIC()和sysIntDisablePIC()负责操作中断控制器的屏蔽寄存器。
2.4 常见中断控制器类型
不同处理器架构采用不同的中断控制器设计。BSP开发人员必须熟悉目标平台的中断控制器特性,才能正确配置中断路由、优先级和触发方式。
2.4.1 GIC (Generic Interrupt Controller) — ARM架构
GIC是ARM Cortex-A/R系列处理器的标准中断控制器,支持多核中断分发。GIC架构分为两个主要单元:分发器(Distributor)和CPU接口(CPU Interface)。
| GIC版本 | 支持核数 | 中断源数 | 特性 |
|---|---|---|---|
| GICv2 | 最多8核 | 最多1020个SPI | 经典架构,广泛使用 |
| GICv3 | 最多256核 | 更多SPI+LPI | 支持消息中断、虚拟化 |
| GICv4 | 大规模多核 | 扩展LPI | 直接注入虚拟中断 |
2.4.2 APIC (Advanced Programmable Interrupt Controller) — x86架构
APIC是x86平台的中断控制器标准,分为本地APIC(LAPIC)和I/O APIC两部分。LAPIC集成在CPU内部,处理本地中断源(如定时器、性能计数器);I/O APIC负责外部设备中断的收集和分发。
| 组件 | 功能 | 寄存器基址 |
|---|---|---|
| 本地APIC | 处理本地中断、IPI、定时器 | 0xFEE00000(映射到内存) |
| I/O APIC | 收集外设中断,路由到LAPIC | 0xFEC00000(映射到内存) |
| MSI/MSI-X | 消息信号中断,直接写LAPIC | PCI配置空间 |
2.4.3 NVIC (Nested Vectored Interrupt Controller) — ARM Cortex-M架构
NVIC是ARM Cortex-M系列处理器内置的中断控制器,专为实时嵌入式设计。它支持中断嵌套和向量化中断,每个中断源有独立的优先级寄存器,支持256级优先级(取决于实现)。
| 特性 | NVIC | GIC | APIC |
|---|---|---|---|
| 架构 | 单核MCU | 多核应用处理器 | 多核x86 |
| 中断源数 | 1~240个外部中断 | 最多1020个SPI | 最多255个I/O中断 |
| 优先级位数 | 4~8位可配置 | 8位 | 8位 |
| 嵌套支持 | 硬件自动嵌套 | 软件控制 | 软件控制 |
| 向量化 | 硬件自动取向量 | 软件查表 | 软件查表 |
| 尾链技术 | 支持(降低切换开销) | 不支持 | 不支持 |
2.5 中断控制器在VxWorks BSP中的角色
在VxWorks BSP中,中断控制器抽象层负责以下关键功能:
- 初始化:配置中断控制器的工作模式、优先级位数、向量表基址。
- 中断使能/屏蔽:提供
sysIntEnablePIC()和sysIntDisablePIC()接口,操作中断控制器的屏蔽寄存器。 - 中断连接:
sysIntConnect()将中断向量号与ISR绑定,写入向量表。 - 中断应答:ISR结束时向中断控制器发送EOI(End of Interrupt)信号,允许后续中断。
- 优先级管理:配置中断优先级分组,支持抢占和子优先级。
BSP移植关键点:中断控制器初始化必须在系统启动早期完成,通常在
sysHwInit()中调用。中断控制器的寄存器映射地址、中断号分配、优先级配置方式因平台而异,是BSP移植中最容易出错的环节之一。