我正在做一个使用LEON2处理器(Sparc V8)的项目。处理器使用8MB的RAM,需要在启动自检期间进行一致性检查。我的问题是,我的Boot显然使用了一小部分RAM用于它的Heap/BSS/Stack,如果不使我的应用程序崩溃,我就无法对其进行修改。我的RAM测试非常简单,将某个值写入所有RAM地址,然后将它们读回,以确保RAM芯片可以寻址。
这种方法可以用于大多数可用的RAM,但是如何安全地检查剩余RAM的一致性?
发布于 2011-08-05 16:18:04
由于我正在对一个与安全相关的设备进行编程,因此我必须在操作期间进行一次完整的RAM测试。我将测试分成两个测试:
您将唯一值写入每条寻址线到达的地址,在写入所有值后,将读回这些值并将其与预期值进行比较。该测试检测地址线的短路(或卡住@low/high)(意味着您希望在地址0xFF40上写入0x55,但由于短路,该值存储在0xFF80,测试2无法检测到此情况:
例如,您将RAM的前4个字节保存在CPU的寄存器中,然后您首先清除单元,写入0x55,验证,写入0xAA,验证并恢复保存的内容(当然,您可以使用其他模式),等等。您必须使用寄存器的原因是,通过使用变量,此变量将被该测试销毁。您甚至可以使用此测试测试您的堆栈。在我们的项目中,我们一次测试4个单元,我们必须运行此测试,直到测试完整个RAM。
我希望这会有一点帮助。
发布于 2011-07-11 23:02:06
通常,需要测试每个字节的RAM测试将作为处理器启动时发生的第一件事来完成。通常,在此之前要做的另一件事就是硬件初始化,为了使RAM测试能够访问RAM,需要进行硬件初始化。
这通常是在禁用中断的情况下用汇编语言完成的,原因之一是这是确保不使用RAM的唯一方法。
如果您想在那之后执行RAM测试,那么您仍然需要在系统启动的早期进行测试。你也许可以在两次测试中完成--其中任何变量/栈/任何测试需要的东西都在低RAM中,而该测试测试高RAM。然后使用高RAM中的数据再次运行测试,同时测试低RAM。
另一个注意事项:验证您是否读回了写入的某个值是一项简单的测试,这可能比什么都没有好,但它可能会遗漏某些类型的常见故障(特别是外部RAM:丢失或交叉焊接的地址线)。
您可以在此处找到有关基本RAM测试的更多详细信息:
发布于 2011-07-11 23:05:35
如果您在C运行时环境启动之前进行测试,那么您可以毫无问题地丢弃Heap和BSS区域。
通常,堆栈在运行时设置期间不会经常使用,因此您可以将其丢弃而不会产生不良影响。只要检查你的系统就行了。
如果您需要在测试期间使用堆栈,或者需要保留堆栈,只需将其移动到已经测试过的区域,调整堆栈指针。之后,只需恢复旧的堆栈并继续。
一旦进入运行时环境,就没有简单的方法可以做到这一点。
https://stackoverflow.com/questions/6647605
复制相似问题