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