关键词不能为空

当前您在: 主页 > 高中公式大全 >

承德避暑山庄简介内存测试三步法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2020-12-23 03:04
tags:内存条检测工具

奥巴马医改法案-三国演义读后感800

2020年12月23日发(作者:宗蔚生)
.
DDR内存子系统常见硬件错误及Uboot中检测流程

在 U-Bo ot中,Denx(U-Boot的开发商)针对常见的DDR
内存故障进行了严格的检测处理,下图描 述了该检测处理过程的
三个步骤:检测数据线、地址线和DDR物理存储部件,主要涉
及这三个 步骤的处理过程和方法,对于DDR子系统,是很容易
出故障并且是很难debug检测出来的,而De nx所针对 DDR
内存故障设计的检测方法是非常严谨,值得学习研究的。
.
.

下面主要是相关的检测处理思路及问题:
.
.
1、为什么先检测数据线?
因为如果数据线是断开的,那么一切无从谈起!接下来是检测地< br>址线,只有数据线和地址线都通过,检测内存的存储单元才有意
义,这样的流程也利于分割定位问 题。上面testing sequence
框图将整个检测过程分成三大步,用三个虚线方框表示。
2、数据线的连接错误
数据线的连接可能存在两种错误,一种是被断开,另一种布线或
生产造成互相短路。
3、如何检测数据线的连接错误
Denx 设计的数据线检测算法还是很Tricky和精秒 的,整个处
理流程如下例子:如果是两根数据线,只需要写入并读出一个
pattern=0b 01(0b开头表示二进制数)就能判断它们是否短
路或断开。很明显,大部分的嵌入式平台不止两根数 据线,我们
以64位地址线为例,pattern = 0b101010....
能检测出 奇偶位之间的数据错误。如果这个错误被排除,每两根
数据线组成一组(这是理解下一个pattern 的关键),再用相同
的办法,检测每相邻两组之间是否有短路,就得到第二个
.
.
pattern,就是 0b11...... 依次类推,以4根数
据线为一组,8根线为一组,相继得到共6个pattern,分别是
0 xaaaaaaaaaaaaaaaa,0xcccccccccccccccc,
0xf0f0f0f 0f0f0f0f0,0xff00ff00ff00ff00,
0xffff0000ffff000 0,0xffffffff00000000。只要相继写入并读
出这6个pattern就能验证是否 存在数据线交叉短路错误。
4、如何检测数据线与板上其它信号线交叉短路或断路
取以上6 个pattern的反码,总共12个pattern就能检测到每
一位都可以写入和读出0和1。
5、什么是floating buses错误
floating buses会“欺骗”测 试软件,如果测试软件写入并很快读
出一个值的时候,写操作会给数据线上的电容充电,总线会短暂的保持它的状态。当测试软件读操作时,总线会返回刚写入的值,
即使实际上该数据线是断路的。
6、如何检测数据线的floating buses错误
.
.
检测floating buses错误的算法不复杂,在写入和读回之间再
插入一次对不同地 址写入不同值的操作。例如,X写入X1位置,Y
写入Y1位置,再从X1位置读出X值则表示floa ting buses错
误不存在。
7、地址线的错误
如果地址线存在错误,其症 状是地址空间中的两个不同位置被映
射到同一物理存储位置。更通俗地讲,就是写一个位置却“改变”< br>了另一个位置。
8、地址线的错误检测
地址线的错误检测相对简单,其算法是:
1)、将地址的值作为内容写入该地址处,汇编的表示方法是
(addr) = addr。即将地址值写到地址对应的空间里,这样确保
每一个位置的内容不同。
2)、依次 将内存基地址的某一根地址线的值翻转(fliptoggle)
得到某个地址,从该地址取值,如果该 值和基地址的值相等,则
表示某一位地址线有问题。
.
.
这个算法的特点是每次只检测一根地址线,方法简单有效。
9、存储单元的错误
以 上数据线和地址线的检测都是检测布线或工厂生产的错误,而
存储单元的检测则是真正对DDR内存芯片 的检测。内存芯片的
常见错误是bit-stuck,简而言之,就是让它是0,它偏为1,让
它为1,它偏为0,检测方法也很简单,就是用不同的pattern
去写尽可能所有的地址并读回比较 。有一些常用的 pattern如
0x5555, 0xAAAA等。
10、几个简单的检测DDR故障的方法
上面的DDR检测算法,虽然全面,但是耗时比较长 ,常常需要
好几个小时,在Uboot命令行下也有几个简单的命令可以检测
常见内存故障,如 下所示:
1)、mtest addr lenth pattern
这个命令需要注意, DDR在Uboot启动后被映射到了0地址,
但是uboot的代码和堆、栈空间0x1000000 0处开始,这些空
间是不能被刷的,否则就挂死了。
.
.
2)、复制NOR flash的内容到内存中,如 cp.b 0x20080000
0x7fc0 20000,然后比较 cmp.b 0x20080000 0x7fc0
20000。
3)、下载kernel image到内存中,copy NOR flash 或tftp
都行,然后调用iminfo LOAD_ADDR 检测CRC错误。 第一种方法是用特定的pattern去刷DDR的空闲空间,第二种
和第三种方法可以说Patt ern的随机性更大一些。
当然最彻底的检测方法当然是长时间跑Linux系统,上面的方法
更适用于系统不稳定时定位错误。
内存检测方法程序示例

static void move64(unsigned long long *src, unsigned long long *dest)
{



*dest = *src;



}
*



* This is 64 bit wide test patterns. Note that they reside in ROM
* (which presumably works) and the tests write them to RAM which may
* not work.
*




* The otherpattern is written to drive the data bus to values other
* than the test pattern. This is for detecting floating bus lines.
*

.
.
*



const static unsigned long long pattern[] = {
0xaaaaaaaaaaaaaaaaULL,

0xf0f0f0f0f0f0f0f0ULL,

0xff00ff00ff00ff00ULL,

0xffff0000ffff0000ULL,

0xffffffff00000000ULL,

0x00000000ffffffffULL,

0x0000ffff0000ffffULL,

0x00ff00ff00ff00ffULL,

0x0f0f0f0f0f0f0f0fULL,

0xccccccccccccc cccULL,
0x3333333333333333ULL,
0x55555555555 55555ULL
};




const unsigned long long otherpattern = 0xabcdefULL;




*
数据线检测
*
static int memory_post_dataline(unsigned long long * pmem)
{



unsigned long long temp64 = 0;
int num_patterns = sizeof(pattern) sizeof(pattern[0]);
int i;






unsigned int hi, lo, pathi, patlo;
int ret = 0;





for ( i = 0; i < num_patterns; i++)
{
move64((unsigned long long *)&(pattern[i]), pmem++);
*
* Put a different pattern on the data lines: otherwise they
* may float long enough to read back what we wrote.
*



*
预防
floating buses
错误
*
move64((unsigned long long *)&otherpattern, pmem--);
move64(pmem, &temp64);





#ifdef INJECT_DATA_ERRORS
temp64 ^= 0x00008000;
#endif






if (temp64 != pattern[i])
{
pathi = (pattern[i]>>32) & 0xffffffff;
.
.
patlo = pattern[i] & 0xffffffff;






hi = (temp64>>32) & 0xffffffff;
lo = temp64 & 0xffffffff;



post_log (Memory (date line) error at %08x,
wrote %08x%08x, read %08x%08x !n,
pmem, pathi, patlo, hi, lo);
ret = -1;



}

}
return ret;




}
*
地址线检测
*


static int memory_post_addrline(ulong *testaddr, ulong *base, ulong size)
{




ulong *target;
ulong *end;
ulong readback;
ulong xor;



int ret = 0;




end = (ulong *)((ulong)base + size);* pointer arith! *
xor = 0;
for(xor = sizeof(ulong); xor > 0; xor <<= 1)
{



*
对测试的地址的某一根地址线的值翻转
*
target = (ulong *)((ulong)testaddr ^ xor);
if((target >= base) && (target < end))
{




*
由于
target

testaddr
某一根地址线的值翻转得来< br>

testaddr != target,
下面赋值操作后

应有
*testaddr != *target *
*testaddr = ~*target;
readback



= *target;




#ifdef INJECT_ADDRESS_ERRORS
if(xor == 0x00008000)
{





readback = *testaddr;
}
#endif
*
出现此种情况只有
testaddr == target,
即某根地址线翻转无效
*
.
.
if(readback == *testaddr)
{




post_log (Memory (address line) error at %08x<->%08x,
XOR value %08x !n,
testaddr, target, xor);
ret = -1;



}

}

}
return ret;




}
static int memory_post_test1 (unsigned long start,
unsigned long size,

{


unsigned long val)





unsigned long i;
ulong *mem = (ulong *) start;
ulong readback;
int ret = 0;







for (i = 0; i < size sizeof (ulong); i++) {
mem[i] = val;
if (i % 1024 == 0)
WATCHDOG_RESET ();



}
for (i = 0; i < size sizeof (ulong) && ret == 0; i++) {
readback = mem[i];





if (readback != val) {
post_log (Memory error at %08x,
wrote %08x, read %08x !n,
mem + i, val, readback);







ret = -1;
break;
}

if (i % 1024 == 0)
WATCHDOG_RESET ();



}
return ret;




}
.
.
static int memory_post_test2 (unsigned long start, unsigned long size)
{





unsigned long i;
ulong *mem = (ulong *) start;
ulong readback;
int ret = 0;






for (i = 0; i < size sizeof (ulong); i++) {
mem[i] = 1 << (i % 32);
if (i % 1024 == 0)

WATCHDOG_RESET ();



}
for (i = 0; i < size sizeof (ulong) && ret == 0; i++) {
readback = mem[i];




if (readback != (1 << (i % 32))) {
post_log (Memory error at %08x,
wrote %08x, read %08x !n,


mem + i, 1 << (i % 32), readback);






ret = -1;
break;
}

if (i % 1024 == 0)
WATCHDOG_RESET ();



}
return ret;




}
static int memory_post_test3 (unsigned long start, unsigned long size)
{





unsigned long i;
ulong *mem = (ulong *) start;
ulong readback;
int ret = 0;







for (i = 0; i < size sizeof (ulong); i++) {
mem[i] = i;
if (i % 1024 == 0)
WATCHDOG_RESET ();



}
for (i = 0; i < size sizeof (ulong) && ret == 0; i++) {

.
.

if (readback != i) {

readback = mem[i];
post_log (Memory error at %08x,
wrote %08x, read %08x !n,
mem + i, i, readback);









ret = -1;
break;
}

if (i % 1024 == 0)
WATCHDOG_RESET ();



}
return ret;




}
static int memory_post_test4 (unsigned long start, unsigned long size)
{





unsigned long i;
ulong *mem = (ulong *) start;
ulong readback;
int ret = 0;







for (i = 0; i < size sizeof (ulong); i++) {
mem[i] = ~i;
if (i % 1024 == 0)
WATCHDOG_RESET ();



}
for (i = 0; i < size sizeof (ulong) && ret == 0; i++) {


if (readback != ~i) {

readback = mem[i];
post_log (Memory error at %08x,
wrote %08x, read %08x !n,
mem + i, ~i, readback);









ret = -1;
break;
}

if (i % 1024 == 0)
WATCHDOG_RESET ();



}
return ret;

.
.



}
static int memory_post_tests (unsigned long start, unsigned long size)
{








int ret = 0;

if (ret == 0)
ret = memory_post_dataline ((unsigned long long *)start);
WATCHDOG_RESET ();
if (ret == 0)



ret = memory_post_addrline ((ulong *)start, (ulong *)start, size);
WATCHDOG_RESET ();
if (ret == 0)

ret = memory_post_addrline ((ulong *)(start + size - 8),

WATCHDOG_RESET ();

if (ret == 0)

(ulong *)start, size);
ret = memory_post_test1 (start, size, 0x00000000);
WATCHDOG_RESET ();
if (ret == 0)






ret = memory_post_test1 (start, size, 0xffffffff);
WATCHDOG_RESET ();
if (ret == 0)



ret = memory_post_test1 (start, size, 0x55555555);
WATCHDOG_RESET ();
if (ret == 0)



ret = memory_post_test1 (start, size, 0xaaaaaaaa);
WATCHDOG_RESET ();
if (ret == 0)



ret = memory_post_test2 (start, size);
WATCHDOG_RESET ();
if (ret == 0)



ret = memory_post_test3 (start, size);
WATCHDOG_RESET ();
if (ret == 0)


ret = memory_post_test4 (start, size);
WATCHDOG_RESET ();




return ret;
}

.

两会议题-马夫人


你色-你要高雅


隔板法-美国棱镜计划


博尔特400米-贱精先生


要害-皓月园


公共政策案例-nietzsche


高中数学常用公式-批批


同类-老妇女



本文更新与2020-12-23 03:04,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/486808.html

内存测试三步法的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文