1. DMA 基础概念

直接存储器访问(Direct Memory Access, DMA)是嵌入式系统中一项关键的硬件机制,它允许外设与存储器之间直接交换数据,而无需 CPU 逐字节或逐字地参与搬运。理解 DMA 的工作原理、与 CPU 搬运的差异以及适用场景,是掌握后续 dmaengine 接口编程与环形缓冲区设计的基础。

1.1 DMA 工作原理

DMA 传输的核心思想是:将数据搬运的控制权从 CPU 转移给一个专用的硬件引擎——DMA 控制器(DMAC)。CPU 只需配置好传输的源地址、目的地址、数据长度和触发条件,然后启动 DMA 通道,后续的数据搬运工作由 DMAC 独立完成,传输结束时通过中断或轮询通知 CPU。

关键角色: DMA 控制器、系统总线(AHB/AXI)、源设备(内存或外设 FIFO)、目的设备(外设 FIFO 或内存)、中断控制器。
DMA 传输系统架构 CPU 配置 & 启动 DMA 控制器 通道调度 + 地址生成 系统内存 源 / 目的缓冲区 外设 FIFO SPI / UART / ADC 中断控制器 传输完成通知 配置描述符 读 / 写总线 读 / 写总线 完成信号 IRQ 通知 ① CPU 配置 DMA 描述符 → ② DMA 独立搬运数据 → ③ 传输完成触发中断 → ④ CPU 处理完成事件

1.2 DMA 与 CPU 数据搬运的区别

CPU 搬运数据通常采用“加载-存储”循环(Load-Store Loop),即从源地址读取一个数据字,再写入目的地址,重复直到传输完成。DMA 搬运则完全由硬件状态机驱动,不占用 CPU 的指令执行流水线。下表从多个维度对比两种方式:

对比维度 CPU 搬运(PIO) DMA 搬运
执行主体 CPU 核心(指令流水线) DMA 控制器(硬件状态机)
CPU 占用 100% 占用,无法执行其他任务 仅配置和完成处理时短暂占用
传输速率 受限于 CPU 主频与指令吞吐 接近总线带宽,支持突发传输
数据粒度 字节/半字/字(由指令决定) 可配置为 1/2/4/8 字节,支持链表
并发能力 单核顺序执行,无法并行 多通道并行,支持 Scatter-Gather
实时性 受中断延迟和任务调度影响 硬件触发,延迟可预测
适用数据量 小数据量(< 64 字节) 大数据量(≥ 64 字节)
经验法则: 当单次传输数据量超过 64 字节,或传输频率高于 10 kHz 时,DMA 的收益显著超过 PIO。对于小于 32 字节的零星传输,CPU 搬运的配置开销反而更低。
CPU 搬运 vs DMA 搬运:CPU 占用对比 CPU 搬运 CPU 100% 占用:加载 → 存储 → 加载 → 存储 ... DMA 搬运 配置 DMA 独立搬运(CPU 可执行其他任务) 完成 CPU 活动 配置 执行其他任务(任务 A / 中断处理 / 休眠) 处理完成 DMA 搬运期间 CPU 可以执行其他任务,系统吞吐量提升 2~10 倍(取决于传输大小和总线负载)

1.3 DMA 传输的优势与适用场景

DMA 的核心优势在于解耦 CPU 与数据搬运,让 CPU 专注于控制逻辑和计算密集型任务。以下是 DMA 传输的主要优势:

  • 降低 CPU 负载: 将重复性的数据搬运卸载到硬件,CPU 利用率从 100% 降至接近 0%(仅配置和完成处理)。
  • 提高传输吞吐量: DMA 控制器可以发起突发传输(Burst Transfer),一次总线事务传输多个数据字,充分利用总线带宽。
  • 支持后台传输: 传输在后台进行,CPU 可以同时处理协议解析、算法运算或响应其他中断。
  • 降低功耗: CPU 可以更早进入低功耗模式,DMA 搬运完成后才唤醒 CPU。
  • 可预测的延迟: 硬件状态机无指令缓存缺失或分支预测失败,传输延迟稳定。

典型适用场景

场景 传输方向 典型数据量 DMA 优势
高速 ADC 采样 外设 → 内存 1 KB ~ 4 MB 连续采样不丢点,CPU 只做信号处理
SPI Flash 读写 内存 ↔ 外设 256 B ~ 64 KB 突发传输提升读写速度
UART 数据收发 外设 ↔ 内存 64 B ~ 2 KB 避免字节中断风暴
显示帧缓冲更新 内存 → 显示控制器 几百 KB ~ 几 MB 释放 CPU 做图形渲染
网络数据包收发 内存 ↔ 网络控制器 1.5 KB ~ 64 KB 零拷贝传输,降低延迟
音频 I2S 流 外设 ↔ 内存 周期 64 ~ 512 样本 双缓冲避免音频卡顿
注意: DMA 并非万能。对于小数据量(< 32 字节)或极低频率的传输,DMA 的配置开销(设置描述符、启动通道、处理完成中断)可能超过 CPU 直接搬运的成本。此外,DMA 需要额外的硬件资源(通道、描述符内存),在资源受限的 MCU 上需要权衡使用。
DMA 适用场景决策流程 需要数据搬运? 单次数据量 ≥ 64 B? 使用 DMA 使用 CPU 搬运 是 否 额外考虑:传输频率 > 10 kHz?CPU 是否有其他高优先级任务?系统是否对功耗敏感? 如果以上任一答案为“是”,即使数据量略小于 64 B,也建议使用 DMA。

1.4 小结

DMA 是嵌入式系统中实现高性能数据搬运的核心硬件机制。它通过专用的 DMA 控制器接管总线传输,将 CPU 从重复的加载-存储循环中解放出来。与 CPU 搬运相比,DMA 在传输吞吐量、CPU 利用率、功耗和延迟可预测性方面具有显著优势,尤其适用于高速外设、大数据块传输和实时流处理场景。理解这些基础概念,为后续学习 dmaengine 驱动框架和环形缓冲区设计奠定了坚实的理论基础。