检测内存测试三步法

内存测试  时间:2021-01-12  阅读:()

DDR内存子系统常见硬件错误及Uboot中检测流程在U-Boot中 Denx U-Boot的开发商针对常见的DDR内存故障进行了严格的检测处理下图描述了该检测处理过程的三个步骤检测数据线、地址线和DDR物理存储部件主要涉及这三个步骤的处理过程和方法对于DDR子系统是很容易

下面主要是相关的检测处理思路及问题

1、为什么先检测数据线

因为如果数据线是断开的那么一切无从谈起接下来是检测地址线只有数据线和地址线都通过检测内存的存储单元才

示。

2、数据线的连接错误

数据线的连接可能存在两种错误一种是被断开 另一种布线或生产造成互相短路。

3、如何检测数据线的连接错误

pattern=0b01 0b开头表示二进制数就能判断它们是否短路或断开。很明显大部分的嵌入式平台不止两根数据线我们

这是理解下一个pattern的关键 再用相同的办法检测每相邻两组之间是否有短路就得到第二个pattern就是0b110011001100. . . . . .依次类推 以4根数据线为一组 8根线为一组相继得到共6个pattern分别是

0x aaaaaaaaaaaaaaaa  0xcccccccccccccccc 0xf0f0f0f0f0f0f0f0

0xff 00 ff 00 ff 00ff 00 0xffff 0000ffff 0000 0xffffffff 00000000。只要相继写入并读出这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值则表示floating buses错误不存在。

7、地址线的错误

如果地址线存在错误其症状是地址空间中的两个不同位置被映射到同一物理存储位置。更通俗地讲就是写一个位置却“改变”了另一个位置。

8、地址线的错误检测

地址线的错误检测相对简单其算法是

1 、将地址的值作为内容写入该地址处 汇编的表示方法是(addr)=addr。即将地址值写到地址对应的空间里这样确保每一个位置的内容不同。

2 、依次将内存基地址的某一根地址线的值翻转

值如果该值和基地这个算法的特点是每次只检测一根地址线方法简单有效。

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的代码和堆、栈空间0x10000000处开始这些空间是不能被刷的否则就挂死了。

2 、复制NORflash的内容到内存中如cp.b 0x200800000x7fc020000然后比较cmp.b 0x200800000x7fc020000。

3 、下载kernel image到内存中 copy NOR flash或tftp都行然后调用iminfo LOAD_ADDR检测CRC错误。

当然最彻底的检测方法当然是长时间跑Linux系统上面的方法更适用于系统不稳定时定位错误。

内存检测方法程序示例static voidmove64(unsigned long long *src, unsigned long long *dest){

*dest = *src;

}

/*

* This is 64 bit wide testpatterns Note that theyreside in ROM

* (which presumably works) and the tests write them to RAM which may

* notwork

*

* The "otherpattern" is written to drive the data bus to values other

* than the testpattern This is for detecting floating bus lines

*

*/const static unsigned long long pattern[] = {

0x aaaaaaaaaaaaaaaa ULL,

0x cccccccccccccccc ULL,

0xf0f0f0f0f0f0f0f0ULL,

0xff00ff00ff00ff00ULL,

0xffff0000ffff0000ULL,

0xffffffff00000000ULL,

0x00000000ffffffffULL,

0x0000ffff0000ffffULL,

0x00ff00ff00ff00ffULL,

0x0f0f0f0f0f0f0f0fULL,

0x 3333333333333333ULL,

0x 5555555555555555ULL

};const unsigned long long otherpattern = 0x0123456789abcdefULL;/*数据线检测*/static intmemory_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 differentpattern on the data lines: otherwise they

*mayfloat long enough to read backwhatwe 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 intmemory_post_addrline(ulong *testaddr, ulong *base, ulong size){ulong *target;ulong *end;ulong readback;ulongxor;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某一根地址线的值翻转得来

故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 intmemory_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 intmemory_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)

iON Cloud七月促销适合稳定不折腾的用户,云服务器新购半年付8.5折,洛杉矶/圣何塞CN2 GT线路,可选Windows系统

iON Cloud怎么样?iON Cloud今天发布了7月份优惠,使用优惠码:VC4VF8RHFL,新购指定型号VPS半年付或以上可享八五折!iON的云服务器包括美国洛杉矶、美国圣何塞(包含了优化线路、CN2 GIA线路)、新加坡(CN2 GIA线路、PCCW线路、移动CMI线路)这几个机房或者线路可供选择,有Linux和Windows系统之分,整体来说针对中国的优化是非常明显的,机器稳定可靠,比...

HostKvm - 夏季云服务器七折优惠 香港和韩国机房月付5.95美元起

HostKvm,我们很多人都算是比较熟悉的国人服务商,旗下也有多个品牌,差异化多占位策略营销的,商家是一个创建于2013年的品牌,有提供中国香港、美国、日本、新加坡区域虚拟化服务器业务,所有业务均对中国大陆地区线路优化,已经如果做海外线路的话,竞争力不够。今天有看到HostKvm夏季优惠发布,主要针对香港国际和韩国VPS提供7折优惠,折后最低月付5.95美元,其他机房VPS依然是全场8折。第一、夏...

国内云服务器 1核 2G 2M 15元/月 萤光云

标题【萤光云双十二 全场6折 15元/月 续费同价】今天站长给大家推荐一家国内云厂商的双十二活动。萤光云总部位于福建福州,其成立于2002 年。主打高防云服务器产品,主要提供福州、北京、上海 BGP 和香港 CN2 节点。萤光云的高防云服务器自带 50G 防御,适合高防建站、游戏高防等业务。这家厂商本次双十二算是性价比很高了。全线产品6折,上海 BGP 云服务器折扣更大 5.5 折(测试了一下是金...

内存测试为你推荐
海外虚拟主机空间美国虚拟空间哪个好?成都虚拟空间成都有没有能玩ps主机游戏的网咖?免费网站空间申请需要一个免费的网站空间申请地址。网站空间免备案哪有不用备案的网站空间?虚拟主机管理系统如何用win虚拟主机管理系统搭建虚拟主机mysql怎么管理虚拟主机上的MYSQL?(高分回报)新加坡虚拟主机请问新网的虚拟主机靠谱吗?厦门虚拟主机我想用我自己的电脑做虚拟主机怎么弄啊华众虚拟主机管理系统华众虚拟主机管理系统请问。华众 虚拟主机管理系统 这个问题 怎么解决 。就是后台可以开通虚拟主机 没有问题,但是 删除虚拟主机 后台显示删除成功的,但是实际在服务器上 文件夹 ftp iis站点 都没有被删除 是什么问题域名解析什么是域名解析?它有什么作用?
vps是什么 国外php主机 wdcp 2017年万圣节 好看的桌面背景图 web服务器架设软件 商家促销 免费smtp服务器 促正网秒杀 softbank邮箱 老左正传 cn3 paypal注册教程 支持外链的相册 shopex主机 创建邮箱 空间购买 德隆中文网 主机返佣 腾讯网盘 更多