3

我正在使用 LEON2 处理器 (Sparc V8) 进行项目。处理器使用 8Mbytes 的 RAM,需要在我的启动自检期间进行一致性检查。我的问题是,我的 Boot 显然将一小部分 RAM 用于其 Heap/BSS/Stack,我无法在不崩溃应用程序的情况下对其进行修改。我的 RAM 测试非常简单,将某个值写入所有 RAM 地址,然后将它们读回以确保 RAM 芯片可以被寻址。

此方法可用于大多数可用 RAM,但我如何安全地检查剩余 RAM 的一致性?

4

3 回答 3

5

通常,需要测试每个字节的 RAM 测试将作为处理器启动时首先发生的事情之一来完成。通常,在它之前唯一要做的另一件事是需要进行硬件初始化,以便 RAM 测试能够访问 RAM。

它通常在禁用中断的情况下用汇编语言完成,原因之一是因为这是确保不使用 RAM 的唯一方法。

如果您想在那之后执行 RAM 测试,您仍然需要在系统启动的早期进行。您可以分两遍执行此操作-其中任何变量/堆栈/测试出于自身目的需要的任何内容都位于低 RAM 中,并且该测试测试高 RAM。然后在测试低 RAM 时使用高 RAM 中的数据再次运行测试。

另一个注意事项:验证您是否读回了写入的某个值是一个简单的测试,可能总比没有好,但它可能会错过某些类型的常见故障(尤其是外部 RAM:缺少或交叉焊接的地址线。

您可以在此处找到有关基本 RAM 测试的更多详细信息:

于 2011-07-11T15:02:05.877 回答
2

由于我正在对安全相关设备进行编程,因此我必须在运行期间进行完整的 RAM 测试。我将测试分为两个测试:

  1. 寻址测试

您将唯一值写入每个寻址线到达的地址,并且在写入所有值之后,这些值被读回并与预期值进行比较。此测试检测寻址线的短路(或卡住@low/high)(意味着您想在地址 0xFF40 上写入 0x55,但由于短路,该值存储在 0xFF80,您无法通过测试 2 检测到这一点:

  1. 模式测试:

例如,您将 RAM 的前 4 个字节保存在 CPU 的寄存器中,然后您首先清除单元格、写入 0x55、验证、写入 0xAA、验证和恢复保存的内容(当然您可以使用其他模式)等等。您必须使用寄存器的原因是通过使用变量,该变量将被该测试破坏。你甚至可以用这个测试来测试你的堆栈。在我们的项目中,我们一次测试 4 个单元,我们必须运行此测试,直到测试整个 RAM。

我希望这会有所帮助。

于 2011-08-05T08:18:04.420 回答
1

如果您在 C 运行时环境启动之前进行测试,您可以毫无问题地丢弃堆和 BSS 区域。
通常,堆栈在运行时设置期间不会被大量使用,因此您可以将其丢弃而不会产生不良影响。只需检查您的系统。
如果您需要在测试期间使用堆栈或需要保留它,只需将其移动到已测试的区域,调整堆栈指针即可。病房之后只需恢复旧堆栈并继续。

一旦进入运行时环境,就没有简单的方法可以做到这一点。

于 2011-07-11T15:05:34.783 回答