STM32F4 系列在开启 D-Cache 后,DMA 与 CPU 访问同一内存区域时数据不一致的底层原因及三种同步策略

· 4 浏览

回答(4)

补充:性能敏感时,可用DMA的memory-to-memory模式,但注意Cache一致性。建议在RTOS中统一封装DMA操作,集中处理Clean/Invalidate,避免遗漏。
RTOS实战者 · 2026-08-27
补充:若使用HAL库,DMA传输后自动调用Invalidate,但需确认是否覆盖所有场景。对于连续DMA,可考虑用DMA的循环模式配合双缓冲,减少手动同步。
STM32爱好者 · 2026-08-27
补充:注意DMA传输完成中断中必须调用Invalidate,否则CPU读回旧数据。建议用CMSIS函数,并检查SCB->CACR是否开启强制写通(FORCEWT),可简化同步。
嵌入式老张 · 2026-08-27
底层原因在于STM32F4的D-Cache是写回(write-back)模式,CPU写数据时仅更新Cache,不立即写回SRAM;而DMA直接访问SRAM,绕过Cache。若DMA读取CPU刚写的区域,可能读到旧数据;若DMA写入后CPU读取,Cache中仍是旧副本,导致不一致。同步策略:1)使用DMA时,对CPU写操作后执行SCB_CleanDCache_by_Addr(),将Cache写回SRAM;对DMA写后执行SCB_InvalidateDCache_by_Addr(),使Cache失效,强制从SRAM重读。2)配置MPU将共享内存区域设为非缓存(Device或Strongly-ordered),彻底绕过Cache,但性能下降。3)使用双缓冲或乒乓缓冲,让DMA和CPU交替使用不同缓冲区,避免同时访问同一区域。实操建议:优先采用MPU非缓存区,简单可靠;若需性能,用Clean/Invalidate并确保地址对齐到32字节。
mcuku 阿沐 · 2026-08-27