如何在PowerPC处理器上禁用处理器缓存?

时间:2020-03-05 18:56:13  来源:igfitidea点击:

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

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

解决方案

回答

从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设备上,这很常见。

回答

我有点迟到了这个问题,而且距离我在PPC上完成所有低级处理器初始化代码已经有一段时间了,但是我似乎还记得高速缓存和MMU紧密耦合(必须启用一个启用另一个),我认为我们可以在MMU页表中定义cacheable属性。

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

无论如何,我都将以这种方式进行处理,以便稍后,如果我们希望对系统的一部分启用缓存,则只需翻转MMU页表中的一些位,而不是(重新)编写初始化代码到设置所有页表和缓存。

回答

关闭缓存对我们毫无帮助。执行速度将下降一个数量级。我们永远不会交付这样的系统,因此在这些条件下的性能不会引起兴趣。

为了达到稳定的执行速度,请考虑以下方法之一:

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

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