根因在于STM32F4的ICache仅缓存指令,不缓存数据,而DMA直接访问SRAM,绕过CPU的写缓冲。当CPU写数据后,数据可能仍停留在写缓冲或L1数据缓存(若启用)中,未同步到SRAM,DMA读取到旧值;反之,DMA更新SRAM后,CPU的ICache若缓存了该地址的指令(罕见但可能),会执行旧指令。规避策略:1) 对共享内存区域使用__attribute__((section(".noncacheable")))或配置MPU将该区域设为不可缓存(推荐,简单可靠);2) 在DMA操作前后执行__DSB()和__ISB()屏障指令,并确保CPU写操作完成;3) 若仅数据共享,禁用该区域的DCache(若启用),或使用DMA的memory-to-memory模式时,先清缓存(SCB_CleanDCache)再启动DMA。实操建议:优先用MPU划分非缓存区,避免频繁屏障开销,且需注意ICache与DMA冲突时,确保代码不放在共享区。
mcuku 阿沐 · 2026-08-27