如何检查嵌入式系统上的堆和堆栈RAM一致性

时间:2011-07-11 08:33:22

标签: testing embedded stack heap consistency

我正在使用LEON2处理器(Sparc V8)开展项目。 处理器使用8M字节的RAM,需要在引导自检期间进行一致性检查。 我的问题是我的Boot显然使用了一小部分RAM作为其Heap / BSS / Stack,我无法修改而不会崩溃我的应用程序。 我的RAM测试非常简单,为所有RAM地址写入一定值然后将其读回以确保RAM芯片可以被寻址。

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

3 个答案:

答案 0 :(得分:5)

通常,需要测试每个字节的RAM测试将作为处理器启动时发生的第一件事情之一完成。通常,在它之前完成的唯一其他事情是RAM测试需要进行的硬件初始化才能访问RAM。

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

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

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

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

答案 1 :(得分:1)

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

进入运行时环境后,没有简单的方法可以执行此操作。

答案 2 :(得分:1)

当我编写安全相关设备时,我必须在操作期间进行完整的RAM测试。 我在两个测试中将测试分开了:

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

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

      我希望这有点帮助。