1、DMA基础概念
1.1 DMA工作原理
DMA(Direct Memory Access,直接存储器访问)是一种允许硬件子系统直接读写系统内存而无需CPU干预的数据传输技术。在DMA传输过程中,CPU只需初始化传输任务,随后由DMA控制器独立完成数据搬运,传输完成后通过中断通知CPU。
核心思想:将数据搬运工作从CPU卸载到专用硬件控制器,使CPU能够专注于计算和控制任务。
DMA传输的标准流程包含以下步骤:
- 请求阶段:外设或软件通过DMA请求信号向DMA控制器发起传输请求。
- 仲裁阶段:DMA控制器向CPU请求总线控制权,CPU在完成当前总线周期后让出总线。
- 传输阶段:DMA控制器直接控制地址总线和数据总线,在源地址和目标地址之间搬运数据。
- 结束阶段:传输计数器归零后,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倍。
1.3 DMA在嵌入式系统中的作用
在嵌入式系统中,DMA扮演着不可替代的角色,直接影响系统的实时性、吞吐量和功耗表现。以下是DMA在嵌入式系统中的核心作用:
- 释放CPU算力:将数据搬运任务从CPU卸载到DMA硬件,CPU可以并行执行协议栈处理、算法运算、控制逻辑等高价值任务。
- 保障实时性:在音频、视频、传感器数据采集等场景中,DMA确保数据以恒定速率传输,避免CPU调度抖动导致的丢帧或数据溢出。
- 降低系统功耗:DMA控制器以远低于CPU主频的时钟运行,完成相同数据搬运任务时功耗仅为CPU方案的10%~30%。
- 支持外设背靠背传输:DMA可以在外设与内存之间建立直接通道,支持ADC采样数据、SPI/I2C通信数据、摄像头数据等高速连续传输。
- 实现零拷贝传输:结合环形缓冲区或链表描述符,DMA可以实现数据从外设到应用程序的零拷贝路径,减少内存带宽浪费。
注意事项:DMA并非万能方案。对于小于64字节的短数据、寄存器配置操作、以及需要CPU逐字节处理的协议(如某些I2C从机模式),PIO模式反而更高效。选择DMA还是PIO需要根据传输大小、频率和系统负载综合评估。
1.4 DMA传输模式分类
嵌入式系统中常见的DMA传输模式包括以下四种,每种模式适用于不同的应用场景:
| 传输模式 | 描述 | 典型应用 | 优势 |
|---|---|---|---|
| 单次传输 | 一次配置传输一个数据块,完成后停止 | SPI单次读写、ADC单次采样 | 实现简单,资源占用少 |
| 循环传输 | 传输完成后自动重新加载配置,持续循环 | 音频流播放、连续ADC采集 | 无需重复配置,实时性好 |
| 链表传输(SG-DMA) | 通过描述符链表链接多个不连续内存块 | 网络数据包收发、文件系统I/O | 支持零拷贝,减少内存碎片 |
| 双缓冲(乒乓) | 两个缓冲区交替使用,一个传输一个处理 | 摄像头帧采集、高速数据记录 | 消除数据竞争,提高吞吐量 |
关键指标:评估DMA性能的核心参数包括:传输带宽(MB/s)、传输延迟(从配置到完成的时间)、通道数量(支持并发传输的路数)、描述符深度(链表传输的最大节点数)。