linux下uboot内存测试,uboot中的内存测试方法
1. Denx的UBOOT針對DDR內(nèi)存的檢測過程
從上圖,可以看出要經(jīng)過3個階段:
(1) 檢測數(shù)據(jù)線
如果數(shù)據(jù)線是斷開的,則一切測試都無從談起,因此先測試Data lines.
Data lines可能有2種錯誤:
(1.1) 斷開
如果是兩根數(shù)據(jù)線,只需要寫入并讀出一個pattern=0b01(0b開頭表示二進制數(shù))就能判斷它們是否短路或斷開。
大部分的嵌入式平臺不止兩根數(shù)據(jù)線,我們以64位地址線為例:
pattern = 0b101010101010101010.... 能檢測出奇偶位之間的數(shù)據(jù)錯誤。
如果這個錯誤被排除,每兩根數(shù)據(jù)線組成一組(這是理解下一個pattern的關(guān)鍵),
再用相同的辦法,檢測每相鄰兩組之間是否有短路,就得到第二個pattern,就是 0b110011001100......
依次類推,以4根數(shù)據(jù)線為一組,8根線為一組,......,相繼得到共6個pattern,分別是 :
0xaaaaaaaaaaaaaaaa (單根數(shù)據(jù)線為一組)
0xcccccccccccccccc (02根數(shù)據(jù)線為一組)
0xf0f0f0f0f0f0f0f0 (04根數(shù)據(jù)線為一組)
0xff00ff00ff00ff00 (08根數(shù)據(jù)線為一組)
0xffff0000ffff0000 (16根數(shù)據(jù)線為一組)
0xffffffff00000000 (32根數(shù)據(jù)線為一組)
只要相繼寫入并讀出這6個pattern就能驗證是否存在數(shù)據(jù)線交叉短路錯誤。
取以上6個paatern的反碼,總共12個pattern,就能檢測到每一位都可以寫入和讀出0和1。
(1.2) 布線造成的互相短路
-------------------------------------------------------------------
數(shù)據(jù)線的其它問題:
(1.1) 什么是floating buses錯誤
floating buses會“欺騙”測試軟件,如果測試軟件寫入并很快讀出一個值的時候,寫操作會跟數(shù)據(jù)線上的電容充電,
總線會短暫的保持它的狀態(tài)。當測試軟件讀操作時,總線會返回剛寫入的值,即使實際上該數(shù)據(jù)線是斷路的。
(1.2) 如何檢測數(shù)據(jù)線的floating buses錯誤
寫入和讀回之間再插入一次對不同地址寫入不同值的操作。
例如,X寫入X1位置,Y寫入Y1位置,再從X1位置讀出X值則表示floating buses錯誤不存在。
(2) 檢測地址線
如果地址線存在錯誤,其癥狀是地址空間中的兩個不同位置被映射到同一物理存儲位置。
更通俗地講,就是寫一個位置卻“改變”了另一個位置。
地址線的錯誤檢測相對簡單,其算法是:
(2.1)將地址的值作為內(nèi)容寫入該地址處,匯編的表示方法是 (addr) = addr。
即將地址值寫到地址對應的空間里,這樣確保每一個位置的內(nèi)容不同。
(2.2)依次將內(nèi)存基地址的某一根地址線的值翻轉(zhuǎn)(flip/toggle)得到某個地址,從該地址取值,
如果該值和基地址的值相等,則表示某一位地址線有問題。
這個算法的特點是每次只檢測一根地址線,方法簡單有效。
(3) 檢測DDR物理內(nèi)存部件
存儲單元的檢測則是真正對DDR內(nèi)存芯片的檢測。內(nèi)存芯片的常見錯誤是bit-stuck,簡而言之,就是讓它是0,它偏為1,
讓它為1,它偏為0,檢測方法也很簡單,就是用不同的pattern去寫盡可能所有的地址并讀回比較。
有一些常用的 pattern如0x5555, 0xAAAA等。
2. Uboot中的測試命令
在Uboot命令行下也有幾個簡單的命令可以檢測常見內(nèi)存故障,如下所示:
(1)mtest addr lenth pattern
用特定的pattern去刷DDR的空閑空間.
這個命令需要注意,DDR在Uboot啟動后被映射到了0地址,但是uboot的代碼和堆、棧空間0x10000000處開始,
這些空間是不能被刷的,否則就掛死了。
(2)復制NOR flash的內(nèi)容到內(nèi)存中,如 cp.b 0x20080000 0x7fc0 20000,然后比較 cmp.b 0x20080000 0x7fc0 20000。
(3)下載kernel image到內(nèi)存中,copy NOR flash 或tftp都行,然后調(diào)用iminfo LOAD_ADDR 檢測CRC錯誤。
第二種和第三種方法可以說Pattern的隨機性更大一些。
當然最徹底的檢測方法當然是長時間跑Linux系統(tǒng),上面的方法更適用于系統(tǒng)不穩(wěn)定時定位錯誤。
總結(jié)
以上是生活随笔為你收集整理的linux下uboot内存测试,uboot中的内存测试方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 林纳斯·托瓦兹
- 下一篇: C++:[编程题]买帽子