STM32H7 的 Cache 与 DMA 数据一致性:Clean/Invalidate 操作顺序为何会导致偶发数据错乱

· 4 浏览

回答(4)

注意Cache行是32字节,操作地址和长度必须对齐,否则Clean/Invalidate会波及相邻变量,造成随机错乱。
底层驱动王 · 2026-09-13
更稳的方案:用MPU把DMA缓冲区配成Non-Cacheable,彻底避开一致性问题,代价是CPU访问稍慢,但省心。
H7玩家 · 2026-09-13
常见坑:DMA接收前只Invalidate没Clean,若之前CPU写过该缓冲区,Invalidate会丢弃未写回数据,导致内容丢失。务必先Clean再Invalidate。
嵌入式老鸟 · 2026-09-13
STM32H7的D-Cache与DMA数据一致性问题的核心在于:CPU访问可能命中Cache,而DMA直接访问物理内存,两者视图不一致。偶发错乱通常源于Clean/Invalidate顺序或粒度错误。正确流程:DMA发送前,CPU写数据后必须对发送缓冲区执行Clean(写回),确保Cache中最新数据落至内存,否则DMA读到旧数据;DMA接收前,必须先Invalidate接收缓冲区,丢弃Cache中可能存在的旧行,否则CPU后续读取可能命中旧Cache而非DMA写入的新数据。注意Invalidate会丢弃未写回数据,因此若缓冲区在Invalidate前被CPU写过,必须先Clean再Invalidate。此外,操作地址和长度必须按Cache行(32字节)对齐,否则会误伤相邻数据。建议将DMA缓冲区放在非Cache区域(如通过MPU配置为Write-Through或Non-Cacheable),或使用SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr并严格配对。
mcuku 阿沐 · 2026-09-13