1. 中断基础概念

1.1 中断的定义

中断(Interrupt)是嵌入式实时系统中处理器与外部事件交互的核心机制。当外设或软件需要CPU立即关注时,通过硬件信号打断当前正在执行的指令流,迫使CPU保存现场并跳转到一个预先定义的服务例程,处理完成后恢复原执行流。

关键特性:中断是异步事件驱动的,CPU无法预知其发生时刻,必须通过硬件机制保证实时响应。

在VxWorks BSP开发中,中断管理直接决定了系统的实时性指标。中断响应延迟(Interrupt Latency)是衡量BSP性能的最关键参数之一。

1.2 中断向量表

中断向量表(Interrupt Vector Table, IVT)是处理器用于查找中断服务程序入口地址的跳转表。每个中断源对应一个表项,存储着对应ISR的起始地址。VxWorks在BSP初始化阶段完成向量表的配置与安装。

中断向量号 中断源 默认处理函数 优先级
0x00 - 0x1F CPU异常/陷阱 excEntry 最高
0x20 - 0x2F 外部硬件中断(IRQ 0-15) intEntry 可编程
0x30 - 0xFF 软件中断/用户定义 sysIntHandler 用户配置
BSP开发要点:向量表基地址(VBR)必须在系统启动早期设置,且向量表必须驻留在非缓存内存区域,避免缓存一致性导致的中断丢失。
中断向量表结构示意图 CPU 核心 向量表基地址 (VBR) 向量 0x00: excEntry 向量 0x01: excEntry ... 向量 0x20: intEntry 向量 0x21: intEntry ... 向量 0xFF: sysIntHandler ISR 入口 中断服务程序 说明: 向量表项存储ISR入口地址 CPU通过向量号索引跳转

1.3 中断服务程序 (ISR)

中断服务程序(Interrupt Service Routine, ISR)是响应中断时执行的专用函数。在VxWorks中,ISR运行在特殊的中断上下文中,与普通任务有本质区别。

ISR 核心约束

  • 不可阻塞:ISR不能调用可能引起阻塞的API(如 semTake、msgQReceive、taskDelay)
  • 不可抢占:同一优先级的中断在ISR执行期间被屏蔽
  • 栈空间有限:使用专用的中断栈,通常只有几KB
  • 不可使用浮点:默认不保存浮点寄存器上下文
  • 执行时间极短:通常只做必要的数据搬运和事件通知
常见BSP陷阱:在ISR中调用 printf() 或 logMsg() 可能导致系统死锁,因为这些函数内部可能使用信号量。推荐使用 VxWorks 提供的 sysIntLog() 或直接操作硬件寄存器。

1.4 ISR 与任务切换的区别

理解ISR与任务切换(Task Context Switch)的差异,是掌握VxWorks实时性设计的基础。下表从多个维度进行对比:

对比维度 中断服务程序 (ISR) 任务切换 (Task Switch)
触发方式 硬件事件异步触发 调度器主动发起(时间片/优先级/阻塞)
执行上下文 中断上下文(独立中断栈) 任务上下文(任务栈)
可阻塞 ❌ 不允许 ✅ 允许
可被中断 取决于中断优先级屏蔽状态 可被更高优先级中断打断
调度影响 不触发任务调度(除非ISR释放信号量) 触发完整的上下文保存与恢复
执行时间 微秒级(通常 < 100μs) 毫秒级(取决于任务数量与优先级)
栈空间 共享中断栈(通常 4KB - 16KB) 独立任务栈(通常 8KB - 64KB)
API 限制 仅可使用中断安全API 可使用全部VxWorks API
ISR 与任务切换流程对比 ISR 执行流程 ① 硬件中断到达 ② CPU保存当前PC/PSW ③ 跳转ISR入口执行 ④ 恢复现场,返回原执行流 任务切换流程 ① 当前任务主动阻塞/时间片到 ② 调度器选择下一个任务 ③ 保存当前任务全部寄存器 ④ 恢复新任务上下文,切换栈指针 ISR 仅保存 PC/PSW(轻量),任务切换保存全部寄存器(重量)

1.5 中断响应延迟的构成

中断响应延迟(Interrupt Latency)是指从硬件中断信号有效到CPU开始执行第一条ISR指令之间的时间间隔。在VxWorks BSP中,该延迟由以下部分组成:

  1. 硬件延迟:中断信号传播、CPU中断采样周期(通常 1-3 个时钟周期)
  2. 当前指令完成:CPU必须完成当前正在执行的指令(最长指令如 DIV/MUL 可能耗时数十周期)
  3. 中断屏蔽时间:系统代码中调用 intLock() 或 taskLock() 导致的中断关闭时间
  4. 上下文保存:CPU自动保存 PC、PSW、栈指针等关键寄存器
  5. 向量表查找:根据中断号索引向量表,获取ISR入口地址
BSP优化核心目标:最小化中断屏蔽窗口(Interrupt Lock Time),这是VxWorks BSP性能优化中最具挑战性的环节。典型工业级BSP要求中断响应延迟 < 10μs。

1.6 VxWorks 中断处理层次

VxWorks 的中断处理分为三个层次,理解各层职责有助于BSP开发者精准定位延迟瓶颈:

层次 组件 职责 延迟影响
硬件层 CPU + 中断控制器 (PIC/GIC) 中断信号采样、优先级仲裁、向量号生成 固定硬件延迟(ns级)
BSP层 sysALib.s / intLib.c 向量表安装、中断栈配置、ISR入口封装 BSP实现质量决定(μs级)
应用层 用户注册的ISR函数 具体外设事件处理、数据搬运、事件通知 ISR执行时间(μs级)
VxWorks 中断处理层次架构 硬件层 CPU + 中断控制器 (PIC/GIC) | 信号采样 · 优先级仲裁 · 向量生成 BSP层 sysALib.s / intLib.c | 向量表安装 · 中断栈配置 · ISR入口封装 应用层 用户注册ISR | 外设事件处理 · 数据搬运 · 事件通知
BSP开发建议:在编写BSP中断相关代码时,始终使用 intConnect() 或 intVecSet() 注册ISR,避免直接修改向量表。同时,在ISR中优先使用 semGive() 唤醒高优先级任务,将耗时处理推迟到任务上下文中执行。