缓存清理/无效

问题描述 投票:0回答:1

在 ARM 架构中,缓存清理和缓存无效操作至关重要,尤其是在处理来自外部源(例如外设(例如 UART、SPI))的数据时。当CPU将数据写入外设时,需要进行缓存清理,以确保缓存反映最新的数据。另一方面,从外设读取数据时需要进行缓存无效,以确保CPU从外部源获取最新数据。

在 ARM 论坛探索期间,我遇到了“SCB_CleanInvalidateDCache_by_Addr”函数。看来这个函数同时执行缓存清理和缓存失效。不过,我很好奇这个功能最适合使用的具体场景。为什么我们选择使用此函数而不是单独的缓存清理和无效操作?

我尝试过缓存清理和无效函数,并且在仅使用无效函数时没有观察到任何性能下降或数据丢失。

caching arm cpu
1个回答
0
投票

...尤其是在处理来自外部源(例如外设(例如 UART、SPI))的数据时。

这不是真的。对于 UART/SPI,您通常从控制器的数据寄存器中读取。该内存不应该被标记为可缓存。所以,这种情况下,是不用担心的。第二种情况是您有一个 DMA 引擎,可以自动将这些数据寄存器传输到 RAM。同样,您可以通过分配 DMA 缓冲区来处理此问题,使它们不可缓存。 在资源受限的环境中,您可能希望在 DMA 缓冲区上执行计算。在这种情况下,您可以在缓冲区传输完成时设置 DMA 控制器标志并使缓冲区无效,以便 CPU 重新获取该内存而不是使用缓存版本。

术语缓存

clean

也称为缓存flush。这使得内存可供 DMA 外设使用。即,它将它从高速缓存移动到外部存储器。当您创建由 CPU 高速缓存的传输缓冲区时,将使用它。我认为在某一时刻它只会刷新,将值留在缓存中。两者都有用例,但通常您也可以使其无效,以便缓存可以用于其他地址。然后您已经提交了一个用于传输的缓冲区,您应该使用它而不是在运行中更改它。清除/无效应在激活 DMA 传输之前完成。 需要执行这些项目,因为 DMA 通常不支持缓存。

© www.soinside.com 2019 - 2024. All rights reserved.