ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

DMA总线占用方式详解:周期挪用与408考点解析

DMA总线占用方式详解:周期挪用与408考点解析 1. 从一道408真题说起DMA到底在考什么如果你正在啃计算机组成原理尤其是唐朔飞那本教材或者王道复习指导翻到I/O那一章的时候大概率会被一堆控制方式搞得头大——程序查询、程序中断、DMA、通道名字听着都差不多但考试就爱在这几个地方挖坑。2024年408第45题考的就是DMA相关的知识点不少人在考场上看到“周期挪用”“总线占用”这些词直接懵了。我当年复习这块的时候也是反复卡壳后来把DMA的工作机制拆成“数据通路”和“控制通路”两条线来看才算是真正搞明白了。这篇内容就是把我自己踩过的坑、总结的理解框架、以及做题时最实用的判断技巧全部摊开来讲。不管你是正在准备408考研还是学STM32时用到串口DMA、SPI DMA想回头补理论又或者单纯想搞清楚“为什么DMA能解放CPU”这个问题下面的内容应该都能帮到你。DMA全称Direct Memory Access直接存储器访问。核心思想特别朴素既然外设和主存之间传数据这件事本身不需要CPU做运算那为什么要让CPU一遍遍执行“读—写”指令来搬运找个专门的硬件控制器来干这个体力活CPU只负责在开始的时候交代一句“从哪搬到哪、搬多少”搬完了通知我一声就行。这个“专门的硬件控制器”就是DMA控制器DMAC。但这里有个关键问题DMAC要占用总线而总线是CPU和主存交换数据的唯一通道。DMAC什么时候占总线、占多久、怎么跟CPU抢这就是408考试最爱考的地方也是理解DMA方式的核心。2. DMA的三种总线占用方式为什么周期挪用最常考2.1 停止CPU访存最简单但最浪费这种方式理解起来最直观DMAC要传数据了直接给CPU发一个信号CPU收到后暂停对总线的使用把总线控制权完全交给DMAC。等DMAC把一整块数据传完再把总线还给CPU。你可以把它想象成你在书房里看书CPU执行程序快递员DMAC要往书架上放东西他直接跟你说“你先别看了让我放完你再继续”。你只能放下书等着啥也干不了。这种方式的优点是控制简单DMAC不需要跟CPU争抢拿到总线就独占。但缺点也很明显——CPU的利用率极低。如果DMAC要传1MB的数据CPU就得干等1MB传完这期间程序完全停摆。在实际系统中除了极少数对数据传输实时性要求极高、且数据量很小的场景基本不会用这种方式。408考试里这种方式通常作为“对比项”出现让你判断“哪种方式CPU利用率最低”答案就是它。2.2 周期挪用周期窃取考试重点中的重点这是DMA最常考的总线占用方式也是实际系统中最常用的。核心思路是DMAC不要求CPU长时间停机而是在CPU不用总线的时候“偷”一个或几个总线周期来传数据。具体来说CPU执行指令的过程中并不是每个时钟周期都在访问主存。比如执行一条加法指令取指阶段需要访存但译码、执行阶段可能完全在CPU内部操作不碰总线。DMAC就趁这些空隙挪用一两个总线周期完成一次数据传送。传完之后CPU继续用总线双方交替进行。这里有个关键细节周期挪用可能发生在两种时机。一种是CPU刚好不访存DMAC直接用双方互不干扰另一种是CPU正在访存DMAC也要用这时候DMAC会向CPU发一个“总线请求”信号CPU在当前总线周期结束后让出总线DMAC用完一个周期后立刻归还。注意是“用完一个周期就还”不是“传完一整块才还”。为什么这种方式最常考因为它涉及几个容易混淆的概念周期挪用 vs 周期窃取很多教材混用这两个词但严格来说“挪用”强调的是利用CPU不访存的空闲周期“窃取”强调的是从CPU正在使用的周期中强行插入。408考试中一般不做严格区分但你要知道这两个说法指的是同一类机制。DMA传送对CPU的影响周期挪用方式下CPU会感觉“内存访问偶尔变慢了一点”但程序不会中断。这跟停止CPU访存有本质区别。优先级问题当DMAC和CPU同时请求访存时DMAC的优先级更高。为什么因为外设的数据传送往往有实时性要求比如磁盘读出的数据如果不及时写入主存下一批数据就覆盖过来了。CPU晚一个周期访存没关系程序又不会跑掉。我个人的记忆口诀是“停CPU最慢周期挪用最巧交替访问最快但最贵”。考试里问你“DMA方式中CPU利用率最高的是哪种”答案就是周期挪用或交替访问取决于题目选项。2.3 交替访问理论最优但硬件成本高这种方式把总线时间分成固定的小片比如每个总线周期分成两半前半段给CPU用后半段给DMAC用。双方各用各的互不干扰也不需要总线请求和应答信号。听起来很完美对吧CPU和DMAC都能满负荷工作谁也不等谁。但问题在于主存的存取速度必须足够快快到能在一个总线周期内完成两次独立的访存操作。如果主存本身速度就不够强行分时只会导致双方都变慢。另外这种方式需要更复杂的时序控制电路硬件成本明显高于前两种。所以在实际系统中交替访问用得并不多更多是作为一种理论模型出现在教材里。408考试中它通常作为“CPU和DMAC并行工作”的典型代表出现让你判断“哪种方式下CPU不停止执行程序且DMAC也不需要等待”。2.4 三种方式对比速查对比维度停止CPU访存周期挪用交替访问CPU是否暂停完全暂停不暂停偶尔延迟不暂停总线控制权DMAC独占交替使用固定分时CPU利用率最低较高最高硬件复杂度最简单中等最复杂适用场景极少量高速数据大多数实际系统高速主存系统408考查频率中高中这张表建议直接背下来选择题里只要出现“CPU利用率”“总线控制权”“硬件复杂度”这几个关键词对照表格就能快速锁定答案。3. DMA控制器的内部结构寄存器里藏着考点3.1 三个核心寄存器及其作用DMAC不是凭空工作的它内部有几个关键寄存器每个都有明确的职责。408考试中经常给出寄存器初值让你计算传送次数或者判断传送方向。主存地址寄存器AR存放数据在主存中的起始地址。每传送一个数据这个寄存器的值自动加1或减1指向下一个存储单元。注意这个“自动加1”是DMAC硬件完成的不需要CPU干预。字计数器WC存放还需要传送的数据个数。每传送一个数据计数器减1。当计数器减到0时DMAC向CPU发出“传送结束”信号通常是一个中断请求。这里有个容易错的点计数器减到0表示传送完成而不是减到负数。如果初始值是100传送100个数据后计数器变为0此时触发结束信号。数据缓冲寄存器DBR暂时存放正在传送的数据。外设的数据先送到DBR再从DBR写入主存或者从主存读出到DBR再送到外设。这个寄存器的作用是缓冲速度差异外设和主存的速度往往不匹配有了DBR可以平滑数据传输。除了这三个DMAC还有控制/状态寄存器用来存放控制信息如传送方向、是否允许中断和状态信息如是否正在传送、是否有错误。以及DMA请求触发器和中断机构分别用于接收外设的请求和向CPU发中断。3.2 数据传送方向谁到谁的问题DMA传送有两个方向考试里经常用“读/写”来混淆你外设到主存写主存外设准备好数据后向DMAC发请求。DMAC向CPU申请总线获得总线控制权后从外设读取数据放入DBR再将DBR中的数据写入主存指定地址。这个过程叫“DMA写”或者“外设读”。主存到外设读主存DMAC从主存读出数据放入DBR再送到外设。这个过程叫“DMA读”或者“外设写”。注意这里的命名容易绕晕“DMA读”指的是DMAC从主存读数据而不是从外设读。408选择题里经常在这里设陷阱给你一个场景问“此时DMAC执行的是读操作还是写操作”一定要看清楚主语是谁。我自己的记忆方法是站在DMAC的角度看数据从主存流向DMAC就是读从DMAC流向主存就是写。外设只是数据的起点或终点不参与“读/写”的命名。3.3 传送过程的时间线把DMAC的工作拆成时间线更容易理解它和CPU的配合关系预处理阶段CPU初始化DMAC设置AR主存起始地址、WC传送字数、传送方向、是否允许中断等。这一步是CPU用指令完成的属于程序控制。DMA请求外设准备好数据或准备好接收数据后向DMAC发DMA请求信号。总线请求DMAC收到请求后向CPU发总线请求信号HOLD。总线响应CPU在当前总线周期结束后发出总线响应信号HLDA让出总线控制权。数据传送DMAC获得总线控制权完成一次数据传送外设↔DBR↔主存。每传一个数据AR加1WC减1。释放总线一次数据传送完成后DMAC释放总线周期挪用方式下立即释放停止CPU方式下等全部传完才释放。结束处理当WC减到0时DMAC向CPU发中断请求。CPU响应中断执行中断服务程序做数据校验、决定是否继续传送等收尾工作。这个时间线里第5步是DMA的核心也是考试最爱考的地方。你要能说清楚数据不经过CPU直接在DMAC控制下从外设到主存或反向CPU只在开始和结束的时候参与。4. DMA与中断的配合为什么DMA结束还要中断4.1 DMA方式并没有完全脱离CPU很多人初学DMA时会有一个误解既然DMA是“直接存储器访问”那CPU是不是完全不用管了答案是否定的。DMA只是在数据传送阶段不需要CPU干预但传送前和传送后都需要CPU参与。传送前CPU要初始化DMAC的各个寄存器告诉它“从哪搬到哪、搬多少、往哪个方向搬”。传送后CPU要处理DMAC发来的中断做数据校验、决定下一步操作比如是否继续传送下一块数据、是否通知应用程序数据已就绪。所以DMA和中断不是替代关系而是配合关系。DMA负责高效搬运数据中断负责在关键时刻通知CPU。两者结合才能既保证传送效率又保证CPU能及时响应。4.2 中断在DMA中的两个作用在DMA传送过程中中断主要出现在两个地方传送结束中断当WC减到0时DMAC向CPU发中断请求。CPU响应后执行中断服务程序。这个中断的作用是告诉CPU“你要的数据已经全部搬完了可以来处理了”。比如磁盘读操作DMA把一整块数据从磁盘搬到主存后发中断通知CPUCPU再决定是把数据交给应用程序还是继续读下一块。传送错误中断如果传送过程中出现错误如外设故障、主存校验错DMAC也会向CPU发中断。CPU响应后执行错误处理程序比如重传、报错、切换备用设备等。这里有个408常考的细节DMA中断和普通中断的优先级关系。一般来说DMA请求的优先级高于中断请求因为DMA传送有实时性要求不能等。但DMA结束中断的优先级和普通中断一样按中断优先级排队。4.3 中断服务程序里做什么DMA结束后的中断服务程序通常包括以下步骤保护现场保存CPU寄存器的值以便中断返回后继续执行原程序。检查传送状态读取DMAC的状态寄存器判断传送是否成功、是否有错误。数据校验对传送的数据做校验如CRC校验、奇偶校验确保数据完整性。处理数据根据应用需求可能将数据从缓冲区复制到用户空间、唤醒等待的进程、或者启动下一次DMA传送。恢复现场恢复CPU寄存器的值执行中断返回指令。注意中断服务程序本身也是CPU执行的指令所以DMA并没有让CPU完全“闲着”。但相比程序查询方式中CPU反复执行“读状态—判断—传送”的循环DMA方式下CPU只需要在开始和结束的时候介入中间的时间可以执行其他任务效率提升是数量级的。5. 从408到实际芯片DMA在STM32中的体现5.1 STM32的DMA控制器架构如果你学过STM32会发现它的DMA控制器和408教材里的DMAC模型高度一致只是多了很多工程上的细节。以STM32F103为例它有DMA1和DMA2两个控制器每个控制器有多个通道每个通道可以独立配置。STM32的DMA通道配置包括外设地址数据从哪个外设来或到哪个外设去比如串口的DR寄存器、ADC的DR寄存器。存储器地址数据在主存中的起始地址。传输方向外设到存储器、存储器到外设、存储器到存储器。数据宽度外设和存储器的数据宽度可以不同字节、半字、字DMA会自动处理对齐。传输数量要传多少个数据对应408里的WC。优先级多个通道同时请求时的仲裁顺序。循环模式传完后是否自动重新开始对应408里的“自动重装”概念。你会发现408里学的AR、WC、DBR、控制寄存器在STM32里都能找到对应的配置项。理论学好了看芯片手册会快很多。5.2 串口DMA发送的实操配置以STM32串口DMA发送为例配置流程大致如下// 1. 使能DMA时钟和串口时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 2. 配置DMA通道 DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)USART1-DR; // 外设地址 DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)txBuffer; // 主存地址 DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST; // 方向主存到外设 DMA_InitStructure.DMA_BufferSize sizeof(txBuffer); // 传输数量 DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; // 外设地址不增 DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; // 主存地址递增 DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode DMA_Mode_Normal; // 普通模式 DMA_InitStructure.DMA_Priority DMA_Priority_Medium; DMA_Init(DMA1_Channel4, DMA_InitStructure); // 3. 使能串口DMA发送 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); // 4. 使能DMA通道 DMA_Cmd(DMA1_Channel4, ENABLE); // 5. 等待传输完成 while(DMA_GetFlagStatus(DMA1_FLAG_TC4) RESET); DMA_ClearFlag(DMA1_FLAG_TC4);这段代码里DMA_BufferSize对应408里的WCDMA_MemoryBaseAddr对应ARDMA_DIR对应传送方向。配置完成后CPU只需要启动DMA然后就可以去执行其他任务。串口每发送完一个字节DMA自动从主存取下一个字节送到串口DR寄存器直到全部发完。5.3 周期挪用在实际芯片中的体现STM32的DMA控制器和CPUCortex-M3/M4共享总线矩阵。当DMA和CPU同时访问同一块存储器时总线仲裁器会根据优先级决定谁先访问。DMA通道可以配置优先级低、中、高、非常高高优先级的DMA请求会优先获得总线。这对应408里的“周期挪用”机制DMA在CPU不访存的时候使用总线如果冲突则根据优先级仲裁。Cortex-M系列的总线矩阵支持并行访问不同的从设备如CPU访问FlashDMA访问SRAM这种情况下双方完全不冲突效率更高。实际调试时如果你发现DMA传输导致CPU性能下降明显可以检查两点一是DMA和CPU是否访问同一块存储器二是DMA优先级是否设置过高。把DMA数据缓冲区和CPU频繁访问的数据放在不同的SRAM区域往往能明显改善。6. 常见问题与排查技巧实录6.1 408选择题里最容易踩的坑坑一混淆“DMA请求”和“中断请求”。DMA请求是外设向DMAC发的中断请求是DMAC或外设向CPU发的。考试里经常把这两个信号混在一起让你判断。坑二误以为DMA传送完全不经过CPU。数据确实不经过CPU的寄存器但DMAC的初始化、结束处理都需要CPU执行指令。选择题里如果出现“DMA方式下CPU完全不参与”这种表述直接判错。坑三周期挪用和停止CPU访存的区别。周期挪用是“偷一个周期就还”停止CPU访存是“全部传完才还”。题目里如果强调“CPU偶尔暂停一个总线周期”选周期挪用如果强调“CPU完全停止工作”选停止CPU访存。坑四DMA传送对CPU的影响。周期挪用方式下CPU执行程序的速度会略微变慢因为偶尔要让出总线但程序不会中断。这个“略微变慢”在考试里经常被忽略但确实是理解DMA效率的关键。6.2 实际调试DMA时的常见问题问题现象可能原因排查方法DMA传输不启动通道未使能、外设DMA请求未开启检查DMA_Cmd和USART_DMACmd等使能函数传输数据错位数据宽度配置不匹配检查外设和存储器的DataSize是否一致传输数量不对BufferSize设置错误确认BufferSize是“数据个数”而非“字节数”传输完成但数据不对地址递增配置错误检查PeripheralInc和MemoryIncCPU性能下降明显DMA和CPU访问同一存储器调整数据缓冲区位置或DMA优先级传输一半停止总线错误、外设故障检查DMA错误标志和状态寄存器6.3 独家避坑技巧技巧一DMA缓冲区对齐。在STM32中如果数据宽度是半字16位或字32位缓冲区地址最好按相应宽度对齐。不对齐可能导致传输效率下降甚至硬件错误。我一般用__attribute__((aligned(4)))来确保对齐。技巧二循环模式下的缓冲区管理。串口接收用DMA循环模式时DMA会不断覆盖缓冲区。你需要用“半传输中断”和“传输完成中断”来分段处理数据否则会丢失数据。具体做法是缓冲区大小设为2的幂次半传输中断处理前半段传输完成中断处理后半段。技巧三DMA和Cache的一致性问题。如果你的芯片有Cache如Cortex-M7DMA直接访问主存可能绕过Cache导致数据不一致。解决方法是在DMA传输前后执行Cache清理或无效化操作。这个坑在408里不考但实际工程中非常致命。技巧四408做题时先画时间线。遇到DMA相关的计算题先在草稿纸上画出“CPU执行—DMA请求—总线仲裁—数据传送—中断处理”的时间线把每个阶段的时间标注出来再计算总时间。这样不容易漏掉任何一个环节。7. 几个容易混淆的概念辨析7.1 DMA与通道的区别408教材里DMA之后通常会讲“通道”和“I/O处理机”。通道可以理解为“增强版的DMA控制器”它不仅能搬数据还能执行通道指令控制多台外设。DMA控制器通常只控制一台或几台同类外设功能相对单一。考试里如果问“哪种方式CPU参与最少”答案是I/O处理机CPU几乎完全不参与如果问“哪种方式适合高速外设成块传送”答案是DMA如果问“哪种方式可以控制多台不同类型外设”答案是通道。7.2 DMA与程序中断的区别程序中断方式下数据传送仍然需要CPU执行指令中断服务程序里做数据搬运只是CPU不需要反复查询状态。DMA方式下数据传送完全由硬件完成CPU只在开始和结束的时候介入。从数据通路看中断方式的数据经过CPU寄存器外设→CPU→主存DMA方式的数据不经过CPU外设→DMAC→主存。这是两者最本质的区别也是考试最爱考的点。7.3 DMA与程序查询的区别程序查询方式下CPU反复执行“读状态—判断—传送”的循环CPU利用率极低。DMA方式下CPU只在开始和结束的时候介入中间可以执行其他任务。从CPU利用率看DMA远高于程序查询。但要注意程序查询方式硬件最简单DMA需要额外的DMAC硬件。考试里如果问“硬件成本最低的是哪种”答案是程序查询如果问“CPU利用率最高的是哪种”答案是DMA或通道/I/O处理机取决于选项。8. 从考试到工程DMA思维的实际价值学DMA不只是为了考试。在实际工程中DMA思维无处不在。比如你做数据采集ADC连续采样产生大量数据如果用CPU逐个读取CPU几乎被占满。用DMA让ADC自动把数据搬到内存CPU只在缓冲区满的时候处理一次效率提升几十倍。再比如网络通信网卡收到数据包后用DMA直接写入主存CPU只需要处理协议栈。如果没有DMA每个数据包都要CPU搬运网络吞吐量会惨不忍睹。甚至在你用手机的时候屏幕刷新、音频播放、摄像头采集背后都有DMA在默默工作。CPU之所以能同时处理这么多任务很大程度上是因为DMA帮它分担了数据搬运的体力活。我个人的体会是DMA的核心思想是“让专业的硬件做专业的事”。CPU擅长运算和逻辑判断不擅长大量数据的搬运。把搬运交给DMACCPU就能专注于它真正擅长的事情。这个思想在计算机体系结构中反复出现——Cache让CPU专注于运算而不必频繁访存流水线让CPU各部分并行工作多核让多个CPU协同处理任务。理解了DMA你对计算机体系结构的理解会上一个台阶。最后分享一个我复习408时的小技巧每学完一种I/O控制方式就画一张对比表把“CPU干预程度”“数据通路”“硬件复杂度”“适用场景”四个维度列出来。程序查询、程序中断、DMA、通道四种方式放在一起对比考试里不管怎么出题你都能快速定位。这张表我考前看了不下二十遍最后考试时遇到I/O相关的选择题基本是秒选。
返回列表