ARM Cortex-M7缓存清理操作是否会覆盖DMA设备写入的内存数据?
结论
你的推理完全正确,步骤5执行完成后,从DMA的视角看x = x1。
验证说明
Cortex-M7内核的普通回写可缓存内存的操作完全符合你描述的逻辑:
- 回写缓存以缓存行粒度操作,CPU读取
y时会将完整的缓存行加载到缓存中,此时缓存内保存的是初始内存值x=x1, y=y1,缓存行标记为有效状态。 - DMA作为总线主设备直接访问内存,不感知CPU侧的缓存,所以DMA更新内存
x为x2的操作不会同步到CPU缓存,此时缓存和内存已出现数据不一致。 - CPU修改
y为y2时仅修改缓存内的值,同时将整个缓存行标记为脏,此时缓存内的x仍为旧值x1。 - 缓存清理(clean)操作的定义就是将脏缓存行的完整内容写回内存,无论你修改的是缓存行内哪一部分地址的数据,整行数据都会覆盖对应内存地址。
- 最终写回操作直接用缓存里的
x=x1覆盖了内存中DMA写入的x=x2,DMA访问内存读取到的x自然就是x1。
实际开发规避方案
这个是嵌入式DMA驱动开发中非常典型的缓存一致性问题,实际开发中可以通过两种方式规避:
- 将DMA使用的缓冲区分配到非缓存内存区域,跳过缓存机制避免一致性问题
- 保证DMA缓冲区的起始地址和大小都对齐到缓存行边界,避免不同变量/缓冲区共享同一缓存行,同时在DMA发起传输前执行缓存清理,DMA传输完成后执行缓存无效操作。
内容的提问来源于stack exchange,提问作者Scrashdown
相关产品推荐
相关产品推荐

