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)必须在系统启动早期设置,且向量表必须驻留在非缓存内存区域,避免缓存一致性导致的中断丢失。
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 |
1.5 中断响应延迟的构成
中断响应延迟(Interrupt Latency)是指从硬件中断信号有效到CPU开始执行第一条ISR指令之间的时间间隔。在VxWorks BSP中,该延迟由以下部分组成:
- 硬件延迟:中断信号传播、CPU中断采样周期(通常 1-3 个时钟周期)
- 当前指令完成:CPU必须完成当前正在执行的指令(最长指令如 DIV/MUL 可能耗时数十周期)
- 中断屏蔽时间:系统代码中调用 intLock() 或 taskLock() 导致的中断关闭时间
- 上下文保存:CPU自动保存 PC、PSW、栈指针等关键寄存器
- 向量表查找:根据中断号索引向量表,获取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级) |
BSP开发建议:在编写BSP中断相关代码时,始终使用
intConnect() 或 intVecSet() 注册ISR,避免直接修改向量表。同时,在ISR中优先使用 semGive() 唤醒高优先级任务,将耗时处理推迟到任务上下文中执行。