【问题标题】:How to check the Heap and Stack RAM consistency on an embedded system如何在嵌入式系统上检查堆和堆栈 RAM 的一致性
【发布时间】:2011-07-11 08:33:22
【问题描述】:

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

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

【问题讨论】:

  • 是的,对不起,我所有的引导都是用 C 编码的,带有一些 ASM 的一部分

标签: testing embedded heap-memory stack-memory consistency


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 非常感谢您的回答。我注意到 LEON 交叉编译工具使我可以在堆栈初始化之前调用特殊函数。我想我会使用 ASM 在这个区域执行一个简单的 RAM 测试。
  • 如果您从 rom 启动,您可以先从 rom 进行内存测试,然后将您的程序/应用程序复制到 ram。使您能够测试所有 ram(地址测试而不仅仅是数据测试)。
【解决方案2】:

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

  1. 寻址测试

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

  1. 模式测试:

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

希望对你有所帮助。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 2014-10-04
      • 1970-01-01
      • 2010-11-14
      • 2021-07-21
      • 2013-09-25
      • 2023-03-23
      • 2015-09-05
      相关资源
      最近更新 更多