在嵌入式应用程序中,我们有一个表描述目标板上有效的各种地址范围。该表用于设置 MMU。
RAM 地址范围被标记为可缓存,但其他区域被标记为不可缓存。这是为什么?

有帮助吗?

解决方案

如果一个内存区域同时被硬件和软件访问(例如:硬件配置寄存器或 DMA 的分散收集列表),该区域 必须 被定义为非缓存。对于实际的 DMA,内存缓冲区可以定义为缓存,并且在大多数情况下,建议缓存缓冲区以允许应用程序级快速访问该缓冲区。驱动程序有责任在将缓冲区传递给 DMA 或应用程序之前刷新/使缓存无效。

小更新,上面 必须 如果我们有专门的硬件,即不正确高速缓存一致性互连(CCI)将同步各种硬件块对内存的访问。

其他提示

这样做是为了使处理器不会因缓存而使用过时的值。当您访问(常规)缓存 RAM 时,处理器可以“记住”您访问的值。下次查看同一内存位置时,处理器将返回它记住的值,而无需查看 RAM。这就是缓存。

如果该位置的内容可以在处理器不知道的情况下发生变化,如果您有内存映射设备(例如返回一些数据包的 FPGA),则处理器可能会返回上次“记住”的值,这可能是这种情况会错的。

为了避免此问题,您可以将该地址空间标记为不可缓存。这可以确保处理器不会尝试记住该值。

不应缓存用于 DMA 或其他硬件交互的任何内存区域。

也许它用于内存映射 I/O?

有些区域如Flash可以在一个周期内读取,因此不需要缓存。

现代控制器可以使用 L2 缓存进行 DMA,这意味着它们可以保留用于 DMA 访问的缓存内存区域的一致性。这也称为控制器(通过 DMA)执行的“可监听内存事务”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top