【发布时间】:2010-09-09 13:18:19
【问题描述】:
在我们的嵌入式系统(使用 PowerPC 处理器)中,我们想要禁用处理器缓存。我们需要采取哪些步骤?
为了澄清一点,所讨论的应用程序必须具有尽可能恒定的执行速度。 执行相同代码路径的可变性是不可接受的。这就是关闭缓存的原因。
【问题讨论】:
标签: embedded processor powerpc
在我们的嵌入式系统(使用 PowerPC 处理器)中,我们想要禁用处理器缓存。我们需要采取哪些步骤?
为了澄清一点,所讨论的应用程序必须具有尽可能恒定的执行速度。 执行相同代码路径的可变性是不可接受的。这就是关闭缓存的原因。
【问题讨论】:
标签: embedded processor 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) 锁定部分或全部缓存。飞思卡尔、IBM 和 AMCC 目前的所有 PowerPC 芯片都提供此功能。
2) 如果是带二级缓存的飞思卡尔芯片,请考虑将该缓存的一部分映射为片上内存。
【讨论】: