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"))) 确保链接到正确位置。
中断向量表结构(ARM Cortex-M) 中断向量表(IVT) 偏移 0x00:栈顶指针 偏移 0x04:复位向量 偏移 0x08~0x2C:异常向量 偏移 0x30+:中断向量 USART1_IRQHandler DMA1_Stream0_IRQHandler TIM2_IRQHandler 中断号 37 中断号 11 中断号 28 CPU 响应中断时,硬件自动读取 IVT[中断号] 并跳转至对应 ISR 入口

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 继续执行。

中断嵌套执行流程 时间 主程序(Main) ISR_Low(UART) ISR_High(TIM) ISR_Low 恢复 高优先级打断低优先级 高优先级执行完毕,返回低优先级 中断嵌套增加了系统响应实时性,但需注意栈空间消耗和优先级反转问题
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。
中断延迟时间线 t 中断请求 硬件响应 软件开销 ISR 执行 中断返回 中断延迟 = 硬件响应 + 软件开销 中断延迟直接影响 UART 接收的实时性,延迟过长会导致数据丢失或帧错误

1.5 中断在 UART 接收中的综合应用

将上述四个概念映射到 UART 接收超时与粘包处理场景:

  • 中断向量表:确保 USARTx_IRQHandler 正确注册,使能 RXNE(接收非空)和 IDLE(总线空闲)中断。
  • 中断优先级:UART 接收中断设为中等优先级,避免被低优先级任务阻塞,同时不抢占关键实时中断。
  • 中断嵌套:在 ISR 中仅做数据入队,协议解析和粘包处理放在任务级,减少嵌套深度。
  • 中断延迟:通过 DMA 或硬件 FIFO 降低单字节中断频率,确保延迟始终小于字符间隔。