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、内存和外设之间的数据通路与控制关系。
1.6 DMA 传输基本流程
一次完整的 DMA 传输通常包含以下步骤,以"外设→内存"方向为例:
- CPU 配置 DMAC:设置源地址(外设数据寄存器)、目的地址(内存缓冲区)、传输长度、传输宽度、突发大小等参数。
- CPU 使能外设 DMA 请求:外设准备好数据后,向 DMAC 发出硬件 DMA 请求信号。
- DMAC 获取总线控制权:通过总线仲裁器申请总线,获得授权后成为总线主控。
- DMAC 执行传输:从源地址读取数据,写入目的地址,地址自动递增/递减,计数器递减。
- 传输完成:计数器归零后,DMAC 释放总线,向中断控制器发送完成中断。
- CPU 响应中断:在中断服务程序中处理数据(如通知应用程序数据已就绪)。
常见误区:DMA 并非"零 CPU 参与",CPU 仍需完成配置和中断处理。DMA 消除的是"逐字搬运"阶段的 CPU 占用,而非全部 CPU 开销。配置阶段和中断响应阶段的 CPU 时间不可忽略,尤其在频繁小传输场景下。
1.7 DMA 传输方向分类
| 传输方向 | 描述 | 典型场景 |
|---|---|---|
| 内存→外设 | 从内存读取数据写入外设发送寄存器 | SPI 发送、LCD 刷新、音频播放 |
| 外设→内存 | 从外设接收寄存器读取数据写入内存 | UART 接收、ADC 采样、摄像头采集 |
| 内存→内存 | 内存区域之间的数据拷贝 | 缓冲区拷贝、内存整理、加密加速 |
| 外设→外设 | 两个外设之间的直接数据通路 | 数字信号处理、协议转换桥 |