☰
DMA方式彻底搞懂:原理、访存冲突与中断区别
2026/9/26 19:29:34 网站建设 项目流程

如果你正在准备408考研,看到“DMA方式”这几个字大概率会有点头疼。计算机组成原理里I/O设备与主机之间的信息传送控制方式一共就四种:程序查询、程序中断、DMA、通道,前两个还算好理解,一到DMA就容易绕进去。尤其是DMA和中断的区别、三种访存冲突处理方式、数据传送的基本单位到底是字还是块,这些点在408里反反复复出现,每年都有不少人在这里翻车。

这篇就把DMA方式掰开揉碎讲清楚:它到底解决了什么问题、一次完整的DMA传送分几步、三种主存访问冲突处理方式怎么区分、DMA控制器内部有哪些组成部分、和中断的区别怎么答不丢分,最后再结合真题套路和嵌入式开发的真实场景,帮你把理论和实际串起来。不管你是刚开始复习计组的萌新,还是二刷准备冲刺的考生,这篇都能给你点实在的东西。

1. 先搞懂背景:为什么前面的控制方式不够用了

1.1 程序查询方式:CPU成了“盯梢的”

程序查询方式是最原始、最容易理解的I/O控制方式。它的工作逻辑非常简单粗暴:CPU不断读取I/O设备的状态寄存器,看看设备准备好了没有。设备准备好数据,CPU就把数据读走;设备没准备好,CPU就继续查,一直查到准备好为止。

这个过程你可以理解成在食堂等饭:你站在出餐窗口前面,每隔几秒就问一次“好了没?好了没?”,直到阿姨把饭递给你。这个过程中你什么都干不了,全部精力都花在“问”这件事上。CPU也是一样,从发出查询指令到数据传送结束,CPU全程被这个设备“绑架”,别的任务一概不处理。

这种方式的致命问题就是CPU利用率太低。查询期间CPU不能执行用户程序,而I/O设备的速度通常比CPU慢好几个数量级,比如磁盘机械臂寻道可能要几毫秒,而CPU执行一条指令才几纳秒。这一毫秒的等待时间相当于CPU跑空了几十万个指令周期。所以程序查询方式只适用于非常简单的低速设备,比如单板机上读取一个按键状态、读取一个拨码开关值。

1.2 程序中断方式:CPU被频繁打断,搬运效率还是低

程序中断方式比查询方式进了一大步。它的核心思路是:设备准备数据的时候,CPU先去干别的事,等设备数据就绪后向CPU发出中断请求,CPU暂停当前程序,去执行中断服务程序,在中断服务程序里完成数据传送,传送完再返回原来的程序继续执行。

还是拿食堂类比:阿姨开始炒你的菜时告诉你“炒好了我叫你”,你就可以先去打个汤、拿个餐具,等阿姨喊你的时候再过去端菜。CPU利用等待时间去执行其他程序,这本质上就是“异步通知机制”,比“轮询”聪明得多。

但中断方式也有明显的局限性。一是每次数据传送都以字或字节为单位,设备每准备好一个字就要打断CPU一次。假设一个磁盘扇区有512字节,用中断方式接收这512字节,CPU要被中断512次。二是中断响应本身有开销:保护现场、识别中断源、跳转到中断服务程序、恢复现场,这一套流程少说也要几十个指令周期。如果每次传送的数据量很小、传送频率很高,那中断开销甚至可能比实际搬运数据的时间还大。

所以程序中断方式虽然在CPU利用率上优于查询方式,但它只适合传送频率不太高、数据量比较小的场合,比如键盘输入、打印机输出。对于磁盘、网卡、显卡这类高速块设备,中断方式根本扛不住。

1.3 DMA的定位:找了一个“专职搬运工”

DMA(Direct Memory Access,直接存储器存取)方式完全换了一种思路:数据传送不再经由CPU中转,而是由DMA控制器(DMAC)这个专门的硬件来负责。CPU要做的只是在传送开始前把参数告诉DMAC,然后在传送结束后处理一下结果,中间所有的数据搬运全由DMAC自己完成。

你可以把DMAC理解成仓库里的自动搬运机器人。老板(CPU)只需要告诉机器人“把那批货从1号库房搬到2号库房,共500箱”,然后就可以去接别的客户了。机器人自己认路、自己搬货、自己清点数量,搬完了按铃通知老板“搬完了,你来验收一下”。搬货的全过程老板完全不参与。

这正是DMA方式的核心价值:把CPU从繁琐的数据搬运工作中彻底解放出来,让数据在I/O设备和主存之间直接传送,大大提升了系统效率。这也是408考试中反复考察DMA的原因——它代表了高性能I/O控制的核心思想。

2. 一次完整的DMA传送:CPU只在两头出现

2.1 预处理:CPU给DMAC“交代任务”

DMA传送的第一步是预处理,这个阶段的主角是CPU。CPU需要向DMA控制器写入以下几类信息:

  • 传送方向:数据是从I/O设备读到主存,还是从主存写到I/O设备。方向写错,整个传送就全乱套了。
  • 主存起始地址:数据要写到内存的哪个位置,或者从内存的哪个位置开始读。这个地址会被放入DMAC内部的主存地址寄存器中。
  • 传送字(字节)数:本次一共要搬多少数据,放入字计数器中。
  • 设备地址:告诉DMAC是哪个I/O设备参与传送,相当于现场指明“货从哪个仓库出”。

预处理阶段结束后,CPU就可以回到原来的程序继续执行了。也就是说,CPU在DMA传送过程中只出现了一“头”——开头下指令。剩下的事情全部交给DMAC。

这里有个容易忽略的点:预处理虽然由CPU完成,但CPU写入的是DMAC的寄存器,不是直接读写I/O设备的数据寄存器。在408题目里,如果问“DMA传送前由谁完成初始化工作”,答案一定是CPU,而不是设备或DMAC自己。有些同学概念一混,看到“DMA”就以为整个过程都是硬件自动完成的,连初始化也选错,这就很可惜了。

2.2 数据传送:DMAC接管总线,以块为单位搬运

数据传送阶段是DMA方式最核心的部分,也是和中断方式差异最明显的地方。DMAC获得总线控制权后,数据直接在I/O设备和主存之间传送,每传送一个字(或字节),需要经历以下几步:

  1. I/O设备准备好一个数据,向DMAC发送DMA请求信号(DRQ,DMA Request)。
  2. DMAC收到请求后,向CPU发送总线请求信号(HRQ,Hold Request)。
  3. CPU在当前总线周期结束后响应总线请求,发出总线允许信号(HLDA,Hold Acknowledge),并让出总线控制权。
  4. DMAC接管总线,把I/O设备送来的数据先暂存到自己的数据缓冲寄存器中,然后再写入主存地址寄存器所指向的主存单元。
  5. 主存地址寄存器的值自动加1,指向下一个要写入的地址。
  6. 字计数器的值自动减1,表示还剩多少数据没传完。

然后重复上述过程,直到字计数器减到0,说明整个数据块传送完毕。

这个过程中最值得注意的细节是:DMA传送的基本单位是数据块,这是408选择题的高频考点。程序中断方式传送的基本单位是字或字节,DMA方式传送的则是连续的数据块。所以考题里如果说“DMA方式以字为单位传送数据”,这一定是错的。

另外还有一个细节值得思考:既然数据是I/O设备和主存之间直接传送的,为什么DMA控制器内部还需要一个数据缓冲寄存器?原因在于速度匹配。I/O设备的数据宽度和主存的数据宽度未必一致,设备送出数据的速率和主存接收数据的速率也可能存在差异。举个简单例子,某设备一次输出8位数据,而主存总线宽度是32位,这时就需要缓冲寄存器把4个8位数据拼成一个32位数据再写入主存。数据缓冲寄存器在这里起到的是“中转站”和“速度适配器”的作用,没有它,设备和主存之间就谈不上“直接”传送。

2.3 后处理:传送完成,DMAC用中断向CPU汇报

当字计数器减到0,整个数据块传送完毕,DMAC会向CPU发出中断请求,这就是后处理阶段。CPU响应这个中断后,进入中断服务程序,做的事情包括:检查传送过程是否有错误(比如校验出错)、对传送结果进行处理(比如把缓冲区交给用户程序)、回收系统资源等。

这里有一个很多初学者都会掉进去的坑:DMA传送结束之后要发中断,那DMA方式到底算不算中断方式?

不算。DMA方式的后处理阶段虽然用了中断机制,但这个中断只是“通知CPU来收尾”的一种手段,真正搬运数据的过程完全由硬件完成,CPU没有参与。而程序中断方式里的中断,恰恰是CPU进行数据搬运的“入场券”——CPU必须在中断服务程序里一个一个地搬数据。两者有本质区别。408真题经常在选项里混淆这一点,比如写“DMA方式与中断方式一样,都是通过执行中断服务程序来完成数据传送”,这种说法看着像对的,实际上是错的。

后处理阶段的另一个考点是:DMA中断请求和普通中断请求同时到达时,谁优先?答案通常是DMA请求优先。因为DMA处理的往往是高速设备的数据流,如果DMA请求得不到及时响应,I/O设备内部的数据缓冲可能溢出,数据就丢了。而普通中断慢一点响应,最多就是系统响应变慢,不会造成数据损坏。这个优先级顺序在周期挪用的场景下显得尤其重要,下面细说。

3. DMA和CPU抢主存:三种访存冲突解决办法

DMA方式下,数据传送不经过CPU内部寄存器,但数据终究要写入主存或从主存读出,而CPU执行指令时也要访问主存。两个设备都想用同一扇“门”,这就产生了访存冲突。408大纲要求掌握的解决冲突方案一共有三种:停止CPU访存、周期挪用(周期窃取)、交替访存。

3.1 停止CPU访存:简单粗暴但CPU“躺平”

停止CPU访存方式下,当DMAC需要传送一个数据块时,它会向CPU发出总线请求,CPU在现行机器周期结束后让出总线控制权,并且在传送期间的连续若干个存取周期内都不再访存,直到整个数据块传送完毕后,DMAC才把总线控制权还给CPU。

这种方式的特点是控制逻辑最简单,DMAC只要获得总线控制权就能“一口气”传完整个数据块,传送效率高。缺点也很明显:在传送期间,CPU完全无法访问主存,相当于整个系统都在等DMA搬完货。如果数据块很大、DMA传送又很频繁,CPU的执行效率会被严重拉低。

用食堂来类比:DMA开始端菜之后,整个窗口都被占了,CPU连从窗口拿调料都没办法,只能干等着。这种方式适合大批量高速数据传送,比如磁盘数据读入内存,系统本身可以容忍CPU短暂“暂停”。

3.2 周期挪用:用时间碎片交数据

周期挪用也叫周期窃取,思路和停止访存完全不同:DMAC并不是一次性占用总线传完整个数据块,而是每当I/O设备准备好一个数据,DMAC就向CPU申请一个存取周期,利用这个周期把数据传走,然后立刻释放总线,让CPU继续访存。

这里有两种具体情况。一种情况是CPU正在访存,DMAC请求到达,CPU会在本周期结束后暂停一个周期,把总线让给DMA;另一种情况是CPU暂时不在访存(比如正在执行不需要访问存储器的内部操作,像某些算术逻辑运算、寄存器操作),此时总线上没有数据传送活动,DMAC拿一个存取周期来传数据,CPU完全感觉不到被“打断”。

周期挪用的优点是对CPU的影响小,DMA只是“偷走”了一个个零散的存取周期,CPU绝大部分时间仍然在正常执行程序。缺点是因为每次只能传一个字或字节,而且DMA的申请时机要取决于设备的数据准备情况和CPU的访存状态,如果DMA请求总是碰不到可用的空闲周期,传送效率就会受影响。

这里有一个408常考的概念必须记住:在周期挪用的机制下,如果DMA和CPU同时请求访存,主存通常优先响应DMA。因为DMA传送的数据来自于高速I/O设备,如果数据已经准备好而DMA不能马上取走,设备缓冲区就可能溢出;而CPU少访存一个周期,影响的最多是执行速度,不会造成系统错误。这个优先级设计原则在判断题里经常出现,要特别注意。

3.3 交替访存:一人一个周期,互不打扰

交替访存方式把时间分成一个个等长的存取周期,CPU和DMAC轮流使用主存。也就是说,在每个存取周期结束后,总线控制权自动切换一次归属方——这个周期归CPU访存,下个周期归DMAC访存,再下一个周期又归CPU。这种方式其实已经不是“争夺”总线了,而是“分时共享”。

这种方式最大的好处是CPU和DMA都不需要等待,也不存在“请求—响应”的握手过程,因此硬件设计上省去了总线请求/允许的交互环节。但代价是硬件逻辑更复杂,从外部来看访存频率被强制减半,CPU在每个存储周期只能使用一次主存,要求CPU的访存频率不能太高,或者说CPU内部最好有足够多的缓存,降低对主存的依赖。

408考试中,三种方式的对比题属于“送分题”级别,但从历年情况看,失分率并不低。我总结过一个记忆方法:停止访存是“包场”,周期挪用是“插队”,交替访存是“排班”。“包场”效率高但耽误事,“插队”灵活但不稳定,“排班”公平但要硬件配合。答题时先看题目问的是“哪个CPU利用率最高”(通常答周期挪用或交替访存,视题目描述而定),还是“哪个控制最简单”(停止访存),基本就八九不离十。

4. 拆解DMA控制器:408喜欢问“它由哪几部分组成”

4.1 五大组成部分与对应寄存器

如果你看过王道或者唐朔飞的教材,会发现DMA控制器的结构图几乎长一个样。408偶尔会出题考察DMA控制器的功能组成,这些内容不算难,但比较零散,需要真正理解每个部件的职责,而不是死记名词。

  • 主存地址寄存器(MAR):存放DMA传送过程中要访问的主存地址。每传送一个字,地址自动加1,保证数据按顺序写入或读出。它对应的是传送过程中的“搬到哪里”。
  • 字计数器(WC):记录剩余待传送的字数。每传送一个字,计数器减1,减到0表示传送完毕,同时向中断机构发出信号。它对应的是“搬多少”。
  • 数据缓冲寄存器(DBR):用于暂存I/O设备与主存之间传送的数据,发挥缓冲和速度匹配作用。它对应的是“货从哪里卸到哪里”的临时中转区。
  • DMA控制逻辑:负责管理DMA的传送过程,包括向CPU发出总线请求、接收总线允许信号、控制地址修改和计数递减、发出读写命令等。它是整个DMAC的“指挥中枢”。
  • 中断机构:在字计数器归零时发出中断请求,通知CPU进行后处理。

有时候教材还会提到设备地址寄存器,存放I/O设备的编号或寻址信息,其实质是告诉DMAC本次传送对接哪个设备。

在408选择题中,常见的考察方式是给你一个描述,让你判断它是哪一部分的职责。比如“自动修改地址以便访问下一存储单元的是()”,答案就是主存地址寄存器;“传送结束时向CPU发出中断请求的是()”,答案是中断机构。这类题目不绕弯子,只要把部件的职责记清楚就能拿分。

4.2 从DMA硬件结构看“为什么数据不经过CPU”

很多同学不理解DMA“直接”二字到底体现在什么地方。对比程序中断方式就能看清:中断方式下,数据流动路径是“I/O设备 → CPU寄存器 → 主存”,每一步都要在CPU的运算器、寄存器里过一遍;而DMA方式下,数据流动路径是“I/O设备 → DMAC数据缓冲寄存器 → 主存”,CPU只是在外围“看着”,数据根本没进过CPU的通用寄存器。

这一点用硬件结构图看特别直观。DMAC内部有一根专门的数据通路,连接I/O接口和主存,传送数据时由DMAC自己发出读写控制信号,而不是CPU发出。CPU的作用仅限于在预处理时写几个寄存器的值,以及在后处理时响应一次中断。

在408厂商题里,偶尔会出现“DMA方式传送数据时数据流经CPU”这种干扰选项。如果你理解了硬件结构,就会明白这说法是有问题的——数据从设备到DMAC再到主存,全程绕开CPU运算器。当然,这里说的是数据本身不经过CPU,不是说CPU完全不用管,预处理和后处理仍然需要CPU参与,这两件事要分开理解。

5. DMA和中断的区别:每年必考的对比题

5.1 一张表搞定核心区别

DMA和中断是I/O控制方式中对比最频繁的一对概念。408里常以选择题形式让你找出“关于DMA方式描述错误的是哪项”,也以简答题形式让你“说明DMA与中断方式的主要区别”。下面这张表建议直接背下来,答题时按表内要点展开就不容易漏。

对比维度程序中断方式DMA方式
数据传送单位字或字节数据块
数据传送路径I/O设备 → CPU寄存器 → 主存I/O设备 ↔ DMAC ↔ 主存
CPU在传送中的角色必须执行中断服务程序逐字搬运预处理和后处理参与,传送过程不参与
响应方式指令执行周期结束后响应中断请求总线存取周期结束后响应总线请求
中断/请求频率每传一个字(字节)中断一次一个数据块传送结束后中断一次
应用场景低速设备,如键盘、打印机高速块设备,如磁盘、网卡、显卡
数据处理优先级相对较低相对较高(数据不及时处理可能丢失)

这张表背熟之后,绝大部分选择题都能直接“对号入座”。比如题目说“DMA方式也要通过中断服务程序完成数据传送”,对照表格就知道后半句是错的;题目说“DMA方式和中断方式一样,以字节为单位传送”,对照表格也能秒选正确项。

5.2 答题模板:简答题这样写不丢分

408计组简答题里如果考“简述DMA方式和程序中断方式的区别”,不要只写一两句话,尽量按三个层面展开。我当年考试总结的答题框架是这样的:

第一点说中断和DMA的触发机制不同。中断是I/O设备主动向CPU请求,CPU暂停当前程序去执行中断服务程序;DMA则是由DMAC向CPU请求总线控制权,获得总线后直接在主存和设备之间传送数据。

第二点说传送方式和数据通路不同。中断方式以字或字节为单位,数据经CPU寄存器中转;DMA方式以数据块为单位,数据直接在设备与主存之间传送,不经过CPU。

第三点说CPU开销不同。中断方式每传送一个数据单位都要打断CPU一次,CPU需要反复进行保护和恢复现场;DMA方式只在预处理和后处理阶段打扰CPU,大量数据传送期间CPU可以继续执行其他程序。

按照这个框架,结合表格里的细节展开,简答题基本能拿满踩分点。别小看这种“套路化”的答题结构,438考试踩点给分,你把关键术语“数据块”“不经过CPU”“仅预处理和后处理参与”全写到,老师想扣分都难。

6. 大题怎么答:从DMA传送计算到真题套路

6.1 选择题的经典陷阱盘点

我把这些年408考过的DMA选择题陷阱大概归了归类,几乎年年都是这几个坑在翻新:

第一个坑:传送单位。DMA以“数据块”为单位传送,不是“字”也不是“字节”。选项一旦出现“字为单位”,直接排除。

第二个坑:中断次数。DMA一个数据块传送完才发一次中断,不是每个字都中断。如果选项写“DMA每传送一个字需要CPU中断一次”,这是在混淆中断方式和DMA方式,要排除。

第三个坑:CPU的参与程度。DMA传送期间CPU不是完全不能执行程序,得看访存冲突处理方式。停止CPU访存方式下CPU确实不能访存,但周期挪用和交替访存方式下CPU基本可以正常执行程序。所以遇到“DMA工作期间CPU一定停止工作”这种绝对化表述,要谨慎判断。

第四个坑:初始化职责。DMA传送前由CPU对DMAC进行初始化配置,包括方向、地址、字计数等。有些选项把这部分说成“DMAC自动完成”或者“I/O设备完成”,都是错的。

第五个坑:优先级问题。DMA请求的优先级通常高于普通中断请求,因为DMA数据来自高速设备,不及时处理会丢数据。这在前文已经说过了,不能再栽在同样位置。

6.2 大题的计算套路:一行一行拆时间

408计组大题不会让你设计一个DMA控制器,最常考的还是结合磁盘、内存的时序或速率计算。基本的解题思路是抓住一条主线:DMA真正传送数据所花的时间,往往比设备本身的机械动作时间短得多,你要把这两段时间区分开。

举个例子说明。假设某磁盘转速为7200rpm,平均寻道时间为4ms,每扇区512字节,磁盘控制器与主存之间的数据传输率为10MB/s,现要读取一个扇区的数据。

先算磁盘把数据准备好要花多长时间。寻道4ms,旋转延迟按半圈算:7200rpm即7200转每分钟,一转是60/7200≈8.33ms,半圈约4.17ms。再加上读取一个扇区的时间:512B÷10MB/s=51.2us,约0.05ms。所以从CPU发起读请求到磁盘数据准备好,大约要8.22ms左右。这段时间CPU可以完全干别的,跟DMA一点关系都没有。

再算DMA搬运这些数据要多久。设一个存取周期为400ns,DMA每传一个字节占用一个存取周期,那么传送512字节需要512×400ns≈204.8us,约0.2ms。

这里的关键结论是:一次完整读扇区操作中,真正的DMA搬运时间占的比例很小,绝大部分时间是寻道、旋转延迟等机械动作。所以DMA方式下CPU的等待时间是极短的,系统有大量时间处理其他任务。反过来说,如果用程序查询方式,CPU要在这8.22ms里反复查询磁盘状态,整段时间都搭进去了,性能差距一目了然。

2024年408第45题也考了类似方向的内容,涉及DMA读取磁盘数据的分析和计算。网上很多回忆帖都提到这道题把DMA过程和磁盘转速、扇区读取结合起来考,本质上就是我上面这个套路:先把准备数据的时间算出来,再把DMA传送的时间算出来,最后讨论CPU在哪个时间段可以干别的、在哪个时间段会受到影响。掌握了这个主线,不管题目怎么变参数,都能从容应对。

6.3 实实在在的答题步骤建议

碰到DMA计算大题,我建议按下面四步走:

  1. 从题干中提取所有时间参数:转速、寻道时间、扇区大小、数据传输率、存取周期、每次DMA请求占用的周期数等。
  2. 区分“设备准备时间”和“DMA传送时间”,分别计算。设备准备时间一般包括寻道、旋转延迟、读写扇区时间;DMA传送时间等于数据量除以每单位数据所需的存取时间。
  3. 判断采用哪种访存冲突处理方式,这是最重要的得分点。停止访存方式下,CPU在DMA传送期间无法访存;周期挪用方式下,只有DMA实际占用总线的那些存取周期会影响到CPU。
  4. 最后把计算结果代入题目问题:求总耗时就用设备准备时间加DMA传送时间;求CPU受影响比例就用DMA占用周期数除以总周期数。

最后一步尤其容易出错,很多人把磁盘寻道时间也当成CPU被占用的时间,这是不对的。寻道期间DMA根本没在工作,CPU完全可以执行程序,只有真正的数据搬运阶段才存在总线竞争问题。

7. 从408考场到STM32开发板:DMA理论的真实落地

7.1 寄存器/结构体对应关系

如果你用过STM32并且配置过DMA,会发现嵌入式里的DMA外设和计算机组成原理课本上的DMAC几乎一一对应。这一节算是对理论知识的“落地验证”,也顺带帮那些既考研又做开发的同学把两套知识打通。

STM32的DMA控制器里几个核心配置项,和教材上的部件对照起来看非常清晰:

  • 外设地址寄存器(CPAR)和存储器地址寄存器(CMAR),对应教材里的设备地址和主存地址寄存器。
  • 传输数量寄存器(CNDTR),对应教材里的字计数器,每传一个数据单元减1,减到0触发传输完成事件。
  • 数据宽度设置(PSIZE/MSIZE),对应教材里数据缓冲寄存器的宽度匹配问题。外设8位、存储器32位时,DMA会按最小粒度逐次搬运。
  • 增量模式(PINC/MINC),对应教材里主存地址寄存器每传一次自动加1的行为。如果你接收串口数据到一个数组,存储器地址增量必须打开,否则每次写入同一个地址。
  • 循环模式(CIRC),相当于让DMA持续传送多个数据块,不需要CPU反复重新启动,对应“批量连续传送”的场景。
  • 传输完成中断(TC)和半传输中断(HT),对应教材里DMA中断机构的后处理通知机制。

我之前做一个串口接收项目的时候,用“UART空闲中断 + DMA接收”的方式处理不定长数据包,思路就是:DMA负责把串口数据寄存器里的字节自动搬到内存缓冲区,CPU完全不用管每个字节的接收;等到串口空闲了(一帧数据结束),触发空闲中断,CPU再从缓冲区里把完整的一帧数据取走处理。这个方案的技术内核,就是DMA方式中“预处理—硬件自动搬运—中断后处理”的完整流程,只是嵌入式里给它换了个名字叫“DMA+空闲中断”。

7.2 工程上踩过的坑

配置STM32的DMA时最容易踩的坑有三个,我印象特别深。

第一个坑是CNDTR不能在DMA使能状态下修改。ST官方手册明确要求,要修改传输数量必须先关闭DMA传输使能位,把CNDTR写好后重新使能,否则写入无效。这和教材里“字计数器在传送过程中由硬件自动修改,CPU不应干预”的逻辑是一脉相承的。你要是没关DMA就试图重设CNDTR,跑起来就会发现数据数量根本不是你设的值。

第二个坑是缓冲区大小和传输数量要精确匹配。DMA本身没有“边界感知能力”,它只按CNDTR设定的数量搬数据,搬完就触发完成事件。如果你给DMA设的传输数量大于缓冲区剩余空间,它就会把数据写穿,破坏相邻内存。这和DMA方式“以块为单位传送,一旦开始就要传完整块”的特性直接相关。

第三个坑是中断优先级。DMA传输完成中断要尽量配置成比普通外设中断更高的优先级,尤其在多路DMA同时工作时,要按数据实时性排序。否则高频率的数据流DMA传输完成中断被低优先级拖住,数据处理不及时,缓冲区就可能被覆盖。这个道理和408里“DMA请求优先级高于普通中断请求”完全一致,课本上的优先级原则在真实芯片中是实打实存在的。

把这些落地经验串起来看,408考DMA不是单纯的“死记硬背考点”,它背后是一个极其经典且至今仍在广泛使用的硬件机制。学的时候觉得抽象,进了嵌入式、操作系统这些领域回头再看,当初那些“为什么要有地址寄存器”“为什么字计数器减到零要发中断”的问题,答案全在实际硬件上写着。

我个人复习计组时最大的体会是:DMA这个知识点,不要把它当成一个孤立的题目考点去背,而是当成一条线索,从“CPU太忙”这个问题出发,顺着查询→中断→DMA这条演进路线捋下来,每一步都是为了解决上一步的某个痛点。捋完之后再去答题,选择题的陷阱一眼就能看穿,大题的参数怎么换都逃不出“预处理—硬件搬运—后处理”这个框架。408也好,以后的工程实践也好,这套思维方式比单纯记住结论有用得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询