CPU与外部设备交互的三种控制方式详解
第一章 各有千秋
本文章结合实际应用的经验,查询书籍和网络资料汇总,欢迎补充完善。
在计算机体系结构和数据通信系统中,CPU 与外部设备(如网卡、串口、磁盘、传感器等)之间的数据交互,主要有三种控制方式:轮询、中断和 DMA。它们的本质区别在于 CPU 参与数据传输的程度和时机,从而带来不同的效率、实时性和适用场景。
一、轮询 (Polling)
轮询是一种程序直接控制的 I/O 方式。CPU 主动、周期性地检查外设的状态寄存器,判断设备是否需要服务(如“数据就绪”或“发送完成”),一旦条件满足就执行数据读写。
1、工作流程:
1)CPU 从外设的状态端口读取标志位。
2)若设备未就绪,则跳回步骤 1 继续检查(忙等待)。
3)若设备就绪,CPU 执行数据传输(如读取接收缓冲器)。
4)传输完成,返回主程序或继续下一次查询。
2、技术特点
1)实现简单:纯软件逻辑,无需额外硬件支持。
2)CPU 利用率低:查询期间 CPU 被完全占用做无意义的“忙等待”,不能处理其他任务。
3)响应时间可预测:最差延迟由轮询周期决定,属于同步检测模式。
4)易丢失数据:如果查询间隔大于外设的数据到达间隔,会发生溢出。
5)数据易被打断:若嵌入式中存在多个中断,设计不当容易被其他的中断打断传输。
3、适用场景:简单单任务系统、设备状态变化缓慢或通信速率极低、且 CPU 没有其他事务需要处理的场合。
4、举个例子:单任务系统通过轮询串口接收字节,CPU 循环检测 RXNE 标志,一旦置位立刻读取。
二、中断 (Interrupt)
中断是一种事件驱动的异步机制。外设通过硬件信号主动向 CPU 发起服务请求,CPU 暂停当前程序,转而执行与该设备对应的中断服务程序(ISR),完成数据传输后再返回原任务。
1、工作流程
1)外设满足条件(如收到一字节)时,通过中断控制器向 CPU 发出中断请求(IRQ)。
2)CPU 完成当前指令,检查中断使能与优先级,响应中断。
3)硬件自动保存部分上下文(PC、状态寄存器),进入 ISR。
4)ISR 执行必要的数据搬移、清除中断标志等操作,该过程应尽量简短。
5)执行中断返回指令,恢复现场,继续原程序。
不同的指导教材流程略有区别,大致流程类似。
2、特点
1)CPU 利用率高:设备未就绪时 CPU 可以执行其他任务,仅在需要服务时才切换,避免了忙等。
2)响应异步事件快:相比轮询,能在事件发生的瞬间得到处理,实时性好。
3)存在上下文切换开销:保存/恢复寄存器、中断延迟(中断屏蔽、优先级排队)会消耗时间。
4)高频中断会压垮 CPU:当数据速率极高时,频繁中断会导致“中断风暴”,CPU 大量时间花在进出 ISR 上,有效吞吐反而下降。
3、使用场景:适合低、中速异步事件:键盘、鼠标、串口单字节接收、定时器等。在多线程和多中断系统中,注意线程和中断优先级配置。
4、举个例子:传统以太网卡每收到一个数据包产生一次中断,由驱动 ISR 将数据从网卡 FIFO 复制到协议栈缓冲区。
三、DMA (Direct Memory Access)
DMA 是一种让专用控制器接管总线、在后台自动完成数据块搬运的技术。CPU 仅负责初始化传输参数,之后整个数据块在外设与内存之间(或内存到内存)的移动完全由 DMA 控制器负责,不再需要 CPU 逐字干预。
1、工作流程
1)CPU 配置 DMA 控制器:源地址、目的地址、传输长度、传输模式(单次/循环)等。
2)外设准备就绪(或软件触发),DMA 控制器向总线仲裁器请求总线控制权。
3)获得总线后,DMA 控制器发起读写周期,将外设数据读入内部寄存器,再写入内存,源/目的地址自动递增。
4)重复步骤 3 直到传输计数归零,DMA 释放总线,向 CPU 发出一个 DMA 完成中断。
5)CPU 在中断中得知传输完成,进行后续处理(如通知应用程序数据已就绪)。
2、传输模式
1)单字节/周期挪用:DMA 每传一字节释放一次总线,让 CPU 有机会执行,减少 CPU 停顿。
2)块传输:连续传输整块数据后再释放总线,效率高但会长时间占用总线。
3)散聚模式:支持非物理连续的内存区域,用链表描述符链接多段传输。
3、技术特点
1)CPU 负担最小化:CPU 只参与传输的首尾,适合大批量、高速数据传输。
2)传输速度快:专用硬件进行地址计算和时序控制,效率远高于 CPU 逐字搬移。
3)需额外硬件和总线仲裁:设计复杂,DMA 与 CPU 对总线的竞争可能引入微小的访存延迟。
4、适合高速块设备:磁盘读写、网络数据包大缓冲、显示帧缓冲刷新、高速 ADC/DAC 连续采样流。
下面是DMA工作流程的时序交互图,清晰地展示CPU、DMA控制器、外设和总线之间的交互过程:
该流程图展示了DMA工作流程的完整时序:
- 初始化:CPU配置DMA控制器参数
- 准备:外设数据就绪,触发传输
- 总线获取:DMA控制器请求并获得总线控制权
- 数据传输:DMA控制器在外设和内存间直接搬运数据
- 总线释放:传输完成后释放总线
- 完成通知:DMA控制器向CPU发送中断
- 后续处理:CPU在中断服务程序中处理后续任务
四、差异对比
下表展示三种I/O控制方式的差异。:
| 特性 | 轮询 (Polling) | 中断 (Interrupt) | DMA (Direct Memory Access) |
|---|---|---|---|
| 启动方式 | CPU 主动查询 | 外设异步请求 | CPU 初始化,DMA 控制器自动搬运 |
| CPU 干预时机 | 全程干预,逐个数据查询和搬运 | 仅响应中断后处理数据 | 仅初始化和传输完成时介入 |
| CPU 利用率 | 极低(忙等待) | 高(仅在服务时切换) | 最高(传输期间 CPU 可完全释放) |
| 响应速度 | 取决于查询频率,可能延迟或丢失 | 很快,有中断延迟但实时性好 | 批量传输,单个字节无立即响应 |
| 数据传输粒度 | 通常单字节/字 | 通常少量数据(ISR 要求短小) | 块数据,几十到几千字节或更大 |
| 软硬件开销 | 软件查询开销小,无额外硬件 | 硬件中断控制器,上下文切换开销 | 需 DMA 控制器,总线仲裁开销 |
五、总结
实际高性能通信系统很少单一使用某一种方式,而是将它们结合起来以平衡吞吐量和 CPU 负载:
1、中断 + DMA:网卡、磁盘控制器中,DMA 负责批量数据搬运,传输完成后产生一次中断通知 CPU 取走整块数据,避免逐字节中断。
2、中断 + 轮询 (NAPI):先用中断通知有数据到来,随后关闭中断,改用轮询方式持续收割数据包,当一段时间无包时再重新开启中断。这样在高负载下避免了频繁中断,低负载下保留了中断的及时性。
实际工程中若有其他结合情况,欢迎交流!
以上就是该章内容,在设计协议栈或驱动时,需要根据数据速率、延迟容忍度、CPU 预算和硬件特性来精准选择或组合这三种传输机制,才能在性能与资源之间找到最佳平衡。
后期使用理论和代码实践的方式对每种方式展开讲述。
更多推荐

所有评论(0)