繁体   English   中英

C语言的RAM校验和

[英]RAM Checksum in C language

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

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

    Temporal +=1;

 }

我应该修改链接器以了解将“时间”和“错误”放置在何处?

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

您的问题可能由于缺乏清晰性而感到沮丧,大多数初学者C程序员很容易解决关于保留RAM中内容的问题(只需在测试之前将指针的内容复制到temp变量中,然后在执行完之后将其复制回测试结束)。 另外,您执行校验和:您只是在进行内存测试。 这些是截然不同的东西。

您需要确保要测试的内存与包含正在运行的程序的内存不在同一位置。 您可以通过直接在闪存或已连接的任何其他永久存储中运行来实现此目的。 如果不是,则需要对链接映射进行某些操作以确保正确的内存分段。

在测试功能内部,按照MVittiS的建议使用register是个好主意。 另一种选择是使用映射到与被测对象不同的段的全局变量。

您可能需要阅读有关内存测试的本文 ,以了解您建议的测试的局限性,内存可能如何发生故障以及应该进行的测试。

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

您的内存测试(如果确实测试内存)也设计得很糟糕。 例如,您可以砍除(或短路)所有地址线和所有数据线(除了最低有效的2条数据线之外),即使存在许多非常严重的错误,测试仍然可以通过。

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

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

我还建议使用汇编程序(而不是C)来确保不进行不必要的内存访问。 包括您的堆栈。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM