完整是一个含糊不清的词.它可能意味着不同的温度,电压以及具有不同元件容差的一系列器件.当你站点MemTest86时,我想我明白了.我见过的大多数项目都是基于C的,无法测试所有内容.
有记录的算法,如行走位等.很大程度上取决于你的RAM类型.我想你有某种类型的SDRAM. SDRAM有许多不同的周期.有单拍读/写,银行到银行转移,终止突发等.
就个人而言,我们有一个系统,当通过以太网(DMA)进行SSH传输时,5%的电路板会出现问题. SSH涉及加密,这是cpu /内存密集型,DMA引擎通常执行与cpu(带缓存)不同的SDRAM周期.
这是一些要求,
>用于驻留代码的非SDRAM内存.
>裸金属框架(无缓存,中断,DMA等)
>关闭DCache.
>打开代码的ICache.
另一个限制要求是运行时间.完整的SDRAM测试可能需要数年才能在单板上运行.我发现伪随机地址/数据测试效果很好.只需获取与SDRAM大小相关的数字,并将其用作增量.最简单的情况是1.您可能希望找到其他人不断更改行,库和设备大小;银行规模-1例如;然而素数会更好,因为你有不同的位数一直在变化.关闭缓存后,您可以使用char,short,int和long long指针来测试一些不同的突发长度.这些测试会很慢.您将需要使用ldm / stm对来模拟完整的SDRAM突发,这些更常见于缓存,因此您应该使用ldm / stm来模拟它们.这也是最快的测试之一.
typedef unsigned char b8;
typedef unsigned short b16;
typedef unsigned long b32;
typedef unsigned long long b64;
/* Use a macro to speed code. The compiler will use constants for
* _incr and _wrap instead of registers which cause spilling. A
* macro centralizes the memory test logic.
*/
#define MEMTEST(name,type,_incr,_wrap) ...
/* Sequential tests. */
MEMTEST(do_mem_seq8,b8,97,1)
MEMTEST(do_mem_seq16,b16,50839,1)
MEMTEST(do_mem_seq32,b32,3999971,1)
MEMTEST(do_mem_seq64,b64,1)
/* Random tests. These test try to randomize both the data and the
* address access.
*/
/* 97/0x61 prime for char and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd8,9999991)
/* 50839/C697 large prime for 64k and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd16,9999991)
/* 3999971/3D08E3 prime and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd32,9999991)
/* 3999971/3D08E3 prime and 9999991/0x989677 prime for 64MB. */
MEMTEST(do_mem_rnd64,9999991)
incr是数据增量,wrap是地址增量.突发的算法将是相同的.这是一些内联gcc汇编程序,
register ulong t1 asm ("r0") = 0; \
register ulong t2 asm ("r4") = t1 + incr; \
register ulong t3 asm ("r6") = t2 + incr; \
register ulong t4 asm ("r8") = t3 + incr; \
/* Run an entire burst line. */ \
__asm__ (" stmia %[ptr],{%0,%1,%2,%3}\r\n" : : \
"r" (t1),"r" (t2),"r" (t3),"r" (t4),\
[ptr]"r" (start + (addr<<2)) : \
"memory" ); \
/* Read four 32 bits values. */ \
__asm__ (" ldmia %[ptr],%3}\r\n" : \
"=r" (t1),"=r" (t2),"=r" (t3),"=r" (t4) : \
[ptr]"r" (start + (addr<<2)) ); \
这些测试很简单,应该适合代码缓存,这将最大限度地增加RAM的压力.我们的主要问题是DQS延迟,这对DDR-SDRAM至关重要,可能与温度和电压有关,并且会随PCB布局和材料而变化.
如果要使用SDRAM芯片优化存储器控制器寄存器,则可以使用Cachbench.它也可能对测试有用.
另请参阅:Unix Stack Exchange (same question).我在Linux下使用了这些基于C的测试套件,但它们在我们的案例中没有暴露任何问题.对于上面描述的内容,memtest86 algorithms可能没有压力(对于PCB故障);虽然测试7或burnBX测试很接近.我认为memtest86可以解决DRAM芯片问题,而不是电路板设计问题.
编辑:另一个问题是与SDRAM芯片的瞬态/串扰.如果您的设备驱动程序是高电流或高频设备,SDRAM接口可能会发生串扰,或者由于电源变化而获得双时钟.因此RAM测试可能没有问题,SDRAM错误仅在使用特定硬件部分时发生.另外请注意,Android设备不使用动态时钟并更改SDRAM频率.当时钟改变时,信号可以穿过共振.