1. 云栖社区>
  2. 技术文集>
  3. 列表>
  4. 正文

uboot中的内存测试方法

作者:用户 来源:互联网 时间:2018-08-02 12:00:47

嵌入式

uboot中的内存测试方法 - 摘要: 本文讲的是uboot中的内存测试方法, 1. Denx的UBOOT针对DDR内存的检测过程               从上图,可以看出要经过3个阶段:           (1) 检测数据线             

1. Denx的UBOOT针对DDR内存的检测过程

    uboot中的内存测试方法

          从上图,可以看出要经过3个阶段:

          (1) 检测数据线

                  如果数据线是断开的,则一切测试都无从谈起,因此先测试Data lines.

                  Data lines可能有2种错误:

                  (1.1) 断开

                          如果是两根数据线,只需要写入并读出一个pattern=0b01(0b开头表示二进制数)就能判断它们是否短路或断开。

                          大部分的嵌入式平台不止两根数据线,我们以64位地址线为例:
                          pattern = 0b101010101010101010.... 能检测出奇偶位之间的数据错误。
                          如果这个错误被排除,每两根数据线组成一组(这是理解下一个pattern的关键),
                          再用相同的办法,检测每相邻两组之间是否有短路,就得到第二个pattern,就是 0b110011001100...... 
                          依次类推,以4根数据线为一组,8根线为一组,......,相继得到共6个pattern,分别是 :
                         0xaaaaaaaaaaaaaaaa (单根数据线为一组)
                         0xcccccccccccccccc (02根数据线为一组)
                         0xf0f0f0f0f0f0f0f0 (04根数据线为一组)
                         0xff00ff00ff00ff00 (08根数据线为一组)
                         0xffff0000ffff0000 (16根数据线为一组)
                         0xffffffff00000000 (32根数据线为一组)
                         只要相继写入并读出这6个pattern就能验证是否存在数据线交叉短路错误。

                         取以上6个paatern的反码,总共12个pattern,就能检测到每一位都可以写入和读出0和1。

                  (1.2) 布线造成的互相短路

                   -------------------------------------------------------------------

                   数据线的其它问题:

                   (1.1) 什么是floating buses错误

                            floating buses会“欺骗”测试软件,如果测试软件写入并很快读出一个值的时候,写操作会跟数据线上的电容充电,

                            总线会短暂的保持它的状态。当测试软件读操作时,总线会返回刚写入的值,即使实际上该数据线是断路的。

                   (1.2) 如何检测数据线的floating buses错误

                             写入和读回之间再插入一次对不同地址写入不同值的操作。

                             例如,X写入X1位置,Y写入Y1位置,再从X1位置读出X值则表示floating buses错误不存在。

          (2) 检测地址线

                   如果地址线存在错误,其症状是地址空间中的两个不同位置被映射到同一物理存储位置。

                   更通俗地讲,就是写一个位置却“改变”了另一个位置。

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

                   (2.1)将地址的值作为内容写入该地址处,汇编的表示方法是 (addr) = addr。

                           即将地址值写到地址对应的空间里,这样确保每一个位置的内容不同。

                   (2.2)依次将内存基地址的某一根地址线的值翻转(flip/toggle)得到某个地址,从该地址取值,

                            如果该值和基地址的值相等,则表示某一位地址线有问题。

                            这个算法的特点是每次只检测一根地址线,方法简单有效。

          (3) 检测DDR物理内存部件

               存储单元的检测则是真正对DDR内存芯片的检测。内存芯片的常见错误是bit-stuck,简而言之,就是让它是0,它偏为1,

               让它为1,它偏为0,检测方法也很简单,就是用不同的pattern去写尽可能所有的地址并读回比较。

               有一些常用的 pattern如0x5555, 0xAAAA等。  

 2. Uboot中的测试命令

        在Uboot命令行下也有几个简单的命令可以检测常见内存故障,如下所示:

         (1)mtest addr lenth pattern

                 用特定的pattern去刷DDR的空闲空间.

                 这个命令需要注意,DDR在Uboot启动后被映射到了0地址,但是uboot的代码和堆、栈空间0x10000000处开始,

                 这些空间是不能被刷的,否则就挂死了。

         (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的随机性更大一些。

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

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有 的相关内容,欢迎继续使用右上角搜索按钮进行搜索嵌入式 ,以便于您获取更多的相关知识。

cortex a9 jtag-IMX6Q JTAG加载UBOOT失败原因

...R3:Micorn 2Gb(32位) - Flash:Micron 256M(8位) 测试发现问题点: - 主晶振24M没有起振(更换16pF~36pF均如此---不振;测试晶振的电平XTALI/O均为457mV,NVCC_PLL_OUT电平为1.11V),32.768K正常起振 - CPU电源:Supply&...

php 发送sms实例代码

...      lycos.co.uk           excite.co.uk           uboot.com           genie.co.uk                             User                                   Password                         ...

start.S

...TEXT_BASE:.wordTEXT_BASE//定义一个变量存储//TEXT_BASE是Uboot载入内存后物理的基地址。定义在board/xxx/config.mk里面。这个地址一定要和uboot在内存的首地址相同.globl _armboot_start_armboot_start:.word _start /** These are defined in the board-specific linker sc...

MongoDB与MySQL的插入、查询性能测试

...用户欲把相应的信息重新存入MongoDB数据库,那么数据库中的信息应该为如下所示:   "_id" : "10001", "Name" : "Alice", "Address" : "A1",   "_id" : "10002", "Name" : "Bob", "Address" : "A2",   "_id" : "10003", "Name" : " Cara", "Address" : "A3",   "_id" : "10004", "Na...

如何调试 Node.js的内存泄露

...的负载检测方法,以便我们证实问题的存在(检查是代码中的哪些改动造成这样的预期效果)。 使用 ps 来检查进程的内存使用情况: ps -p $PID -o rss,vszps -p $PID -o rss,vsz(使用 pgrep -lfa node,你可以找到 Node.js 进程的 PID) 这告...

前三篇
后三篇