在我们的嵌入式系统(使用 PowerPC 处理器)中,我们想要禁用处理器缓存。我们需要采取什么步骤?

为了澄清一点,所讨论的应用程序必须具有尽可能恒定的执行速度。执行相同代码路径时的变化是不可接受的。这就是关闭缓存的原因。

有帮助吗?

解决方案

我有点晚了这个问题,而且自从我在 PPC 上完成所有低级处理器初始化代码以来已经有一段时间了,但我似乎记得缓存和 MMU 是非常紧密耦合的(必须启用一个才能启用另一个)和我 思考 在MMU页表中,您可以定义可缓存属性。

所以我的观点是这样的:如果有某个代码子集必须在确定的时间内运行,也许您将该代码(通过链接器命令文件)定位在页表中定义为不可缓存的内存区域中?这样,所有可以/应该从缓存中受益的代码都会受益,而(希望)不应该受益的代码子集则不会。

无论如何我都会这样处理它,这样以后,如果你想为系统的一部分启用缓存,你只需要翻转MMU页表中的一些位,而不是(重新)编写初始化代码设置所有页表和缓存。

其他提示

来自 E600 参考手册:
HID0 专用寄存器包含多个位,用于使指令和数据缓存无效、禁用和锁定。

您应该使用 HID0[DCE] = 0 来禁用数据缓存。
您应该使用 HID0[ICE] = 0 来禁用指令缓存。

请注意,加电时,两个缓存均被禁用。您需要用汇编代码编写它。

也许您不想全局禁用缓存,而只想针对特定地址范围禁用它?

在某些处理器上,您可以为地址范围配置 TLB(转换后备缓冲区)条目,以便每个范围都可以启用或禁用缓存。通过这种方式,您可以禁用内存映射 I/O 的缓存,但仍然保留主 RAM 块的缓存。

我唯一使用过的 PowerPC 是 PowerPC 440EP(来自 IBM,然后是 AMCC),所以我不知道是否所有 PowerPC 都以相同的方式工作。

它是什么样的PPC核心?不同供应商的不同核心之间的缓存控制有很大不同......此外,禁用缓存通常被认为对机器来说是一件非常糟糕的事情。性能变得极其缓慢,以至于使用旧的 8 位处理器也能达到同样的效果(有点夸张)。一些 ARM 变体具有 TCM(紧耦合内存),可以代替缓存工作,但我不知道有任何 PPC 变体具有该功能。

也许更好的解决方案是保持 1 级缓存处于活动状态,并使用片上 L2 缓存作为静态映射 RAM?这至少在现代 PowerQUICC 设备上很常见。

关闭缓存对您没有任何好处。你的执行速度将会下降一个数量级。您永远不会发布这样的系统,因此它在这些条件下的性能并不重要。

要实现稳定的执行速度,请考虑以下方法之一:

1) 锁定部分或全部缓存。目前 Freescale、IBM 和 AMCC 的所有 PowerPC 芯片都提供此功能。

2) 如果是具有二级缓存的飞思卡尔芯片,请考虑将该缓存的一部分映射为片上内存。

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