我怎么写信给记忆?

时间:2012-03-26 15:19:13

标签: c testing memory embedded ram

我正在尝试编写一个简单的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

上面的代码会工作吗?将十六进制模式写入存储器会将模式中的位打开吗?

我知道上面的代码非常糟糕但我只是想知道如果使用正确的逻辑做类似的事情会达到预期的效果。

由于

3 个答案:

答案 0 :(得分:3)

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

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

鸡和蛋问题是你想在嵌入式处理器上运行软件,这需要在某处运行的代码,这意味着内存(可能只是闪存,不需要任何或最小)。理想的情况是要么完全脱离rom,只使用处理器资源,要么仅使用内部芯片资源而不使用外部RAM,以便可以完全测试外部RAM。每个地址行等。否则你需要提出一个方案或声明大块的内存不被测试。

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

测试类型,您需要了解故障,您可能需要特别测试焊点和pcboard走线。所以你可以打开连接,这样你就可以让每个引脚都为1和0,你也可以有短路,一个零和零覆盖,你可能有“友好位”,相邻的引脚可能互相短路所以你想让每对信号彼此不同。

人们常常会像所有人一样进行测试,全部为零,5,As。然后棋盘测试一个内存位置说5s而下一个有As。对于地址线测试,你需要使用2的非幂,甚至更好的内存中的每个内存位置都有不同的值,例如每个32位字获得自己的地址。

作为一个快速测试,我在几个测试中涵盖了大部分内容,如果你使用伪随机函数,像lfsr一样可重复,一次使用随机函数填充所有内存,重新播种,返回并通过校验。然后再次通过并填充反转值,重新种子并验证反转值。你得到地址位,每个数据行但不是所有邻居都被检查。通过移动随机图案来重新播种和启动所有这些可以覆盖它。有时只使用随机测试作为地址测试,而传统的测试则为零,3s,Cs,6s,9s等。

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

答案 1 :(得分: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),它们控制哪些代码使用哪个内存。因此,您需要将测试代码设置为在与测试内存不同的位置运行。

答案 2 :(得分:0)

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

如果这个嵌入式系统真的是linux或Windows嵌入式或其他一些复杂的操作系统,那么它可能会更复杂,你可能有不同进程,缓存,乐观分配的内存地址空间来考虑。