1

我需要在启动时使用类似棋盘的算法检查 MCU 的 RAM。我不想丢失 RAM 中已经存在的任何数据,而且我不知道如何不影响我用来执行此算法的变量。我在想类似的事情:

for (position=0; position< 4096; position++)
 {
     *Temporal = 0x5555;
     if(*Temporal != 0x5555) Error = TRUE;
     *Temporal  = 0xAAAA;
     if(*Temporal != 0xAAAA) Error= TRUE;

    Temporal +=1;

 }

我应该修改链接器以了解 Temporal 和 Error 的放置位置吗?

4

3 回答 3

0

声明指针时使用修饰符“register”(如“register int *”)。寄存器是处理器内核中的一个特殊内存段,(通常)不计入 RAM 的一部分,因此对它们的任何更改都不算作 RAM 读/写。存在一些例外情况;例如,在 AVR 微控制器中,RAM 的前 32 个字节被“伪造”到寄存器中。

您的问题可能因缺乏清晰度而遭到否决,而大多数初学者 C 程序员很容易解决有关保留 RAM 中的任何内容的问题(只需在测试之前将指针的内容复制到临时变量中,然后在测试结束)。此外,您没有执行校验和:您只是在进行内存测试。这些是非常不同的、独立的事物。

于 2013-01-03T16:34:29.597 回答
0

您需要确保您正在测试的内存与包含您正在运行的程序的内存位于不同的位置。您可以通过直接用完闪存或您连接的任何其他永久存储来做到这一点。如果没有,您需要对链接映射做一些事情以确保正确的内存分段。

在测试函数内部,register按照 MVittiS 的建议使用是个好主意。另一种替代方法是使用映射到与被测段不同的段的全局变量。

您可能想阅读这篇关于内存测试的文章,以了解您提出的测试的局限性、内存如何失败以及您应该测试什么。

于 2013-01-03T16:46:57.650 回答
0

我不知道(没有足够的细节),但您的内存测试可能是缓存测试,可能根本不会测试任何 RAM。

您的内存测试(如果它确实测试内存)的设计也非常糟糕。例如,您可以切断(或短路)所有地址线和所有数据线,除了最不重要的 2 条数据线,即使有许多非常严重的故障,测试仍然可以通过。

我的建议是阅读有关内存测试的网页,以获取一些想法和背景信息:http ://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/software- based-memory-testing.html

一般来说,对于非破坏性测试,您可以复制任何您想保留在其他地方的内容,然后进行测试,然后将数据复制回来。首先测试“其他地方”非常重要(您不想将所有内容复制到有故障的 RAM 中,然后再将其复制回来)。

我还建议使用汇编(而不是 C)来确保不会进行不需要的内存访问;包括你的堆栈。

如果您的代码在需要测试的 RAM 中,那么您可能需要 2 个 RAM 测试代码副本。当您测试包含您的代码的第一个副本的 RAM 时,您将使用您的代码的第二个副本。如果您的代码在 ROM 中,那么它会容易得多(但您仍然需要担心您的堆栈)。

于 2013-01-03T17:09:39.827 回答