4. 中断模式概述:轮询模式 vs 中断模式 vs DMA模式、中断模式适用场景
在嵌入式UART驱动开发中,数据收发的核心机制决定了系统的实时性、CPU利用率和吞吐量。本章深入对比三种主流模式——轮询(Polling)、中断(Interrupt)和DMA(Direct Memory Access),并重点剖析中断模式的适用场景与设计权衡。
核心观点:中断模式是嵌入式UART驱动中最常用的方案,它在CPU负载与响应延迟之间取得了最佳平衡,尤其适合不定长、突发性的串口通信场景。
4.1 三种模式的工作原理对比
下表从触发方式、CPU参与度、数据吞吐量和典型延迟四个维度,对轮询、中断和DMA模式进行横向对比:
| 对比维度 | 轮询模式 | 中断模式 | DMA模式 |
|---|---|---|---|
| 触发方式 | CPU循环查询状态寄存器 | 硬件事件触发中断服务程序 | DMA控制器独立搬运数据 |
| CPU参与度 | 持续占用(忙等) | 仅进入/退出ISR时短暂占用 | 仅初始化时配置,搬运过程零占用 |
| 数据吞吐量 | 低(受限于轮询频率) | 中(受限于ISR执行时间) | 高(硬件级并行搬运) |
| 典型延迟 | 取决于轮询周期(ms级) | 微秒级(取决于中断响应) | 纳秒级(DMA传输延迟) |
| 实现复杂度 | 最低 | 中等 | 较高(需配置DMA通道) |
| 适用场景 | 调试、低速率、简单控制 | 通用嵌入式通信、不定长数据 | 高速批量数据传输 |
工程经验:在Linux内核中,UART驱动默认使用中断模式。轮询模式通常仅在系统早期初始化阶段(如early console)或调试场景下启用。DMA模式则常用于蓝牙、Wi-Fi模块等高速串口设备。
4.2 三种模式的架构对比图
下图从系统架构层面展示了三种模式下CPU、UART外设与内存之间的数据流关系:
4.3 中断模式的详细工作流程
中断模式下,UART驱动的数据收发遵循以下典型流程:
- 初始化阶段:配置UART波特率、数据位、停止位、校验位,使能接收/发送中断,注册中断服务程序(ISR)。
- 等待阶段:CPU执行主任务,UART外设处于空闲监听状态。
- 触发阶段:UART接收FIFO达到预设阈值(如1字节、4字节、8字节),硬件自动产生中断信号。
- 响应阶段:CPU暂停当前任务,保存上下文,跳转到ISR入口。
- 处理阶段:ISR从UART数据寄存器读取数据,存入内核缓冲区,清除中断标志。
- 恢复阶段:ISR返回,CPU恢复上下文,继续执行被中断的主任务。
关键注意事项:ISR必须短小精悍,避免在中断上下文中执行耗时操作(如内存分配、互斥锁等待)。通常ISR只做数据搬运,将复杂处理推迟到下半部(Bottom Half)或工作队列(Workqueue)中执行。
4.4 中断模式的适用场景分析
中断模式并非万能,以下场景最适合采用中断模式驱动UART:
| 场景类别 | 具体描述 | 推荐理由 |
|---|---|---|
| 不定长数据通信 | GPS模块、传感器数据、AT指令交互 | 中断可随时响应,无需预知数据长度 |
| 低功耗嵌入式系统 | 电池供电的IoT设备、可穿戴设备 | CPU可在空闲时进入睡眠,中断唤醒 |
| 多任务实时系统 | FreeRTOS、RT-Thread、Linux内核 | 中断不阻塞主任务,支持任务调度 |
| 中等速率通信 | 115200 bps ~ 921600 bps | ISR执行时间远小于数据间隔,不丢数据 |
| 人机交互设备 | 触摸屏、键盘、蓝牙模块 | 突发性数据,中断响应延迟低 |
4.5 中断模式 vs 轮询模式:延迟对比图
下图展示了在相同波特率(115200 bps)下,轮询模式与中断模式在数据到达后的响应延迟差异:
4.6 中断模式在Linux内核中的实现层次
在Linux内核中,UART中断驱动的实现分为三个层次:
| 层次 | 文件/函数 | 职责 |
|---|---|---|
| 硬件层 | drivers/tty/serial/ 下的具体驱动 |
配置UART寄存器、使能中断、ISR入口 |
| 核心层 | serial_core.c (uart_ops) |
提供统一的端口操作接口、FIFO管理 |
| TTY层 | n_tty.c (线路规程) |
将原始数据转换为行缓冲,供用户态读取 |
实践要点:在编写UART中断驱动时,重点关注以下三个寄存器配置:
• IER(中断使能寄存器):使能接收/发送中断
• FCR(FIFO控制寄存器):设置FIFO触发阈值
• IIR(中断标识寄存器):在ISR中判断中断类型
• IER(中断使能寄存器):使能接收/发送中断
• FCR(FIFO控制寄存器):设置FIFO触发阈值
• IIR(中断标识寄存器):在ISR中判断中断类型
4.7 中断模式的设计权衡
选择中断模式时,需要权衡以下因素:
- 中断频率:FIFO阈值设置过低会导致频繁中断,增加CPU上下文切换开销;阈值设置过高则可能造成数据溢出。
- ISR执行时间:必须控制在微秒级,否则会阻塞其他中断和任务调度。
- 中断优先级:UART中断通常设置为中等优先级,避免影响高实时性任务(如定时器、看门狗)。
- 共享中断:多个UART端口可能共享同一中断线,ISR需要正确识别中断源。
工程建议:对于115200 bps的UART,推荐设置接收FIFO阈值为8字节。这样每接收8个字节产生一次中断,既保证了响应速度,又降低了中断频率。在Linux内核中,可以通过
uart_port 结构体的 fifosize 和 rx_trig 字段进行配置。
4.8 三种模式的选型决策树
在实际工程中,可以按照以下决策树选择UART工作模式:
4.9 本章小结
中断模式是UART驱动开发中最核心的工作模式,它在CPU利用率、响应延迟和实现复杂度之间取得了最佳平衡。与轮询模式相比,中断模式避免了CPU忙等;与DMA模式相比,中断模式实现更简单、配置更灵活。在实际工程中,超过80%的嵌入式UART应用采用中断模式驱动。