2012-03-26 52 views
3

我想写一个简单的RAM测试来检查嵌入式设备上的内存的基本完整性。这是我想要做的:我会如何写入内存?

本质上写出某些模式:“10101010101010”到一块内存然后写入“01010101010”,然后重新写入第一个并测试以查看模式是否被写入正确。

我想用C写这个程序。我在想如何去写这个模式。我希望能够打开和关闭RAM内存单元中的某些位。

,我只想获得分配的内存块,然后写这样做

uint32 pattern = 0xaaaaaaaa; 
uint32 * mem_loc = malloc some memory; 
int i = 0; 
int offset = 1; 
uint32 * location = &mem_loc; 

while ((&mem_loc)++ && (!i)) { 
    &mem_loc = pattern; 
    if (!(&(mem_loc+offet))) { 
     mem_loc = location; 
     pattern = 0x55555555; 
     i++; 
    } 
} 

//Check to see if values written are consistent 

请问上述工作的代码?将十六进制模式写入内存会将模式中的位打开吗?

我知道上面的代码是非常可怕的,但我只是想得到一个想法,如果用正确的逻辑做这样的事情会达到预期的结果。

谢谢

+0

谷歌“走路的人”和“走路零”的内存测试算法 – Throwback1986 2012-03-26 15:20:37

+0

你已经概述的一般想法应该工作。你有的代码甚至没有接近。举个例子,我不确定'!int'甚至应该是什么意思,但我很确定没有正常运行的编译器会接受它。 – 2012-03-26 15:22:37

+0

没有足够的信息 - 你的处理器有缓存吗?你的操作系统如何?它有虚拟内存系统吗?你关心你写的地址吗?除此之外,你的代码示例没有意义。什么是'!int'? 'malloc()'的使用似乎表明你的代码正在从RAM运行 - 这并不表示它的“基本完整性”是好的吗? – 2012-03-26 15:23:43

回答

3

你有鸡和鸡蛋的问题。为了获得足够的代码来运行malloc或者甚至使用C代码,你已经有了工作内存。

您需要定义您的问题。例如,这是设计验证还是生产测试?你正在测试内存芯片本身还是板子。通常情况下,您会购买具有某些供应商定义的质量的工作/测试芯片(内存)或内存芯片。而你的测试往往是生产测试,制造焊点。数据线,地址线,控制线。

鸡和鸡蛋的问题是你想在嵌入式处理器上运行软件,它需要运行在某处的代码,这意味着内存(可能只是闪存,不需要任何或很少)。理想情况是要么完全从ROM运行,只使用处理器资源或仅使用内部芯片资源,并且不要使用外部RAM,因此可以对外部RAM进行完全测试。每条地址线等。否则,您需要提出一个方案或声明大块内存不被测试。

或者采取多阶段的方法,rom启动代码可以快速检查一小部分ram而不用它来运行。然后将主测试程序复制到该小块RAM中并在其中运行。然后用更多的代码灵活性进行主内存测试。例如,可以使用C而不是汇编器。例如,你可以预先测试,超级简单的测试,25%的内存,然后在那里复制测试,测试其他75%,然后将程序移动到另外25%的内存空间,并在第一个测试25%没有得到全面测试。

测试类型,您需要了解故障,您可能需要特别测试焊点和印刷电路板迹线。所以你可以打开连接,所以你想让每个引脚都是一个零,也可以有一个和零的短路,你可能有“友好的位”,相邻的引脚可能彼此短路所以你想让每一对信号彼此不同。

通常人们会做所有的测试,全零,5s,As。然后棋盘测试,其中一个内存位置有5s,下一个有As。对于地址线测试,您需要使用两个非幂,或者甚至更好,每个存储器中的内存位置都有不同的值,例如每个32位字都有自己的地址。

作为一个快速测试,我在几个测试中覆盖了大部分测试,如果您使用伪随机函数,可重复的类似lfsr的内容,使用随机数发生器填充所有内存,重新播种,并检查。然后再次通过并填充倒数值,重新播种并验证倒数值。你得到地址位,每个数据行但不是所有的邻居都被检查。重新播种和开始所有这些过度移动随机模式可以覆盖。有时只是使用随机测试作为地址测试和传统的零点五,As,3s,Cs,6s,9s等

只要你的指针测试内存你不只是malloc你需要知道物理地址并且处理翻译(如果有的话),以便当/如果您在物理地址中进行通信时出现问题。你也知道并控制了多少内存。通常我会在C中编写基于处理器的测试,但不会使用任何C库调用(如malloc或printf或类似的东西)。

+0

谢谢!然而,在这一点上,设备呈现足够的错误,有时将模式写入“特定”位置,并且读取它会得到不一致的结果。 – Falcata 2012-03-26 20:55:20

0

您想使用new吗?
如果您试图测试嵌入式系统内存的特定区域,您是不是想要直接设置该地址,而不是依赖new给您提供的任何内容?

如果嵌入式系统真的是Linux或Windows嵌入式或其它一些复杂的操作系统,那么它可能更复杂,你可能有不同的处理,缓存,乐观的分配要考虑内存地址空间。

+3

'new'不是C的一部分。 – 2012-03-26 15:36:21

2

回应@ Martin的回答:你不想使用标准库调用来提供内存来测试。

您的嵌入式工具链应该能够生成应用程序的内存映射。 您需要确定要测试的内存段,并从映射文件中提取它们的起始地址。

测试循环可能看起来是这样的:

const int* AddressToTest = MEM_SEGMENT; 
const int* SegLength  = SEGMENT_LENGTH; 
volatile int* mem; 
for (mem = AddressToTest; mem < AddressToTest + SegLength; mem++) 
{ 
    *mem = PATTERN; 
    if (*mem != PATTERN) {report("Read-Write Failure at %x",mem);} 
} 
//-or- you could separate the write and verify into 2 separate loops. 

这里最大的小问题,就是你不能测试你是从运行段,所以你需要仔细规划。嵌入式工具应具有某种链接器选项文件(和/或编译器#pragmas),它控制哪些代码使用哪个内存。所以你需要设置你的测试代码,使其运行在与被测内存不同的地方。

+1

我认为'volatile'是在这里。 – 2012-03-26 19:59:51

+0

好点,补充说。另外,请参阅http://www.barrgroup.com/Embedded-Systems/How-To/Memory-Test-Suite-C,以获得您应该测试什么样的内存故障的最佳解释。 – AShelly 2012-03-26 20:38:51