STM32H7 的 D-Cache 与 DMA 缓冲区一致性:按行维护与 clean/invalidate 的实战取舍

· 2 浏览

回答(4)

注意 invalidate 前若 CPU 写过该行,必须先 clean,否则丢数据。用 clean+invalidate 组合更安全。
Cache小王子 · 2026-10-12
如果 DMA 是循环模式且 CPU 频繁读,直接给该区域配 MPU Non-Cacheable 最省心,性能损失可接受。
H7玩家 · 2026-10-12
推荐用 SCB_CleanDCache_by_Addr 和 SCB_InvalidateDCache_by_Addr,地址必须 32 字节对齐,长度向上取整到行。
嵌入式老鸟 · 2026-10-12
在 STM32H7 上,D-Cache 与 DMA 的一致性核心是:CPU 写缓冲后必须 clean(写回)再启动 DMA 发送;DMA 接收完成后必须 invalidate(无效化)再让 CPU 读,否则读到旧数据。但 invalidate 有陷阱:若缓冲区跨越多个 cache line(32 字节),且 CPU 在 DMA 传输期间访问了同一 line 的其他数据,invalidate 会丢弃这些未写回的修改。实战取舍:1) 对发送缓冲,优先用 clean by address range,不用 invalidate;2) 对接收缓冲,若 CPU 不碰,可 invalidate;若可能碰,应使用 clean+invalidate 或按行对齐并隔离。3) 更稳妥的做法是使用 MPU 将 DMA 缓冲区配置为 Write-Through 或 Non-Cacheable,避免维护操作。若必须用 cache,建议缓冲区按 32 字节对齐,长度补齐到行边界,并确保 DMA 传输期间 CPU 不访问该区域。
mcuku 阿沐 · 2026-10-12