ARM Cortex 处理器中缓存的 clean 和 invalidate 有何意义? clean将缓存内容写入内存,然后invalidate保证下次访问时再次读取这些刚刚写入的内容?
我很确定我在这里遗漏了一些微不足道的东西,否则 SCB 中就不会有单独的寄存器来清理和无效。我尝试过谷歌搜索、阅读ARM 参考手册等等,但我没有看到任何与我上面写的内容不同的内容?
Clean 将脏缓存提交到内存并将其标记为干净。
Invalidate 会从内存中删除那些缓存的项目。
如果它们被重新访问,是的,它们将被重新加载到缓存中,但如果没有......那么,现在缓存可用于其他事情。
您通常对已完成工作且从处理器角度不再关心的缓冲区使用 clean 和 invalidate。 一个很好的例子就是将音频缓冲区发送到 DMA 馈送的 I2S 端口或 DAC 设备。
稍后编辑:
Invalidate主要用于当你想从外部获取数据到处理器进行计算时。 在这种情况下,I2S DMA 输入:使您感兴趣的缓冲区无效,然后正常访问它。
话虽如此,尝试执行此操作可能会很棘手,因为整个缓存行已加载/无效等。 如果缓冲区附近有任何其他变量,您最终可能会陷入缓存操作并意外丢弃“正确的”数据。