1、DMA基础概念

1.1 DMA工作原理

DMA(Direct Memory Access,直接存储器访问)是一种允许硬件子系统直接读写系统内存而无需CPU干预的数据传输技术。在DMA传输过程中,CPU只需初始化传输任务,随后由DMA控制器独立完成数据搬运,传输完成后通过中断通知CPU。

核心思想:将数据搬运工作从CPU卸载到专用硬件控制器,使CPU能够专注于计算和控制任务。
DMA数据传输工作原理 CPU 初始化传输 DMA 控制器 管理数据传输 源设备 外设/内存 目标设备 内存/外设 系统总线 地址总线 数据总线 控制总线 ① 配置请求 ② 控制信号 ③ 数据读取 ④ 数据写入 ⑤ 传输完成中断 ⑥ 通知CPU 流程:CPU初始化DMA → DMA控制器接管总线 → 源设备→目标设备数据传输 → 传输完成中断 → CPU响应

DMA传输的标准流程包含以下步骤:

  1. 请求阶段:外设或软件通过DMA请求信号向DMA控制器发起传输请求。
  2. 仲裁阶段:DMA控制器向CPU请求总线控制权,CPU在完成当前总线周期后让出总线。
  3. 传输阶段:DMA控制器直接控制地址总线和数据总线,在源地址和目标地址之间搬运数据。
  4. 结束阶段:传输计数器归零后,DMA控制器释放总线控制权,并向CPU发送中断信号。

1.2 DMA与CPU数据搬运的区别

传统CPU搬运数据采用PIO(Programmed I/O)模式,即CPU通过逐条指令从源地址读取数据再写入目标地址。DMA模式则将这一过程完全卸载给专用硬件。两者在多个维度存在显著差异:

对比维度 CPU搬运(PIO) DMA搬运
执行主体 CPU核心 DMA控制器硬件
总线占用 CPU全程占用系统总线 DMA控制器占用总线,CPU可访问Cache或本地总线
CPU利用率 传输期间CPU 100%被占用 仅初始化+中断处理占用CPU(通常<5%)
传输速率 受限于CPU指令执行速度 接近总线理论带宽
适用场景 小数据量(<64字节)、控制类操作 大数据块(≥1KB)、流式传输
功耗 高(CPU全速运行) 低(专用硬件高效传输)
延迟 低(立即执行) 中等(需总线仲裁和初始化开销)
经验法则:当单次传输数据量超过256字节时,DMA的吞吐量优势开始明显体现;超过1KB时,DMA通常比PIO快3~10倍。
CPU搬运 vs DMA搬运 时序对比 CPU搬运(PIO) 读 写 读 写 读 写 …… 循环执行N次 CPU 100%占用,无法执行其他任务 DMA搬运 配置 DMA控制器独立传输数据(CPU可执行其他任务) 中断 CPU仅在配置阶段和中断处理阶段短暂介入,其余时间完全释放 💡 对于1MB数据:CPU搬运约需数百万条指令;DMA搬运仅需一次配置+一次中断处理

1.3 DMA在嵌入式系统中的作用

在嵌入式系统中,DMA扮演着不可替代的角色,直接影响系统的实时性、吞吐量和功耗表现。以下是DMA在嵌入式系统中的核心作用:

  • 释放CPU算力:将数据搬运任务从CPU卸载到DMA硬件,CPU可以并行执行协议栈处理、算法运算、控制逻辑等高价值任务。
  • 保障实时性:在音频、视频、传感器数据采集等场景中,DMA确保数据以恒定速率传输,避免CPU调度抖动导致的丢帧或数据溢出。
  • 降低系统功耗:DMA控制器以远低于CPU主频的时钟运行,完成相同数据搬运任务时功耗仅为CPU方案的10%~30%。
  • 支持外设背靠背传输:DMA可以在外设与内存之间建立直接通道,支持ADC采样数据、SPI/I2C通信数据、摄像头数据等高速连续传输。
  • 实现零拷贝传输:结合环形缓冲区或链表描述符,DMA可以实现数据从外设到应用程序的零拷贝路径,减少内存带宽浪费。
DMA在嵌入式系统中的典型应用场景 DMA 控制器 系统数据搬运枢纽 ADC 采样 传感器数据采集 SPI/I2C/UART 串行通信接口 摄像头/CSI 图像数据采集 音频 I2S 音频流传输 系统内存 数据缓冲区 环形缓冲区 乒乓/循环队列 描述符链表 SG-DMA传输链 DMA连接外设与内存,实现数据零CPU干预传输
注意事项:DMA并非万能方案。对于小于64字节的短数据、寄存器配置操作、以及需要CPU逐字节处理的协议(如某些I2C从机模式),PIO模式反而更高效。选择DMA还是PIO需要根据传输大小、频率和系统负载综合评估。

1.4 DMA传输模式分类

嵌入式系统中常见的DMA传输模式包括以下四种,每种模式适用于不同的应用场景:

传输模式 描述 典型应用 优势
单次传输 一次配置传输一个数据块,完成后停止 SPI单次读写、ADC单次采样 实现简单,资源占用少
循环传输 传输完成后自动重新加载配置,持续循环 音频流播放、连续ADC采集 无需重复配置,实时性好
链表传输(SG-DMA) 通过描述符链表链接多个不连续内存块 网络数据包收发、文件系统I/O 支持零拷贝,减少内存碎片
双缓冲(乒乓) 两个缓冲区交替使用,一个传输一个处理 摄像头帧采集、高速数据记录 消除数据竞争,提高吞吐量
关键指标:评估DMA性能的核心参数包括:传输带宽(MB/s)、传输延迟(从配置到完成的时间)、通道数量(支持并发传输的路数)、描述符深度(链表传输的最大节点数)。