1. DMA 基础概念

1.1 DMA 工作原理

直接存储器访问(Direct Memory Access, DMA)是一种允许硬件设备直接读写系统内存而无需 CPU 干预的数据传输技术。DMA 控制器作为总线上的独立主控设备,在传输期间接管总线控制权,完成从源地址到目的地址的数据搬运。

核心要点:DMA 的本质是“硬件线程搬运数据”,CPU 只需配置传输参数并等待完成中断,无需逐字节参与。
DMA 传输工作原理 CPU 配置 & 启动 DMA 控制器 总线主控 · 地址生成 外设 SPI / UART / ADC 系统内存 SRAM / DDR 配置请求 DMA 请求 DMA 应答 总线传输 传输完成中断 工作流程: ① CPU 配置 DMA 源地址、目的地址、传输长度 → ② DMA 向外设发出请求 → ③ 外设就绪后 DMA 接管总线搬运数据 → ④ 传输完成,DMA 触发中断通知 CPU

1.2 DMA 与 CPU 数据搬运对比

传统 PIO(Programmed I/O)模式下,CPU 通过循环读取/写入寄存器完成每个字节的搬运;DMA 模式下,CPU 仅参与配置和收尾。两者在性能、资源占用和延迟特性上有本质区别。

对比维度 CPU 直接搬运(PIO) DMA 搬运
参与方式 逐字节/逐字循环搬运 仅配置启动 + 等待完成中断
CPU 占用率 100%(搬运期间无法执行其他任务) 接近 0%(搬运期间可调度其他任务)
传输速率 受限于 CPU 主频与指令吞吐 接近总线带宽上限
适用数据量 小数据块(< 64 字节) 大数据块(≥ 64 字节,典型 1KB+)
实时性影响 阻塞 CPU,中断延迟增大 非阻塞,中断延迟稳定
功耗 CPU 高频运行,功耗高 DMA 低时钟运行,整体功耗低
代码复杂度 简单循环,无需额外硬件 需 DMA 驱动、中断处理、缓存同步
经验法则:在嵌入式 Linux 中,单次传输量小于 64 字节时 PIO 可能更快(省去 DMA 配置开销);超过 256 字节时 DMA 优势明显。驱动开发中建议将阈值设为 256 字节。

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

核心优势

  • CPU 卸载:将数据搬运任务从 CPU 卸载到专用硬件,CPU 可并行处理协议解析、控制逻辑等高价值任务。
  • 高吞吐:DMA 控制器以硬件状态机驱动地址递增和传输计数,时钟周期利用率远高于软件循环。
  • 低延迟抖动:DMA 传输不依赖 CPU 调度,完成时间可预测,适合音频、视频等实时流。
  • 功耗优化:DMA 控制器通常在较低频率下运行,CPU 可进入低功耗模式,整体能效比提升 3~10 倍。

典型适用场景

场景 说明 典型数据量
高速外设数据采集 ADC、摄像头、麦克风等连续采样,DMA 直接写入内存环形缓冲区 KB ~ MB 级
显示帧缓冲更新 LCD/OLED 控制器通过 DMA 从帧缓冲取数据刷新屏幕 数百 KB ~ 数 MB
存储设备读写 eMMC、SD 卡、NAND Flash 的块数据传输 512B ~ 数 MB
网络数据包收发 以太网 MAC 通过 DMA 将数据包搬入/搬出描述符环 64B ~ 1518B(以太网帧)
内存到内存拷贝 大型数据缓冲区复制、加密/校验前的数据搬移 MB 级
音频流播放/录制 I2S 接口通过 DMA 循环搬运音频样本 每帧数百字节,持续流
DMA 适用场景决策树 数据传输需求 单次传输量 ≥ 256 字节? 是 否 使用 DMA 高吞吐 · 低 CPU 占用 使用 PIO 小数据 · 低延迟启动 还需考虑:缓存一致性、中断延迟 硬件 scatter-gather 支持 适合:寄存器访问、状态查询 短时突发、不可预测长度
重要提醒:DMA 并非万能方案。在以下情况应谨慎使用或避免 DMA:
• 传输量极小且频繁(配置开销超过传输收益)
• 外设不支持 DMA 握手协议
• 系统无硬件缓存一致性协议(需软件维护 cache 同步)
• 实时性要求极高且 DMA 中断延迟不可控

1.4 关键术语速查

术语 全称 简要说明
DMA Direct Memory Access 直接存储器访问,硬件自主搬运数据
PIO Programmed I/O 编程 I/O,CPU 逐字节搬运
Bus Master 总线主控 DMA 控制器作为主控设备驱动总线
Scatter-Gather 分散-聚集 DMA 支持非连续内存块链式传输
Cache Coherency 缓存一致性 DMA 与 CPU 缓存数据同步问题
DMA Descriptor DMA 描述符 描述传输源、目的、长度的控制结构