2011-07-11 60 views
3

我正在使用LEON2處理器(Sparc V8)開發項目。 處理器使用8M字節的RAM,在我的引導的自檢期間需要進行一致性檢查。 我的問題是,我的啓動顯然使用它的堆/ BSS /堆棧的RAM的一小部分,我不能修改,而不會崩潰我的應用程序。 我的RAM測試非常簡單,爲所有的RAM地址寫入一定的值,然後讀取它們以確保RAM芯片可以被尋址。如何檢查嵌入式系統上堆和堆棧RAM的一致性

此方法可用於大多數可用RAM,但我怎樣才能安全地檢查剩餘RAM的一致性?

+0

假設這是在C? – Gerhard

+0

對不起,我的所有引導都用C語言編寫,帶有ASM的一部分 – Leo

回答

1

因爲我正在編寫一個安全相關的設備,所以我必須在操作期間進行完整的RAM測試。 我在兩個測試分割測試:

  1. 尋址測試

你寫的每一個處理線和達到地址唯一值的所有值寫入後,值回讀和比較預期值。這個測試檢測尋址線的短路(或者是@低/高),這意味着你要在地址0xFF40上寫0x55,但由於短路存儲在0xFF80,你不能通過測試2來檢測:

  1. 模式測試:

節省例如,在CPU的寄存器中的前4個字節的RAM和事後你先清除細胞,把0x55,驗證,把0xAA寫入,確認和恢復保存的內容(你當然可以使用其他模式)等等,你必須使用寄存器的原因是通過使用一個變量,這個變量將被該測試破壞 你甚至可以用這個測試來測試你的堆棧。在我們的項目中,我們一次測試4個單元,我們必須運行這個測試,直到整個RAM被測試。

我希望能有所幫助。

+0

非常感謝 – Leo

5

通常,需要測試每個單字節的RAM測試將作爲處理器啓動時發生的第一件事之一完成。通常在硬件初始化之前完成的唯一的其他事情是需要RAM測試能夠訪問RAM。

它通常會在彙編語言中禁用中斷,原因之一是因爲這是確保不使用RAM的唯一方法。

如果您想在此之後執行RAM測試,您仍然需要在系統啓動的早期進行。你也許可以兩次完成 - 其中任何變量/堆棧/無論測試需要用於自己的目的都在低RAM中,並且該測試測試高RAM。然後,在測試低RAM時,再次使用高RAM中的數據運行測試。

另一個注意事項:驗證您是否回讀了寫入的某個值是一個簡單的測試,可能比沒有好,但可能會遺漏某些類型的常見故障(通常尤其是外部RAM:缺少或交叉焊接的地址線)

您可以找到有關基本RAM測試,這裏更詳細的信息:

+0

非常感謝這個答案。我注意到LEON交叉編譯工具使我可以在堆棧初始化之前調用一個特殊的函數。我想我會使用ASM在這個區域執行一個簡單的RAM測試。 – Leo

+0

如果你從一個ROM啓動,你可以先從ROM進行內存測試,然後將你的程序/應用程序複製到RAM中。使您能夠測試所有內存(地址測試不僅僅是數據測試)。 –

1

如果在C運行時環境啓動之前執行測試,則可以清除堆和BSS區域,而不會出現任何問題。
一般來說,堆棧在運行時間設置過程中並沒有得到太多的使用,所以你可以在不影響效果的情況下將其清理掉。只需檢查你的系統。
如果您需要在測試過程中使用堆棧或需要保存堆棧,請將其移至已經測試過的區域,調整堆棧指針。待病房恢復舊堆棧後繼續。

進入運行環境後,沒有簡單的方法可以做到這一點。