2. 中断控制器基础:中断概念、中断向量、中断优先级、中断嵌套、常见中断控制器类型(GIC、APIC、NVIC)

2.1 中断核心概念

中断是嵌入式系统中处理器与外部设备或内部事件交互的核心机制。当外设或软件需要处理器关注时,通过中断信号打断当前执行流,跳转到预先定义的中断服务程序(ISR)进行处理。在VxWorks BSP开发中,理解中断的底层原理是移植和优化中断控制器的前提。

中断 vs 轮询:中断机制允许CPU在无事件时执行其他任务,仅在事件发生时响应,极大提升系统实时性和CPU利用率。轮询则持续检查状态,浪费CPU周期。

2.1.1 中断处理流程

  1. 中断请求:外设或内部模块产生中断信号,发送至中断控制器。
  2. 中断仲裁:中断控制器根据优先级选择最高优先级中断,向CPU发送中断请求。
  3. 中断响应:CPU保存当前上下文(PC、PSR等),跳转到中断向量表对应入口。
  4. 中断服务:执行ISR,处理事件。
  5. 中断返回:恢复上下文,继续执行被中断的任务。
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 直接注入虚拟中断
GICv2 架构框图 外设中断源 外设中断源 外设中断源 分发器 Distributor 优先级路由/使能/触发 CPU接口 CPU Interface 中断屏蔽/应答/结束 CPU Core 说明: 1. 外设中断经分发器路由到指定CPU核 2. 分发器负责优先级仲裁和中断使能控制

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配置空间
x86 APIC 架构框图 CPU 0 本地APIC (LAPIC) 定时器/IPI/本地中断 CPU 1 本地APIC (LAPIC) 定时器/IPI/本地中断 I/O APIC 中断路由表 外设中断收集/分发 外设设备 外设设备 外设设备 I/O APIC收集外设中断,通过中断路由表将中断转发到指定CPU的LAPIC。LAPIC处理本地中断和核间中断(IPI)。

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位
嵌套支持 硬件自动嵌套 软件控制 软件控制
向量化 硬件自动取向量 软件查表 软件查表
尾链技术 支持(降低切换开销) 不支持 不支持
NVIC 中断处理流程 外设中断请求 NVIC 优先级比较 中断屏蔽 向量表索引 CPU Core 自动压栈 取向量地址 执行ISR 中断向量表 ISR入口地址映射 NVIC硬件自动完成优先级比较、压栈和向量取指,ISR延迟极低(典型12个时钟周期)。

2.5 中断控制器在VxWorks BSP中的角色

在VxWorks BSP中,中断控制器抽象层负责以下关键功能:

  • 初始化:配置中断控制器的工作模式、优先级位数、向量表基址。
  • 中断使能/屏蔽:提供sysIntEnablePIC()和sysIntDisablePIC()接口,操作中断控制器的屏蔽寄存器。
  • 中断连接:sysIntConnect()将中断向量号与ISR绑定,写入向量表。
  • 中断应答:ISR结束时向中断控制器发送EOI(End of Interrupt)信号,允许后续中断。
  • 优先级管理:配置中断优先级分组,支持抢占和子优先级。
BSP移植关键点:中断控制器初始化必须在系统启动早期完成,通常在sysHwInit()中调用。中断控制器的寄存器映射地址、中断号分配、优先级配置方式因平台而异,是BSP移植中最容易出错的环节之一。

2.6 本章小结