linux下uboot内存测试,uboot中的内存测试方法

2023-11-16

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

0818b9ca8b590ca3270a3433284dd417.png

从上图,可以看出要经过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系统,上面的方法更适用于系统不稳定时定位错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下uboot内存测试,uboot中的内存测试方法 的相关文章

  • 前端不规则气泡图实现方案

    背景介绍 由于项目大屏可视化的需求 需要实现在一个不定长宽的长方形容器中 实现不重叠分布的气泡图 每个气泡代表一类数据的统计值 气泡个数最大值已知 气泡大小与数据值大小正相关 并且气泡图需要有浮动特效 页面尺寸改变时 气泡尺寸需要自适应容器
  • 微信小程序0基础到精通

    写在开头 此篇文章只是简单描述了一下一条学习路线 具体学习资源获取方式请看文末 第一步 想快速入门小程序开发就需要从必备的API和核心开发等基础知识入手 建立整个小程序的知识体系 学习目标 新手入门与项目实战 课程重点 1 小程序核心技术
  • 计算机原理提问,计算机原理的计算机原理人话版

    Windows关机步骤涉及到Windows多个组件和多个过程 简单的说 Windows的关机步骤不是大多数人认为的那么简单 基本的过程是这样的 1 用户发起关机指令以后 发起关机指令的程序会通知Windows子系统CSRSS EXE CSR
  • 提高ChatGPT稳定性:告别GPT网页登录使用PC软件进入GPT

    一 GPT时不时断线 在日常生活中 我们经常需要使用智能语言模型来辅助我们完成各种任务 而ChatGPT作为一款非常优秀的智能语言模型 被广泛应用于各个领域 然而 使用ChatGPT的过程中 我们不可避免地会遇到一个非常让人头疼的问题 Ch
  • javaee之黑马乐优商城4

    商品规格与数据结构 下面来说一下数据库的设计与分析 其实对于spu这张表来说 大体设计还是比较好设计的 看一下下面这张图是一个产品的规格参数 上面主体就是一个规格参数 基本信息又是一个规格参数 这里就是涉及到了一个商品的具体信息 sku就是
  • Android 中的CreatePackageContext()

    Return a new Context object for the given application name This Context is the same as what the named application gets w
  • 分享一个OJ平台——浙江工商大学的OJ平台

    1 引言 最近是有总喜欢讨论算法题 因为他们在准备考研复试 为什么我不准备呢 这是一个悲伤的故事 刚好自己也有面试遇到只能使用C和C 的代码题 他们说这OJ平台相对简单一些 那些刷不来LeetCode可以试试这个 作为入门算法的跳板 体验体
  • Opencv中copyTo()函数的使用方法

    在Mat矩阵类的成员函数中copyTo roi mask 函数是非常有用的一个函数 尤其是后面的mask可以实现蒙版的功能 我们用几个实例来说明它的作用 我们要注意mask的数据类型 必须是CV 8U 且通道数或者是1 或者与roi一致 首
  • CloudCompare 二次开发(14)——高斯滤波

    目录 一 概述 二 代码集成 三 结果展示 一 概述 使用CloudCompare与PCL的混合编程实现点云高斯滤波 高斯滤波的算法原理见 PCL 高斯滤波 二 代码集成 1 mainwindow h文件public中添加 void doA
  • 深入理解HashMap(及hash函数的真正巧妙之处)

    Hashmap是一种非常常用的 应用广泛的数据类型 最近研究到相关的内容 就正好复习一下 网上关于hashmap的文章很多 但到底是自己学习的总结 就发出来跟大家一起分享 一起讨论 1 hashmap的数据结构 要知道hashmap是什么
  • c++重载函数调用运算符

    函数调用运算符 如果类重载了函数调用运算符则我们可以像使用函数一样使用该类的对象 函数调用运算符必须是成员函数 一个类可以定义多个不同版本的调用运算符 struct absint int operator int val return va
  • 路由选路算法

    RIP OSPF Open Shortest Path First 开放最短路径优先 OSPF路由协议 ISIS BGP 参考博客 最佳路由路径选择算法详解
  • Python 中的魔术方法(七)自定义容器行为, __setitem__ 和 __getitem__ 等

    1 协议 Python 中创建自定义序列通常的方式是继承内置的数据类型 使用collections模块中的UserDict UserList等数据 如果要创建完全自定义的序列 需要实现 Python 中自定义容器类型其中一些协议 首先 有用
  • 剑指offer-问题40

    package offer offer interview 40 public class Test40 public static int findNumbersAppearanceOnce int data int result 0 0
  • 6.10 docker (一) 启动

    启动 下面的命令输出一个 Hello World 之后终止容器 root node docker run ubuntu 18 04 bin echo Hello world Hello world 这在本地直接执行 bin echo hel
  • 使用docker搭建speedtest测速服务器

    文章目录 拉取镜像 启动镜像 开放防火墙12345端口 浏览器打开ip 12345测试 其他说明 拉取镜像 sudo docker pull adolfintel speedtest 检查是否拉取成功 sudo docker images
  • 什么是配置文件,以及如何编辑它们?

    我们使用的绝大多数计算机程序 无论是办公套件 网络浏览器 甚至视频游戏 都是通过菜单界面系统配置的 它几乎成了我们使用机器的默认方式 但是有些程序要求你不止是上述方式 你实际上必须编辑一个文本文件 以便让它们按你的意愿运行 这些文本文件 毫
  • 8层灯塔 共765盏灯

    有一个8层灯塔 每层的灯数都是上一层的2倍 共有765盏灯 编程求最上层的灯数 1 include
  • uniapp中使用pinia (针对于uniapp创建vue3项目,uniapp创建vue2项目此方法不可用)

    1安装pinia 如果新建项目 先初始化一下 npm init y npm install pinia save 2 新建pinia store目录 并创建相关文件 名字自己定我的是pinia store 在目录下新建index js和lo

随机推荐