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

3
我正在使用LEON2处理器(Sparc V8)开发一个项目。 该处理器使用8MB的RAM,在我的引导自检中需要进行一致性检查。 问题在于,我的引导程序显然会使用部分RAM用于其Heap/BSS/Stack,如果我修改这些部分,应用程序就会崩溃。 我的RAM测试非常简单,将特定值写入所有RAM地址,然后读取它们以确保RAM芯片可以被寻址。 虽然这种方式可以用于大部分RAM,但我如何安全地检查剩余RAM的一致性呢?

是的,抱歉,我的引导程序全部使用C编写,其中有一些部分使用汇编语言。 - Leo
3个回答

5
通常,当处理器启动时,需要测试每个字节的RAM测试将作为最先发生的事情之一进行。通常,在此之前唯一需要完成的是硬件初始化,以便RAM测试能够访问RAM。
它通常会使用汇编语言进行,并禁用中断,其中一个原因是这是确保不使用任何RAM的唯一方法。
如果您想在那个时间点之后执行RAM测试,则仍然需要在系统启动非常早的阶段进行。您可以在两个步骤中执行RAM测试 - 在低RAM中具有测试所需的任何变量/堆栈/其他内容,并且该测试测试高RAM。然后再次运行测试,其数据位于高RAM中,同时测试低RAM。
另一个注意事项:验证读回某个写入值是一种简单的测试,也许比没有好,但它可能会错过某些常见故障类型(尤其是外部RAM:缺少或交叉焊接地址线)。
您可以在此处找到有关基本RAM测试的更详细信息:

非常感谢您的回答。我注意到LEON交叉编译工具使我有可能在堆栈初始化之前调用一个特殊的函数。我想我会使用汇编在这个区域执行一个简单的RAM测试。 - Leo
如果您正在从ROM启动,则可以首先从ROM执行内存测试,然后将程序/应用程序复制到RAM中。这使您能够测试所有RAM(地址测试而不仅仅是数据测试)。 - old_timer

2
由于我正在编写一个安全相关设备的程序,因此我必须在操作时间内进行完整的RAM测试。 我将测试分为两个部分:
1.寻址测试 您需要将唯一值写入每个寻址线路所到达的地址,并在写入所有值后读取这些值并与预期值进行比较。该测试可检测寻址线路的短路(或卡住@低/高电平)(意思是您想在地址0xFF40上写入0x55,但由于短路,该值存储在0xFF80上,您无法通过测试2来检测此问题:
2.模式测试: 您可以将RAM的前4个字节保存在CPU寄存器中,然后首先清除单元格,写入0x55,验证,写入0xAA,验证并恢复保存的内容(当然您也可以使用其他模式),等等。之所以必须使用寄存器是因为如果使用变量,则该变量将被该测试破坏。 您甚至可以使用此测试来测试堆栈。 在我们的项目中,我们每次测试4个单元格,并且必须运行此测试直到测试整个RAM为止。
希望这有点帮助。

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接