8.CPU体系架构-DMA
DMA(Direct Memory Access)是一种直接内存访问技术,允许CPU不干预即可服务外设并提高系统效率。其通过物理地址传输数据至目标存储器空间,支持突发传输以增强吞吐量。使用DMA需注意虚拟地址与物理地址转换、缓存刷新及内存连续性问题。DMAC控制器用于配置源、目标地址及数据大小,并支持自动缓冲和描述符模式以优化性能。独立DMA芯片如8237A可实现动态存储器刷新及外部设备的数据传输控制。嵌入式系统中 DMA控制器作为独立外设可连接多通道并支持MemDMA(存储器到存储器)传输,通过FIFO缓冲提高效率,并可与内核协同工作以优化应用性能。
DMA本就不归类于CPU体系架构的知识点,但由于开发过程中经常需要用到相关知识而被引入到这里。因此,在这里我们对DMA的基本概念、工作原理以及常见问题进行介绍。
DMA概述
DMA 的英文缩略语为 "Direct Memory Access" ,中文译作 "直接内存访问" 。该技术主要体现在两个方面:一是实现内存与外围设备之间直接的数据传输;二是通过 dedicated hardware modules来完成该技术的实现。
其中,
DMA 控制逻辑的具体构成取决于计算平台的设计架构:
- 对于通用计算机如个人电脑(PC),其 DMA 控�制逻辑由 central processing unit(CPU)和 dedicated DMA interface logic chip 共同构成;
- 在嵌入式系统中,则采用 dedicated system-on-chip(Eco) architecture 来整合 DMA controller 直接嵌入处理器芯片内。
DMA内存访问技术
采用DMA的优势在于无需CPU介入即可直接服务于外围设备。这样一来 CPU便能专注于处理其他任务从而提升系统效能。针对这类较慢的设备(如UART)而言 DMA的作用仅在于减轻CPU负担 而而对于高速设备(如硬盘)则不仅能够减轻 CPU 的负担更能显著提升硬件吞吐能力。因为此类设备通常 CPU 无法快速提供所需数据 即使是传统存储访问方式对于ARM架构来说也面临着类似的挑战:由于其指令集设计限制 arm 处理存储操作需要借助暂存器作为中介从而增加了操作时间。而采用 DMA 方式则能够通过一次性传输多个字节大幅缩短存储操作的时间
使用DMA时我们必须要注意如下事实:
- DMA 采用物理地址而程序 采用虚拟地址。
- 因为程序 采用虚拟地址且通常依赖于缓存关系。
因此,在启动 DMA 传输之前必须确保缓存与主存之间的对应关系一致。 - 在系统长时间运行并分配较大内存空间时,在物理层上这些区域可能不连续。
因此,在每次 DMA 传输之前需要检查当前分区是否为单片连续区域,
如果不是,则需将该区域划分为多个独立分区进行处理。
DMAC的基本配置
在不以中央处理器为中心的情况下,DMA技术直接由专用控制器(即DMA控制器)搭建源与目标之间的传输通道。这一机制使得在处理大规模数据传输时能够释放出中央处理器的负载压力。对于PIC32系列微控制器而言,在内存空间内通过DMA功能可实现存储区与其他外围设备之间的互联配置,具体包括但不限于将存储区连接至SPI、UART或I2C等设备。关于DMA的相关特性与工作原理,请参阅相应的器件手册以获取详细信息。
| 地址寄存器 | 存放DMA传输时存储单元地址 |
|---|---|
| 字节计数器 | 存放DMA传输的字节数 |
| 控制寄存器 | 存放由CPU设定的DMA传输方式,控制命令等 |
| 状态寄存器 | 存放DMAC当前的状态,包括有无DMA请求,是否结束等 |
独立DMA控制芯片
作为该课程的一个核心知识点,在学习《微机原理》时,学生将会接触到单片独立DMA控制器芯片8237A这一重要设备。本节将详细阐述该片控制器各通道如何实现对PC系统内设备的数据传输管理。
- CH0负责动态存储器的刷新操作
- CH1留出供用户使用的空间
- CH2用于软盘驱动器数据传输的DMA控制
- CH3用于硬盘驱动器数据传输的DMA控制
嵌入式设备中的DMA
DMA控制器是一种在系统内部实现数据转移的关键功能模块,在芯片设计中占据重要地位。作为一类通过专用总线网络实现内外部存储器互联的核心组件,在具备DMA能力的外围设备中发挥着不可替代的作用。值得注意的是,在实际应用中只有面对数据吞吐量规模较大(如每秒千比特或更高)的情形下才有必要配备这种技术特性;这类技术在视频处理、音频解码以及网络通信等场景中都有典型应用实例。
通常情况下, DMA控制器会包含一条地址总线, 一条数据总线以及控制寄存器. 高效的DMA控制器具备访问所需资源而不依赖处理器的能力. 它无需处理器直接参与. 最终要求其能在内部计算出所需的地址位置.
一个处理器能够集成多个DMA控制器。每个控制器都拥有多个DMA通道,并通过多条直接连接至存储器站(memory bank)及外设的总线实现通信(如图1所示)。在高性能处理器中通常会集成两种类型的DMA控制器:第一类被称为系统DMA控制器(System DMA),其特点是能够访问任何资源(包括外设与存储器),其计时基准为系统时钟(SCLK),以ADI的Blackfin处理器为例,则可达到最高133MHz的操作频率。第二类为内部存储器DMA控制器(IMDMA),这种控制器专门用于内部存储器之间的互连操作。由于所有存取操作均发生在内部(如L1-L1、L1-L2或L2-L2接口),因此其计时基准为核内时钟(CCLK),该时钟的速度甚至可以超过600MHz。
所有DMA控制器均配备一组FIFO用于实现对外设或存储器的数据缓冲功能。在MemDMA机制下其源端与目标端均设有 dedicated FIFOs以保证内存相关操作的高效执行。在资源受限的情况下无法完成数据传输时可将数据暂存于该FIFO中以提升性能
由于在代码初始化阶段通常会配置DMA控制器以支持高效的内存访问模式,在这种情况下主处理器的核心就可以专注于处理其他基础任务而不必频繁中断。另一方面你能够通过编程实现DMA控制使其与核心处理器并行操作以实现数据传输从而释放主处理器去执行其基本的处理任务这些由核心处理器专注于处理的基础任务。

在一个优化的应用中, 内核始终无需参与任何数据的移动, 仅对位于L1缓存中的数据进行读写操作. 因此, 在内核准备执行读取操作之前, 它无需等待数据的到来. DMA引擎会预先准备好所需的数据. 图2展示了处理器与DMA控制器之间的交互关系. 由处理器执行的操作步骤主要包括: 建立传输通道并启用中断处理. 通过处理器的中断输入端口可以接收到来自DMA控制器的状态反馈信号.

数据除了与外设交互之外,在处理过程中还需要实现不同存储空间之间的转换。例如, 视频源可以直接通过视频端口连接至L3存储器, 由于工作缓冲区的空间限制, 占据该区域会导致无法完成转移操作。为了避免处理器在每一次计算时都需要从外部存储获取像素信息, 因此设计了一种机制——通过内存对内存(MemDMA)的方式将像素转移到L1或L2缓存内存中。
截至当前为止, 我们主要致力于数据传输, 但DMA传输功能并非专一于此.
在最简单的MemDMA配置中,请您告知DMA控制器源端口所在的存储位置、目标存储位置以及需要传送的数据总量。对于每次的数据传送量可以选择8位、16位或12位这三种规格中的任意一种。通过调整每次数据传送的具体数量即可显著提升DMA系统的灵活性。例如,在采用非单一数据量传输策略时,请注意每完成一次32位的数据块跨越4个采样点的情况下,则每一次完成之后将触发16字节(即4个32位数据块)的位置增量。
DMA的设置
目前主要采用两种不同的DMA传输机制:寄存器工作方式与描述符工作方式。无论采用何种类型DMA机制,在dma控制器中均会呈现以下几种关键信息。在使用寄存器工作方式时,dma控制器仅依赖预先配置于各寄存器中的相应参数值进行操作。对于采用描述符工作方式,dma控制器需访问系统存储以获取自身所需配置参数。
基于寄存器的DMA
在基于寄存器实现的DMA结构中,处理器通过控制DMA控制寄存器以触发数据传输操作。采用基于寄存器的DMA设计能够显著提升控制器性能,在此方案下,每个寄存器无需反复从存储空间加载描述符信息,并且核心也不会持续维护描述符列表。
基于寄存器实现的直接内存访问(DMA)系统由两种核心操作模式构成:一种是自动缓冲(Autobuffer)模式另一种是停止模式。在自动缓冲模式下接收方完成一个数据块的接收时控制器会启动相应的处理流程控制寄存器会自动回到初始配置状态该DMA操作无需重启且不会产生任何额外资源消耗。
如图3所示,在外设向L1数据存储器中的缓冲区传输固定长度的数据时
自动缓冲DMA主要用于处理具有连续数据流量的任务,在不影响处理器正常运行的前提下实现高效的数据传输。该控制器设计巧妙地实现了从外部设备接收数据的能力,并能在每次传输完成之后触发内部核的中断机制以进行同步操作。
停止模式的工作机制与自动缓冲DMA具有相似之处,并其主要区别在于各寄存器在完成DMA操作后不会被重新加载这一特点的存在。因此,在完成一次DMA传输后就不会再次发生传输动作。这种模式特别适用于基于特定事件的一次性数据传输场景,在这种情况下它能够有效减少不必要的操作次数。例如,在非周期性的数据块转移需求下就可以发挥显著作用。当需要确保事件的时间顺序时(例如某个任务必须在下一次传输前完成),这种模式同样表现出色,并能保证事件发生的先后次序得到正确执行。此外,在初始化缓冲器方面也具有重要意义。
描述符模型
为了实现基于描述符(descriptor)的要求,在存储器预存一组必要的参数以便启动一系列 DMA 操作。这些被包含于该描述符中的参数与通常通过程序配置 DMA 控制寄存器组的所有参数一致。然而,在采用基于描述符进行的操作时可以串行处理多个 DMA 操作序列以提高效率。在这样的操作流程设计下,在完成当前的操作序列后系统会自动设置并启动下一个 DMA 传输任务。这种基于描述符的方法不仅简化了系统的配置过程还显著提升了系统对 DMA 传输管理的能力和可扩展性。
ADI 处理器中的Blackfin架构集成了两大类功能模块——描述符阵列与描述符列表。它们旨在追求在性能与灵活性之间的权衡。
