1. DMA 基础概念

1.1 DMA 定义

DMA(Direct Memory Access,直接存储器访问) 是一种允许硬件设备直接读写系统内存而无需 CPU 干预的数据传输技术。DMA 控制器(DMAC)作为独立的总线主控设备,在系统总线上与 CPU 并行工作,专门负责搬运数据。

核心本质:DMA 将 CPU 从繁重的数据搬运任务中解放出来,让 CPU 专注于计算、控制逻辑和中断处理,从而大幅提升系统整体吞吐量。

1.2 DMA 与 CPU 数据搬运对比

传统 PIO(Programmed I/O)模式下,CPU 必须逐字或逐字节地从外设读取数据再写入内存,整个过程 CPU 被完全占用。DMA 模式下,CPU 只需配置传输参数,后续搬运由 DMAC 独立完成。

对比维度 CPU 搬运(PIO) DMA 搬运
参与方 CPU 全程参与,逐字搬运 CPU 仅配置,DMAC 独立执行
CPU 占用率 100%(搬运期间无法执行其他任务) 仅配置阶段占用(微秒级)
传输速率 受限于 CPU 主频与指令周期 接近总线带宽,支持突发传输
适用数据量 小数据量(< 64 字节) 大数据量(KB ~ MB 级)
实时性 受中断/调度影响大 硬件级实时,延迟可预测
功耗 CPU 高负载运行,功耗高 CPU 可进入低功耗模式
经验法则:当单次传输量超过 64 字节时,DMA 的收益开始显著;超过 1KB 时,DMA 几乎成为唯一合理选择。

1.3 DMA 传输优势

  • CPU 卸载:CPU 从逐字搬运变为"发号施令",利用率从 100% 降至接近 0%(仅配置和完成中断)。
  • 高吞吐量:DMAC 以硬件状态机运行,可连续突发传输,充分利用总线带宽(如 AXI 总线可达 128 位/时钟)。
  • 低延迟:无需 CPU 调度和上下文切换,传输延迟稳定在纳秒级。
  • 低功耗:CPU 在 DMA 传输期间可进入睡眠或低频率模式,对电池供电设备至关重要。
  • 支持后台传输:DMA 可与 CPU 并行工作,CPU 继续执行主程序,DMA 在后台搬运数据。

1.4 典型应用场景

应用领域 典型场景 DMA 作用
多媒体 摄像头帧采集、音频播放 将图像/音频数据直接送入内存,CPU 只做编解码
存储 eMMC/SD 卡读写、NVMe SSD 数据从存储控制器直接搬运到内存,无需 CPU 逐块拷贝
网络 以太网、WiFi 数据收发 网络控制器通过 DMA 将数据包直接送入协议栈缓冲区
高速数据采集 ADC 采样、软件定义无线电 连续采样数据通过 DMA 循环写入环形缓冲区
显示 LCD 刷新、GPU 纹理传输 显存与帧缓冲之间的高速搬运
外设控制 SPI/I2C/UART 大数据收发 串行外设通过 DMA 收发数据块,减少中断频率

1.5 DMA 系统架构概览

下图展示了一个典型的嵌入式 DMA 系统架构,包含 CPU、DMAC、内存和外设之间的数据通路与控制关系。

嵌入式 DMA 系统架构图 CPU 配置 & 中断处理 DMA 控制器 状态机 + 通道管理 系统内存 DDR / SRAM 外设 SPI / I2C / UART / ADC 总线仲裁器 AXI / AHB 总线 中断控制器 GIC / NVIC 配置寄存器 数据搬运 DMA 请求 传输完成中断 中断信号 总线访问 图例: ■ 控制方 ■ 传输引擎 ■ 存储 ■ 数据源/目标 ■ 总线 ■ 中断 —— 数据流 - - - 控制流

1.6 DMA 传输基本流程

一次完整的 DMA 传输通常包含以下步骤,以"外设→内存"方向为例:

  1. CPU 配置 DMAC:设置源地址(外设数据寄存器)、目的地址(内存缓冲区)、传输长度、传输宽度、突发大小等参数。
  2. CPU 使能外设 DMA 请求:外设准备好数据后,向 DMAC 发出硬件 DMA 请求信号。
  3. DMAC 获取总线控制权:通过总线仲裁器申请总线,获得授权后成为总线主控。
  4. DMAC 执行传输:从源地址读取数据,写入目的地址,地址自动递增/递减,计数器递减。
  5. 传输完成:计数器归零后,DMAC 释放总线,向中断控制器发送完成中断。
  6. CPU 响应中断:在中断服务程序中处理数据(如通知应用程序数据已就绪)。
常见误区:DMA 并非"零 CPU 参与",CPU 仍需完成配置和中断处理。DMA 消除的是"逐字搬运"阶段的 CPU 占用,而非全部 CPU 开销。配置阶段和中断响应阶段的 CPU 时间不可忽略,尤其在频繁小传输场景下。

1.7 DMA 传输方向分类

传输方向 描述 典型场景
内存→外设 从内存读取数据写入外设发送寄存器 SPI 发送、LCD 刷新、音频播放
外设→内存 从外设接收寄存器读取数据写入内存 UART 接收、ADC 采样、摄像头采集
内存→内存 内存区域之间的数据拷贝 缓冲区拷贝、内存整理、加密加速
外设→外设 两个外设之间的直接数据通路 数字信号处理、协议转换桥

1.8 本章小结