Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

DMA 笔记

说明

  • DMA 用于在外设与内存, 或内存与内存之间搬运数据, 以减少 CPU 直接参与的数据复制开销.
  • 在高吞吐采样, 显示刷新, 音频流和串口收发场景中都很常见.

为什么需要 DMA

  • CPU 逐字节搬运数据时, 会占用大量总线和计算资源.
  • DMA 可以让数据搬运和 CPU 计算并行进行, 提高整体效率.
  • 常见场景包括 ADC, SPI, I2S, UART, PWM 更新和显示控制器刷新.

Cache 一致性问题

  • CPU 对内存读写通常会经过 cache, 外设和 DMA 访问的却是主存中的真实数据.
  • 如果 DMA 写完数据后, CPU 仍读取旧 cache, 就可能看到“数据为空”或“数据没更新”的现象.
  • 如果 DMA 读取的数据来自 CPU 刚写入但尚未回写的 cache, 外设也可能拿到旧数据.

常见处理方式

  • DMA 接收完成后, 读取前先执行对应的 cache invalidate.
  • DMA 发送前, 先把待发送缓冲区执行 cache clean / flush.
  • 对实时性要求高的缓冲区, 可考虑放到非 cache 区域或使用专门的内存段.

排查建议

  • 先确认 DMA 通道, 触发源和中断是否真的工作.
  • 若寄存器看起来正常但数据异常, 优先怀疑 cache 一致性问题.
  • 检查缓冲区地址是否对齐, 生命周期是否足够长, 是否被其他任务复用覆盖.
  • 双缓冲或循环缓冲场景下, 还要确认“正在写”和“正在读”的边界是否清晰.