1. 中断基础概念:中断向量表、中断优先级、中断嵌套、中断延迟
中断是嵌入式系统响应异步事件的硬件机制,也是 RTOS 任务切换和驱动开发的基石。理解中断的底层原理,是优化 UART 接收超时与粘包处理的前提。本节从四个核心概念展开:中断向量表、中断优先级、中断嵌套和中断延迟。
1.1 中断向量表
中断向量表(Interrupt Vector Table, IVT)是一张存储在固定内存地址的跳转表,每个表项对应一个中断源的中断服务函数(ISR)入口地址。当 CPU 检测到中断请求时,硬件自动根据中断号从向量表中取出目标地址并跳转执行。
| 特性 | 说明 |
|---|---|
| 存储位置 | 通常位于 Flash 或 RAM 起始地址(如 ARM Cortex-M 的 0x00000000) |
| 表项大小 | ARM Cortex-M 每个表项 4 字节(函数指针);x86 实模式为 4 字节(段:偏移) |
| 重定位 | 通过 VTOR 寄存器(ARM)或 IDT 基址寄存器(x86)可重定位向量表 |
| 典型结构 | 第 0 项为栈顶指针,第 1 项为复位向量,后续为异常和中断向量 |
工程要点:在 UART 驱动中,USARTx_IRQHandler 的入口地址必须正确注册到向量表的对应位置。使用 HAL 库时,通过
HAL_NVIC_SetPriority() 和 HAL_NVIC_EnableIRQ() 完成配置,底层即操作向量表。
ARM Cortex-M 向量表示例(STM32F4):向量表起始地址 0x08000000,偏移 0x3C 处为 USART1_IRQHandler。若使用自定义中断函数名,需通过
__attribute__((section(".isr_vector"))) 确保链接到正确位置。
1.2 中断优先级
中断优先级决定多个中断同时触发时的响应顺序。ARM Cortex-M 使用 抢占优先级 和 子优先级 两级方案,通过 NVIC 的优先级分组寄存器(PRIGROUP)配置。
- 抢占优先级:数值越小优先级越高,高优先级可打断低优先级中断。
- 子优先级:当抢占优先级相同时,子优先级决定响应顺序,但不支持嵌套。
- 硬件实现:NVIC 使用 8 位优先级寄存器,实际有效位数由芯片厂商决定(如 STM32 使用高 4 位)。
| 优先级分组 | 抢占优先级位数 | 子优先级位数 | 典型应用场景 |
|---|---|---|---|
| NVIC_PriorityGroup_0 | 0 | 4 | 所有中断同级,无嵌套 |
| NVIC_PriorityGroup_2 | 2 | 2 | UART + TIM 混合场景 |
| NVIC_PriorityGroup_4 | 4 | 0 | 强实时系统,完全抢占 |
常见陷阱:UART 接收中断优先级设置过高会导致低优先级任务(如按键扫描)长时间无法获得 CPU;设置过低则可能丢失接收数据。建议将 UART 接收中断设为中等优先级(如抢占 2,子 0),并配合 DMA 减轻 CPU 负担。
1.3 中断嵌套
中断嵌套(Interrupt Nesting)指一个中断服务函数正在执行时,被另一个更高优先级的中断打断,CPU 暂停当前 ISR 转而执行高优先级 ISR,完成后返回原 ISR 继续执行。
UART 粘包处理中的嵌套风险:若 UART 接收中断被高优先级中断频繁打断,可能导致接收缓冲区溢出或帧同步丢失。解决方案:在 ISR 中仅做数据入队操作,将协议解析放到任务级处理。
1.4 中断延迟
中断延迟(Interrupt Latency)指从中断请求信号到达 CPU 引脚,到 CPU 开始执行 ISR 第一条指令之间的时间间隔。它是衡量系统实时性的关键指标。
| 延迟组成 | 典型时间(ARM Cortex-M4 @168MHz) | 说明 |
|---|---|---|
| 硬件响应延迟 | 12~15 个时钟周期 | CPU 完成当前指令、压栈、取向量 |
| 软件开销 | 20~50 个时钟周期 | ISR 入口保存上下文、栈帧调整 |
| 中断屏蔽时间 | 取决于临界区长度 | RTOS 关中断或高优先级 ISR 执行时间 |
| 总延迟 | 通常 < 1μs | 满足大多数 UART 波特率(115200bps 单字节间隔约 87μs) |
优化建议:UART 接收中断延迟必须小于一个字符的传输时间。以 115200bps、8N1 为例,单字节传输时间 = 10 bit / 115200 ≈ 86.8μs。若中断延迟超过此值,需考虑使用 DMA 或硬件 FIFO。
1.5 中断在 UART 接收中的综合应用
将上述四个概念映射到 UART 接收超时与粘包处理场景:
- 中断向量表:确保 USARTx_IRQHandler 正确注册,使能 RXNE(接收非空)和 IDLE(总线空闲)中断。
- 中断优先级:UART 接收中断设为中等优先级,避免被低优先级任务阻塞,同时不抢占关键实时中断。
- 中断嵌套:在 ISR 中仅做数据入队,协议解析和粘包处理放在任务级,减少嵌套深度。
- 中断延迟:通过 DMA 或硬件 FIFO 降低单字节中断频率,确保延迟始终小于字符间隔。