内存测试三步法_第1页
内存测试三步法_第2页
内存测试三步法_第3页
内存测试三步法_第4页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.DDR内存子系统常见硬件错误及Uboot中检测流程在 U-Boot中,Denx ( U-Boot的开发商)针对常见的 DDR内存故障进行了严格的检测处理,下图描述了该检测处理过程的三个步骤:检测数据线、地址线和DDR 物理存储部件,主要涉及这三个步骤的处理过程和方法,对于DDR 子系统,是很容易出故障并且是很难debug检测出来的,而 Denx所针对DDR内存故障设计的检测方法是非常严谨,值得学习研究的。.下面主要是相关的检测处理思路及问题:.1 、为什么先检测数据线?因为如果数据线是断开的,那么一切无从谈起!接下来是检测地址线,只有数据线和地址线都通过,检测内存的存储单元才有意义,这样的流

2、程也利于分割定位问题。上面 testing sequence 框图将整个检测过程分成三大步,用三个虚线方框表示。2 、数据线的连接错误数据线的连接可能存在两种错误,一种是被断开,另一种布线或生产造成互相短路。3 、如何检测数据线的连接错误Denx设计的数据线检测算法还是很Tricky和精秒的,整个处理流程如下例子:如果是两根数据线,只需要写入并读出一个pattern=0b01(0b 开头表示二进制数)就能判断它们是否短路或断开。很明显,大部分的嵌入式平台不止两根数据线,我们以 64 位地址线为例,能检测出奇偶位之间的数据错误。如果这个错误被排除,每两根数据线组成一组(这是理解下一个patter

3、n的关键),再用相同的办法,检测每相邻两组之间是否有短路,就得到第二个.pattern,就是依次类推,以4 根数据线为一组, 8 根线为一组,相继得到共6 个 pattern,分别是0xaaaaaaaaaaaaaaaa,0xcccccccccccccccc,0xf0f0f0f0f0f0f0f0,0xff00ff00ff00ff00,0xffff0000ffff0000,0xffffffff00000000。只要相继写入并读出这 6 个 pattern就能验证是否存在数据线交叉短路错误。4 、如何检测数据线与板上其它信号线交叉短路或断路取以上 6 个 pattern的反码,总共 12 个 pat

4、tern就能检测到每一位都可以写入和读出0 和 1 。5 、什么是 floating buses错误floating buses会“欺骗 ”测试软件, 如果测试软件写入并很快读出一个值的时候,写操作会给数据线上的电容充电,总线会短暂的保持它的状态。当测试软件读操作时, 总线会返回刚写入的值,即使实际上该数据线是断路的。6 、如何检测数据线的floating buses错误.检测 floating buses错误的算法不复杂,在写入和读回之间再插入一次对不同地址写入不同值的操作。 例如,X 写入 X1 位置 ,Y 写入 Y1 位置,再从 X1 位置读出 X 值则表示 floating buses

5、 错误不存在。7 、地址线的错误如果地址线存在错误,其症状是地址空间中的两个不同位置被映射到同一物理存储位置。更通俗地讲,就是写一个位置却 “改变 ” 了另一个位置。8 、地址线的错误检测地址线的错误检测相对简单,其算法是:1 )、将地址的值作为内容写入该地址处,汇编的表示方法是(addr) = addr。即将地址值写到地址对应的空间里,这样确保每一个位置的内容不同。2 )、依次将内存基地址的某一根地址线的值翻转(flip/toggle)得到某个地址,从该地址取值,如果该值和基地址的值相等,则表示某一位地址线有问题。.这个算法的特点是每次只检测一根地址线,方法简单有效。9 、存储单元的错误以上

6、数据线和地址线的检测都是检测布线或工厂生产的错误,而存储单元的检测则是真正对 DDR 内存芯片的检测。内存芯片的常见错误是 bit-stuck ,简而言之,就是让它是 0 ,它偏为 1,让它为 1 ,它偏为 0 ,检测方法也很简单,就是用不同的 pattern去写尽可能所有的地址并读回比较。有一些常用的pattern如0x5555, 0xAAAA等。10 、几个简单的检测DDR 故障的方法上面的 DDR 检测算法,虽然全面,但是耗时比较长,常常需要好几个小时,在 Uboot 命令行下也有几个简单的命令可以检测常见内存故障,如下所示:1 )、 mtest addr lenth pattern这个

7、命令需要注意, DDR 在 Uboot启动后被映射到了0 地址,但是 uboot的代码和堆、栈空间0x10000000处开始,这些空间是不能被刷的,否则就挂死了。.2 )、复制 NOR flash的内容到内存中,如cp.b 0x200800000x7fc0 20000 ,然后比较 cmp.b 0x20080000 0x7fc0 20000 。3 )、下载 kernel image到内存中, copy NOR flash或 tftp都行,然后调用iminfo LOAD_ADDR检测 CRC 错误。第一种方法是用特定的pattern去刷 DDR 的空闲空间,第二种和第三种方法可以说Pattern的

8、随机性更大一些。当然最彻底的检测方法当然是长时间跑 Linux 系统,上面的方法更适用于系统不稳定时定位错误。内存检测方法程序示例st a t i c v o i d m o v e 6 4 ( u n si g n e d l o n g l o n g * s r c , u n s i g n e d l o n g l o n g * d es t )* d e s t =* sr c;/ *T h i s i s 6 4 b i tw i d e t e s t p a t t e r n s.N o t e t h a tt h e yr es i d e i n R O M*(

9、w h i ch p r e s u m a b l yw o r k s ) a n d t h e t es t s w r i t e t h e mt o R A Mw h i c h m a y* n o t w o r k.*T h e " o t h er p a t t er n " i s w r i t t e n t o d r i v e t h e d a t a b u s t o v a l u e s o t h er*t h a n t h e t e stp a t t e r n.T h i s i s f o rd e t e ct

10、i n gf l o a t i n g b u s l i n e s.*.* /co n s t s t a t i c u n s i g n e d l o n g l o n g p a t t e r n = 0 x a a a a a a a a a a a a a a a a U L L ,0 x cc c c c c c c c cc c c c c c U L L ,0 x f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 U L L ,0 x f f 0 0 f f 0 0 f f 0 0 f f 0 0 U L L ,0 x f f f f 0 0 0 0

11、 f f f f 0 0 0 0 U L L ,0 x f f f f f f f f 0 0 0 0 0 0 0 0 U L L ,0 x 0 0 0 0 0 0 0 0 f f f f f f f f U L L ,0 x 0 0 0 0 f f f f 0 0 0 0 f f f f U L L ,0 x 0 0 f f 0 0 f f 0 0 f f 0 0 f f U L L ,0 x 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f U L L ,0 x 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 U L L ,0 x 5 5 5 5 5 5 5

12、5 5 5 5 5 5 5 5 5 U L L ;co n s t u n s i g n e d l o n g l o n g o t h e r p a t t e r n =0 x 0 1 2 3 4 5 6 7 8 9 a b c d e f U L L ;/*数据线检测*/st a t i c i n tm e m o r y _ p o s t _ d a t a l i n e ( u n s i g n ed l o n g l o n g *p m em )u n s i g n e d l o n g l o n g t e m p 6 4 = 0 ;i n t n u

13、m _ p a t t e r n s =si z e o f ( p a t t e r n ) /s i ze o f ( p a t t e r n 0 ) ;i n t i ;u n s i g n e d i n th i , l o , p a t h i , p a t l o ;i n t r e t =0 ;f o r(i=0 ;i<n u m _ p a t t e r n s ;i + + )m o v e6 4 ( ( u n s i g n e d l o n g l o n g* ) & ( p a t t e r n i ) , p m e m +

14、+ ) ;/ * P u t ad i f f er e n tp a t t e r n o nt h e d a t a l i n e s :* m a y f l o a t l o n g e n o u g h t o r e a d b a ckw h a t* /o t h er w i s e t h e yw e w r o t e./ *预 防 f l o a t i n g b u s e s 错 误* /m o v e6 4 ( ( u n s i g n e d l o n g l o n g* ) & o t h e r p a t t e r n , p

15、 m e m - - ) ;m o v e6 4 ( p m e m , & t e m p 6 4 ) ;# i f d e f I N J E C T _ D A T A _ E R R O R St e m p 6 4 =0 x 0 0 0 0 8 0 0 0 ;# e n d i fi f ( t e m p 6 4 ! =p a t t e r n i )p a t h i= ( p a t t er n i > > 3 2 )&0 x f f f f f f f f ;.p a t l o =p a t t e r n i & 0 x f f f

16、 f f f f f ;h i= ( t e m p 6 4 > > 3 2 )&0 x f f f f f f f f ;l o =t e m p 6 4 & 0 x f f f f f f f f ;p o st _ l o g ( " M e m o r y ( d a t e l i n e ) e r r o r " w r o t e % 0 8 x % 0 8 x , r e a d % 0 8 x % 0 8 xp m e m , p a t h i , p a t l o , h i , l o ) ;r e t =- 1 ;a

17、 t% 0 8 x , "! n " ,r e t u r n r e t ;/*地址线检测*/st a t i c i n tm e m o r y _ p o s t _ a d d r l i n e( u l o n g * t e s t a d d r , u l o n g * b a s e, u l o n g s i z e )u l o n g * t a r g e t ;u l o n g * e n d ;u l o n g r e a d b a c k ;u l o n g x o r ;i n tr et=0 ;en d = ( u l o

18、 n g * ) ( ( u l o n g ) b a se + s i z e ) ; / *p o i n t e ra r i t h !* /x o r=0 ;f o r ( x o r=s i z eo f ( u l o n g ) ;x o r>0 ;x o r< < = 1 )/*对测试的地址的某一根地址线的值翻转*/t a r g e t=( u l o n g * ) ( ( u l o n g ) t e s t a d d rx o r ) ;i f ( ( t a r g e t > =b a s e)& &( t a r g

19、 et<e n d ) )/ *由 于 t a r g et 是 t e st a d d r 某 一 根 地 址 线 的 值 翻 转 得 来故 t es t a d d r ! =t a r g e t , 下 面 赋 值 操 作 后应 有 * t e s t a d d r! =* t a r g e t* /* t es t a d d r r e a d b a c k= * t a r g e t ;= * t a r g e t ;# i f d e f I N J E C T _ A D D R E S S _ E R R O R Si f ( x o r= = 0 x 0

20、 0 0 0 8 0 0 0 )r e a d b a c k =* t e s t a d d r ;# e n d i f/ *出 现 此 种 情 况 只 有 t e s t a d d r = = t a r g e t , 即 某 根 地 址 线 翻 转 无 效* /.i f ( r e a d b a ck= = * t es t a d d r )p o st _ l o g ( " M e m o r y( a d d r ess l i n e )er r o ra t% 0 8 x < - > % 0 8 x , "" X O R v

21、 a l u e %0 8 x !n " ,t e st a d d r , t a r g e t , x o r ) ;r e t =- 1 ;r e t u r n r e t ;st a t i c i n tm e m o r y _ p o s t _ t e st 1 ( u n s i g n e d l o n g st a r t ,u n si g n e d l o n g s i z e ,u n si g n e d l o n g v a l )u n s i g n e d l o n g i ;u l o n g * m em= ( u l o n

22、g * )st a r t ;u l o n g r e a d b a c k ;i n t r e t =0 ;f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g ) ; i + + )m e m i =v a l ;i f ( i% 10 2 4 = = 0 )WATCH DOG_ RESET ();f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g )& & r e t = =0 ;i + + )r e a d b a c k =m e m i ;i f ( r e a d

23、b a c k ! =v a l )p o st _ l o g ( " M e m o r yer r o ra t% 0 8 x , "" w r o t e % 0 8 x , r e a d % 0 8 x !n " ,m e m+i , v a l , r e a d b a c k ) ;r e t =- 1 ;b r e a k ;i f ( i% 10 2 4 = = 0 )WATCH DOG_ RESET ();r e t u r n r e t ;.st a t i c i n tm e m o r y _ p o s t _ t e

24、 st 2 ( u n s i g n e d l o n g s t a r t , u n s i g n e d l o n g si z e )u n s i g n e d l o n g i ;u l o n g * m em= ( u l o n g * )st a r t ;u l o n g r e a d b a c k ;i n t r e t =0 ;f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g ) ; i + + )m e m i =1 < < ( i% 3 2 ) ;i f ( i% 10 2 4 =

25、 = 0 )WATCH DOG_ RESET ();f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g )r e a d b a c k =m e m i ;i f ( r e a d b a c k ! = ( 1 < < ( i % 3 2 ) ) ) p o st _ l o g ( " M e m o r y er r o r a t % 0 8 x ," w r o t e % 0 8 x , r e a d % 0 8 x !n " ,m e m+i , 1 < <( i% 3 2

26、 ) , r e a d b a c k ) ;r e t =- 1 ;b r e a k ;i f ( i% 10 2 4 = = 0 )WATCH DOG_ RESET ();r e t u r n r e t ;& & r e t = =0 ;i + + )"st a t i c i n tm e m o r y _ p o s t _ t e st 3 ( u n s i g n e d l o n g s t a r t , u n s i g n e d l o n g si z e )u n s i g n e d l o n g i ;u l o n

27、g * m em= ( u l o n g * )st a r t ;u l o n g r e a d b a c k ;i n t r e t =0 ;f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g ) ; i + + )m e m i =i ;i f ( i% 10 2 4 = = 0 )WATCH DOG_ RESET ();f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g )& & r e t = =0 ;i + + ).r e a d b a c k =m e m

28、i ;i f ( r e a d b a c k ! =i )p o st _ l o g ( " M e m o r yer r o ra t% 0 8 x , "" w r o t e % 0 8 x , r e a d % 0 8 x !n " ,m e m+i , i , r e a d b a c k ) ;r e t =- 1 ;b r e a k ;i f ( i% 10 2 4 = = 0 )WATCH DOG_ RESET ();r e t u r n r e t ;st a t i c i n tm e m o r y _ p o s

29、 t _ t e st 4 ( u n s i g n e d l o n g s t a r t , u n s i g n e d l o n g si z e )u n s i g n e d l o n g i ;u l o n g * m em= ( u l o n g * )st a r t ;u l o n g r e a d b a c k ;i n t r e t =0 ;f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g ) ; i + + )m e m i = i ;i f ( i% 10 2 4 = = 0 )WATCH

30、DOG_ RESET ();f o r( i =0 ;i<s i z e /s i ze o f ( u l o n g )& & r e t = =0 ;i + + )r e a d b a c k =m e m i ;i f ( r e a d b a c k ! = i )p o st _ l o g ( " M e m o r yer r o ra t% 0 8 x , "" w r o t e % 0 8 x , r e a d % 0 8 x !n " ,m e m+i , i , r e a d b a c k ) ;

31、r e t =- 1 ;b r e a k ;i f ( i% 10 2 4 = = 0 )WATCH DOG_ RESET ();r e t u r n r e t ;.st a t i c i n tm e m o r y _ p o s t _ t e st s ( u n s i g n e d l o n g st a r t , u n s i g n e d l o n g si ze )i n t r e t =0 ;i f ( r e t= =0 )r e t =m em o r y _ p o st _ d a t a l i n e ( ( u n s i g n e d l o n g l o n g * ) s t a r t ) ;WATCH DOG_ RESET ();i f ( r e t= =0 )r e t =m em o r y _ p o st _ a d d r l i n e ( ( u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论