DMA 用于在外设与内存, 或内存与内存之间搬运数据, 以减少 CPU 直接参与的数据复制开销.
- 在高吞吐采样, 显示刷新, 音频流和串口收发场景中都很常见.
- CPU 逐字节搬运数据时, 会占用大量总线和计算资源.
DMA 可以让数据搬运和 CPU 计算并行进行, 提高整体效率.
- 常见场景包括
ADC, SPI, I2S, UART, PWM 更新和显示控制器刷新.
- CPU 对内存读写通常会经过
cache, 外设和 DMA 访问的却是主存中的真实数据.
- 如果 DMA 写完数据后, CPU 仍读取旧 cache, 就可能看到“数据为空”或“数据没更新”的现象.
- 如果 DMA 读取的数据来自 CPU 刚写入但尚未回写的 cache, 外设也可能拿到旧数据.
- DMA 接收完成后, 读取前先执行对应的 cache invalidate.
- DMA 发送前, 先把待发送缓冲区执行 cache clean / flush.
- 对实时性要求高的缓冲区, 可考虑放到非 cache 区域或使用专门的内存段.
- 先确认 DMA 通道, 触发源和中断是否真的工作.
- 若寄存器看起来正常但数据异常, 优先怀疑 cache 一致性问题.
- 检查缓冲区地址是否对齐, 生命周期是否足够长, 是否被其他任务复用覆盖.
- 双缓冲或循环缓冲场景下, 还要确认“正在写”和“正在读”的边界是否清晰.