簡體   English   中英

C語言的RAM校驗和

[英]RAM Checksum in C language

我需要在啟動時使用類似於棋盤的算法檢查MCU的RAM。 我不想丟失RAM中已經存在的任何數據,而且我也不知道如何不影響im用來執行此算法的變量。 我在想類似的東西:

for (position=0; position< 4096; position++)
 {
     *Temporal = 0x5555;
     if(*Temporal != 0x5555) Error = TRUE;
     *Temporal  = 0xAAAA;
     if(*Temporal != 0xAAAA) Error= TRUE;

    Temporal +=1;

 }

我應該修改鏈接器以了解將“時間”和“錯誤”放置在何處?

在聲明指針時使用修飾符“ register”(如“ register int *”中所示)。 寄存器是處理器內核中內存的一個特殊部分,(通常)不算作RAM的一部分,因此對它們的任何更改都不算作RAM的讀/寫。 存在一些例外。 例如,在AVR微控制器中,RAM的前32個字節被“偽造”到寄存器中。

您的問題可能由於缺乏清晰性而感到沮喪,大多數初學者C程序員很容易解決關於保留RAM中內容的問題(只需在測試之前將指針的內容復制到temp變量中,然后在執行完之后將其復制回測試結束)。 另外,您執行校驗和:您只是在進行內存測試。 這些是截然不同的東西。

您需要確保要測試的內存與包含正在運行的程序的內存不在同一位置。 您可以通過直接在閃存或已連接的任何其他永久存儲中運行來實現此目的。 如果不是,則需要對鏈接映射進行某些操作以確保正確的內存分段。

在測試功能內部,按照MVittiS的建議使用register是個好主意。 另一種選擇是使用映射到與被測對象不同的段的全局變量。

您可能需要閱讀有關內存測試的本文 ,以了解您建議的測試的局限性,內存可能如何發生故障以及應該進行的測試。

我不知道(細節不夠多),但是您的內存測試可能是緩存測試,可能根本不測試任何RAM。

您的內存測試(如果確實測試內存)也設計得很糟糕。 例如,您可以砍除(或短路)所有地址線和所有數據線(除了最低有效的2條數據線之外),即使存在許多非常嚴重的錯誤,測試仍然可以通過。

我的建議是閱讀類似於此網頁的有關內存測試的內容,以獲取一些想法和背景信息: http : //www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/software- based-memory-testing.html

通常,對於非破壞性測試,您需要復制要保留在其他地方的任何內容,然后進行測試,然后再將數據復制回去。 首先測試“其他地方”非常重要(您不想將所有內容復制到有故障的RAM中,然后再復制回去)。

我還建議使用匯編程序(而不是C)來確保不進行不必要的內存訪問。 包括您的堆棧。

如果您的代碼位於需要測試的RAM中,那么您可能需要兩份RAM測試代碼。 在測試包含代碼的第一個副本的RAM時,將使用代碼的第二個副本。 如果您的代碼在ROM中,那么它會容易得多(但是您仍然需要擔心堆棧)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM