1

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

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

4

5 回答 5

4

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

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

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

于 2008-11-03T13:55:10.897 回答
2

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

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

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

于 2008-09-16T15:02:46.263 回答
1

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

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

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

于 2008-10-02T20:40:56.280 回答
1

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

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

于 2008-10-02T20:49:17.430 回答
1

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

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

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

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

于 2009-09-28T02:47:27.957 回答