本节摘要:CPU 与外设交换数据有三条路径——查询、中断、DMA;本节把三条路径的流程、开销与适用边界逐项对账,并完整拆解 DMA 控制器抢总线、搬数据、还总线的全过程。
门牌挂好后,本章主线的正面战场开启:那个传感器字节怎么取回来。三种取法对应三种事件密度与带宽需求,本站给出完整的对账单——它同时是第 5 章中断内容的工程落点。
查询方式:CPU 在循环里反复读状态口,就绪了才取数据。流程最直白,电路最省——一根状态线一个循环足矣。代价也最直白:等待时间全部由 CPU 买单。若外设平均一毫秒才就绪一次,而 CPU 一微秒就能查一轮,等于千分之九百九十九的查询是空转。它的合理领地是事件频繁且 CPU 别无他事的场合:启动阶段的初始化握手、单任务裸机系统、以及调试时验证硬件状态。
中断方式:外设就绪时举手,CPU 平时干正事。每次传输的固定开销是响应加返回——第 5 章算过,约百来个时钟。把账算到头上:波特率 115200 的串口每八十七微秒一个字节,中断开销占比尚可;若改成每微秒一次的中断,光进出服务程序就把处理器拖垮。中断的领地是中低速率、事件稀疏的交互型外设——键盘、串口、定时器节拍。
DMA 方式:大批量传输时,连"取一次存一次"的循环都是浪费。DMA 控制器接手整个传输:它向 CPU 申请总线使用权,直接在外设与内存之间搬运,CPU 只在开头递参数(内存起始地址、长度、方向)、结尾收一个完成通知。处理器被彻底解放,传输速率逼近总线带宽的上限。DMA 的领地是成块、成流的高速数据——磁盘、网卡、图像采集、音频流。
DMA 之所以能"绕过 CPU",靠的是第 4 章仲裁机制的兑现。一个完整回合分四幕。递交参数:CPU 编程 DMA 控制器——内存地址、传输字节数、方向、工作模式,随后放手。申请总线:外设就绪,向 DMA 控制器发出传输请求,控制器向 CPU 举起总线申请信号。接管与搬运:CPU 在总线周期结束的边界交出总线三线(地址、数据、控制),回赠一个授权信号;控制器把地址放上总线、发出读写命令,一个字节或一串字节直达内存;"块传输"一口气搬完整块,"周期挪用"每搬一拍归还一拍,"交替访问"则与 CPU 平分节拍——粒度取舍正是 4.3 案例的教训。归还与销号:字节计数器归零,控制器交还总线,向 CPU 发出计数完毕信号,一次 DMA 事务落幕。
三条路径摆在一起对账:
| 维度 | 查询 | 中断 | DMA |
|---|---|---|---|
| CPU 占用 | 全程等待 | 每次事件付固定开销 | 仅初始化与收尾 |
| 传输速率 | 低 | 中低 | 逼近总线带宽 |
| 实时响应 | 取决于轮询间隔 | 快且确定 | 快,批量优先 |
| 电路复杂度 | 最低 | 中 | 高 |
| 典型场景 | 握手与裸机轮询 | 键盘串口定时器 | 磁盘网络采集音频 |
背景:某工控设备要在屏幕提示的同时播放报警音,初版用查询方式从内存逐字节送往音频端口,报警音响起时屏幕刷新明显卡顿。操作:第一轮改中断——音频端口每次送出字节就申请中断,服务程序送下一个字节;CPU 占用降到约百分之五,卡顿缓解,但每八分之一毫秒一次的中断让主循环仍有毛刺。第二轮上 DMA——控制器从内存缓冲自动搬运,CPU 只在缓冲区换页时被通知一次;毛刺消失,CPU 占用降到百分之一以下。结果:同一台设备经历三个版本,传输方式逐级升级。解读:升级的依据不是"哪种更先进",而是带宽与 CPU 预算的账——报警音的数据率让查询付不起等待,让中断付不起进出开销,只有 DMA 划算。变式:若提示音改成每分钟一声的短促蜂鸣,查询反而最合适——为几个字节配置 DMA 通道的复杂度得不偿失。方式跟着数据率走,不跟着潮流走。
把对账做成数字。设外设每毫秒交付一个字节,总线周期一微秒一次访问。查询方式:CPU 每一百微秒探测一轮(每次约一微秒),一天二十四小时的探测里有效接收只占千分之一——但若要求不漏字节,探测间隔必须小于交付间隔,等待时间逼近百分之百。中断方式:每毫秒一次进出服务,开销约三十微秒,CPU 占用率百分之三——余下九成七都能干正事。DMA 方式:若让控制器攒满一百个字节再交割一次,CPU 每百毫秒处理一次缓冲,占用率约千分之几。三笔账对应三个数量级的自由度,数据率每上一个台阶,方式的换代就不是选择而是必须。
数字之外还有隐性成本。查询的隐性成本是响应迟钝——探测间隔决定了事件被发现的迟滞;中断的隐性成本是抖动——服务程序若与实时任务争抢资源,响应延迟会飘;DMA 的隐性成本是编程复杂度——通道配置、缓冲管理、完成处理,出错面比前两者宽。三把扳手各有重量,账要连工钱一起算。
问:DMA 期间 CPU 完全闲着吗? 看传输粒度。周期挪用方式下 CPU 只在交出总线的那一拍停手,照常执行不访存的指令(寄存器运算、取指令若命中缓存都能继续);块传输方式下 CPU 才真正全面停车。现代处理器还有"总线强度"的细粒度仲裁,停车时间被压缩到以拍计。
问:设备说明书说支持中断,我还能选查询吗? 能。方式选择看的是系统的预算而不是设备的能力:初始化阶段的握手、单次触发的读数、调试期的状态确认,查询都更省事。设备支持中断只是给了选项,不构成义务——选项多不等于都要用。
三条路径看清了,下一站请出两颗把这套原理物理化的经典芯片——8255 与 8253,练接口工程师的第一双手感。