2. DMA基础概念

在嵌入式与SoC系统中,CPU的核心价值在于运算与决策,而不是充当数据搬运工。当外设需要与内存之间频繁交换大量数据时,如果每一次传输都由CPU亲自执行,系统性能会被严重拖累。DMA(Direct Memory Access,直接内存访问)正是为解决这一矛盾而生的机制:它允许外设在DMA控制器的协助下,直接与内存进行数据读写,而CPU只需在传输开始前配置参数、在传输结束后处理结果。

2.1 DMA的核心原理

DMA的本质是“总线主设备”的转移。在传统PIO模式下,CPU是唯一的总线主设备,所有数据搬运都要经过CPU的寄存器;而在DMA模式下,DMA控制器(DMAC)成为独立的总线主设备,它可以主动发起读写事务,直接访问源地址和目标地址。

一次典型的DMA传输包含四个阶段:

  1. 配置阶段:CPU通过寄存器接口写入源地址、目标地址、传输长度、数据宽度、传输模式等参数。
  2. 请求阶段:外设通过DMA请求线(如UART的RX Ready、ADC的转换完成)向DMAC发出传输请求。
  3. 搬运阶段:DMAC获得总线授权后,从源地址读取数据并写入目标地址,每次搬运可配置为单次、突发或整块传输。
  4. 完成阶段:传输计数归零后,DMAC置位完成标志并产生中断,通知CPU进行后续处理。
关键理解:DMA并不“绕过”总线,而是“接管”总线。它和CPU一样是总线主设备,因此必须处理总线仲裁、地址对齐、传输边界等与总线相关的问题。
DMA传输路径与总线主设备切换 CPU 配置 / 中断处理 DMAC 总线主设备 外设 UART / ADC / SPI 内存 SRAM / DDR 系统总线 / 总线矩阵 DMA请求 完成中断 数据直接写入内存

2.2 DMA与CPU中断、PIO的对比

理解DMA的价值,最有效的方式是与PIO(Programmed I/O)和中断驱动I/O进行对比。三者的核心差异在于“谁在执行数据搬运”以及“CPU介入的频率”。

对比维度 PIO(程序控制I/O) 中断驱动I/O DMA
数据搬运者 CPU CPU(中断服务程序中) DMAC
CPU介入频率 每个字节/字 每次中断 每次传输块
CPU开销 极高 中等 极低
适用数据量 小数据、低速 中等数据、事件驱动 大数据、高速流
典型场景 GPIO翻转、调试串口 按键、传感器事件 音频流、图像采集、网络包
总线占用 CPU全程占用 CPU间歇占用 DMAC占用,CPU可并行运算

从表中可以看出,DMA的核心优势不是“更快”,而是“解放CPU”。在高速数据流场景中,CPU如果被绑定在搬运工作上,就无法同时执行算法、协议栈或控制逻辑。DMA让CPU从搬运工变成指挥官。

2.3 典型应用场景

DMA在嵌入式系统中几乎无处不在,以下是几个最具代表性的场景:

  • 高速ADC连续采样:ADC以固定采样率持续输出数据,DMA将每次转换结果自动写入内存缓冲区,CPU只需在缓冲区半满或全满时处理数据。
  • UART大数据收发:在115200bps甚至更高速率下,逐字节中断会消耗大量CPU周期;DMA可以按块接收,显著降低中断频率。
  • 音频播放与录音:I2S接口需要持续、稳定的数据流,DMA通过双缓冲机制保证音频不中断。
  • 图像传感器数据搬运:摄像头输出的一帧图像可达数百KB到数MB,DMA将像素数据直接写入帧缓冲区,CPU只负责图像处理。
  • 网络数据包收发:以太网MAC通过DMA将接收到的数据包写入内存,CPU处理协议栈而非搬运字节。
在音频和视频场景中,DMA常与“双缓冲”或“环形缓冲”配合使用:当DMA填充缓冲区A时,CPU处理缓冲区B;两者交替进行,实现流水线式的连续处理。

2.4 性能指标与配置参数

评估一个DMA控制器的性能,不能只看“能不能搬”,还要看“搬得多快、多稳、多省”。以下是关键性能指标:

典型DMA配置参数示例:
- 源地址:0x2000_0000(ADC数据寄存器)
- 目标地址:0x2000_1000(内存缓冲区)
- 传输长度:1024 字节
- 数据宽度:16 位(半字)
- 传输模式:循环模式(Circular)
- 优先级:高
- 中断使能:半传输中断 + 传输完成中断
- 突发长度:4 拍

性能指标:
- 吞吐量:单位时间内搬运的字节数(MB/s)
- 总线占用率:DMAC占用总线的时间比例
- 传输延迟:从请求到数据落地的响应时间
- CPU占用率:CPU用于DMA配置和中断处理的时间占比
- 通道数:支持并发传输的独立通道数量

其中,吞吐量和总线占用率是一对需要权衡的指标。DMAC如果长时间占用总线,会阻塞CPU取指和访存,导致系统实时性下降。因此,现代DMAC通常支持突发传输、总线仲裁优先级和通道优先级,以在吞吐量和公平性之间取得平衡。

2.5 常见误区与复盘

误区一:DMA一定比中断快。对于极少量数据(如几个字节),DMA的配置开销可能超过直接中断搬运。DMA的优势在大数据块和高速流场景中才明显。
误区二:DMA传输不需要CPU参与。DMA只是不需要CPU搬运数据,但配置、启动、中断处理和错误恢复仍然需要CPU。CPU的职责从“执行者”变成了“管理者”。
误区三:忽略缓存一致性问题。在带Cache的系统中,DMA直接访问内存,可能绕过Cache,导致CPU读到旧数据。必须通过Cache无效化、写回或使用非缓存区域来保证一致性。

复盘来看,DMA的设计本质是在“通用性”和“效率”之间做取舍。CPU是通用处理器,适合复杂逻辑;DMAC是专用搬运引擎,适合规则、重复、高吞吐的数据移动。理解这一点,才能在RTL微架构设计中合理划分CPU与DMAC的职责边界,为后续可配置DMA控制器的通道管理、描述符解析和总线接口设计打下基础。