摘 要: 在大部分嵌入式系統(tǒng)中,內(nèi)存的好壞主要依賴于內(nèi)存芯片廠家的檢測,對系統(tǒng)運行中出現(xiàn)的內(nèi)存偶然故障,缺乏有效的檢測手段。對嵌入式系統(tǒng)中內(nèi)存檢測的各個階段、內(nèi)存檢測方式以及全空間檢測方法等進行了詳細描述。
關(guān)鍵詞: 嵌入式系統(tǒng);內(nèi)存檢測
嵌入式系統(tǒng)中內(nèi)存芯片種類繁多,其訪問方式、時序要求和初始配置并不完全相同,不同芯片的穩(wěn)定工作溫度等也不一樣,甚至同型號不同批次的芯片的特性還不一樣。這導(dǎo)致嵌入式系統(tǒng)開發(fā)者在內(nèi)存芯片的兼容性開發(fā)、生產(chǎn)檢測和運行時監(jiān)測上需要耗費很多的精力。內(nèi)存問題小則影響到業(yè)務(wù)功能,大則影響到系統(tǒng)運行,如何提供一套完整的內(nèi)存檢測手段,及時甄別出壞的內(nèi)存非常重要,本文就對嵌入式系統(tǒng)的內(nèi)存檢測做一些探討。
1 典型的嵌入式系統(tǒng)
典型的嵌入式系統(tǒng)框圖如圖1所示。圖1中的BOOT Flash用于存放BOOT版本,BOOT版本實現(xiàn)嵌入式系統(tǒng)的基本初始化,并實現(xiàn)業(yè)務(wù)版本的加載;Version Flash用來存放業(yè)務(wù)版本;SDRAM/DDR作為BOOT版本、業(yè)務(wù)版本運行時使用的內(nèi)存,也是本文描述的檢測對象。網(wǎng)口、串口用來作為版本加載、調(diào)試通道、管理通道等;其他接口和設(shè)備根據(jù)具體的嵌入式系統(tǒng)應(yīng)用而不同,如交換芯片、顯示控制芯片和FPGA等。
2 內(nèi)存的檢測場景
嵌入式設(shè)備的內(nèi)存檢測可以存在于以下幾個階段:
?。?)生產(chǎn)中檢測:在出廠前進行檢測,包括數(shù)據(jù)線、地址線測試,基本讀寫測試,強化測試,高低溫測試等,生產(chǎn)中的檢測本文不做深入描述;
?。?)上電自檢:在嵌入式系統(tǒng)上電過程中,各種業(yè)務(wù)還未正式啟動,對內(nèi)存的檢測可以比較全面;
?。?)運行中檢測:業(yè)務(wù)正常運行起來后,內(nèi)存已在使用中,只能對未使用的內(nèi)存空間做例行檢測。
對內(nèi)存的上電自檢及運行中檢測,都是處在實際應(yīng)用環(huán)境中,本文重點描述這部分檢測的實現(xiàn)。
3 內(nèi)存檢測方案
在業(yè)務(wù)運行階段,內(nèi)存已被部分使用,這個時候無法檢測到整個內(nèi)存空間的好壞,為了使內(nèi)存在應(yīng)用環(huán)境能做到完整檢測,需要利用BOOT階段協(xié)助檢測內(nèi)存。
首先有必要了解嵌入式系統(tǒng)的BOOT過程,如圖2所示。
BOOT代碼存在BOOT Flash中,一般分為BootCode1和BootCode2兩部分。BootCode1在BOOT Flash中直接運行,完成內(nèi)存的基本初始化、拷貝BootCode2到內(nèi)存運行。BootCode2也可能壓縮過,這種情況下,BootCode1運行時還必須先解壓BootCode2再拷貝至內(nèi)存。BootCode2承擔(dān)了網(wǎng)口初始化、下載業(yè)務(wù)版本的功能。
在業(yè)務(wù)版本Version起來后,運行它所占用的內(nèi)存無法測試到,本文考慮在BOOT階段對這塊區(qū)域進行測試。而當(dāng)Version運行起來后,就可以對未使用的空間作常規(guī)測試,包括原來BootCode2所在的空間(因為Version起來后,BootCode2代碼已沒有意義)。
具體的測試方案為:
?。?)采用一片EEPROM記錄內(nèi)存測試結(jié)果、測試要求等;
?。?)BOOT階段根據(jù)EEPROM中的測試要求進行內(nèi)存檢測,再將結(jié)果寫入EEPROM中;
?。?)業(yè)務(wù)版本運行階段,可以讀出BOOT階段的內(nèi)存檢測結(jié)果,如果異常可產(chǎn)生告警等;
?。?)后臺服務(wù)器以及業(yè)務(wù)版本可以設(shè)置內(nèi)存檢測類型,確定是做簡單測試還是復(fù)雜測試,并寫入EEPROM,以指導(dǎo)下次BOOT選擇合適的內(nèi)存檢測類型。
詳細的測試流程如圖3所示。
?。?)BootCode1拷貝BootCode2到內(nèi)存之后,會進行版本校驗,判斷BootCode2的正確性,間接檢測了BootCode2運行的內(nèi)存空間,確保BootCode2能夠正常運行,如果出錯,可通過指示燈等告警,提示用戶檢查硬件。
(2)BootCode2正常運行后,從EEPROM中讀取內(nèi)存檢測標志,確定做簡單內(nèi)存測試,還是強化內(nèi)存測試(嵌入式系統(tǒng)對上電時間有嚴格要求,為保證迅速啟動,一般采用簡單內(nèi)存測試)。
?。?)BootCode2檢測到錯誤,可通過指示燈等告警,并將檢測結(jié)果寫入EEPROM,業(yè)務(wù)版本初始化期間可讀出該結(jié)果,如果有錯,不會繼續(xù)往下執(zhí)行,直接告警。
?。?)業(yè)務(wù)版本能正常起來的情況下,可以對空余內(nèi)存做檢測。
(5)在業(yè)務(wù)版本運行中,可以根據(jù)需要設(shè)置內(nèi)存強化檢測,會填寫檢測標志到EEPROM中,并重啟系統(tǒng),觸發(fā)BOOT中進行內(nèi)存全檢,并將檢測結(jié)果反饋給后臺服務(wù)器。對EEPROM里數(shù)據(jù)格式定義如圖4所示。
4 具體測試類型分析
內(nèi)存檢測的具體類型主要考慮如下幾種:
?。?)基本的數(shù)據(jù)線、地址線測試。對某幾個特定地址讀寫特定數(shù)據(jù),這種檢測方式速度快,適用于常規(guī)測試,可在系統(tǒng)默認情況下執(zhí)行。
(2)跳檢測試。比如每1 KB區(qū)間檢測4 B,采用特征數(shù)據(jù)進行讀寫測試,特征數(shù)據(jù)如0x00000000、0xFFFFFFFF、0x55555555、0xaaaaaaaa等。
(3)強化測試。借鑒開源測試方法memtest86+,利用各種算法進行內(nèi)存的全方位測試,這種測試耗時長,根據(jù)CPU頻率不同,內(nèi)存大小不同,測試時間可能以小時計,這種測試只在首次使用時,或者作設(shè)備巡檢時選擇執(zhí)行。
對內(nèi)存檢測結(jié)果的分析,可以用來篩選內(nèi)存芯片,指導(dǎo)內(nèi)存芯片的選型,判斷哪些批次的好壞??梢栽跈z測結(jié)果里增加內(nèi)存型號記錄、檢測當(dāng)時的環(huán)境溫度等,作進一步的分析,可以更好的協(xié)助芯片選型、批次分析及設(shè)計改進。
參考文獻
[1] Wind River. Tornado BSP Training Workshop[Z]. 1998.
[2] http://www.memtest.org/,2012-05-01.