ST意法半导体
直播中

李浯

7年用户 1041经验值
私信 关注
[问答]

为什么stm32H7和stm32F7缓存在同一代码上的行为不同呢?

我面临一个奇怪的缓存问题。我使用耦合到DMA的DCMI,以便将图像采集到外部SDRAM中。如应用说明 AN4839 中所述,我按照这种方式进行。
  • 在开始 DMA 传输之前,我清理缓存 ( cache_D_Clean(); )
  • 在传输结束时(在指示结束的 DMA 中断中),我使缓存无效(cache_D_Invalidate();
一切都在 STM32H7 上完美运行。
在stm32F7上,缓存失效例程一被调用,CPU就会产生总线错误
在 stm32F7 上,在指示传输结束的 DMA 中断中,我将缓存失效 ( cache_D_Invalidate() ;) 替换为缓存清除,然后是缓存失效 ( cache_D_Clean(); cache_D_Invalidate(); )。添加一个干净的(cache_D_Clean();)似乎可以避免总线错误,但我不明白为什么。
为什么 H7 和 F7 缓存在同一代码上的行为不同?
感谢您的反馈。
知道为什么吗?

回帖(1)

赵静

2023-1-3 15:09:16
清除/使整个缓存失效的函数通常根本不应该使用并且几乎没有用。通常,可以只启用 I-cache,不需要任何进一步的管理。对于 D-cache 的正确管理必须遵循 3 个基本规则:


  • 使所有接收缓冲区实例的地址和大小与__SCB_DCACHE_LINE_SIZE对齐。
  • 在将接收缓冲区传递给 DMA 之前调用SCB_InvalidateDCache_by_Addr() 。
  • 在将传输缓冲区传递给 DMA 之前调用SCB_CleanDCache_by_Addr() 。

是的,即使对于接收部分,也必须在将缓冲区传递给 DMA 之前完成无效,否则缓存逐出会在接收期间通过写回脏行来损坏接收缓冲区。引用自 AN4839:
如果所有行都已分配,则缓存控制器运行行逐出过程,其中选择一条行(取决于替换算法)清理/无效,然后重新分配。数据缓存和指令缓存实现了伪随机替换算法。
AN4838 也密切相关。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分