2016-11-23 107 views
0

我需要使用CRC進行代碼驗證。在這種情況下,我所做的就是通過算法傳遞每個找到的閃存字節,以計算CRC並將結果與​​預定義的CRC值進行比較。閃存是否在執行時改變?

但是,我想到閃存在某些時候可能會改變,導致CRC驗證失敗。

假設代碼沒有再次被觸摸,閃存在執行過程中是否會改變?如果是這樣,什麼可能導致它改變?我如何避免這種變化?

+0

你不會說它是NAND還是NOR閃存。 NOR閃存的主要故障模式是單元無法擦除或無法寫入。只要只讀取NOR閃存中的數據,它應該在一段時間內保持不變。檢查您的數據表以瞭解保留時間。除了寫入和擦除失敗之外,NAND閃存還會受到讀取干擾。也就是說,讀取單元格可能會導致其他附近單元格的更改。正確使用NAND閃存需要ECC。 – Sean

+0

添加CRC的全部意義在於檢測閃存何時損壞。 CRC是首選算法,因爲它擅長檢測校驗和本身以及數據中的錯誤。使用足夠大的多項式,您將檢測所有單比特錯誤和大多數多比特錯誤。 – Lundin

回答

0

閃存僅意味着它在沒有電源的情況下保留其內容;閃存絕對是可擦除/可重新編程的。單獨的只讀存儲器(ROM)表示在初始寫入後它不能被修改。

但內存不會改變,除非CPU指令觸及它或降級或受外部因素影響。閃存內容可能會持續十年不受干擾。通常是在年齡之前降級閃存的讀/寫週期數。高靜電可能會損壞閃光燈,但磁場應該幾乎沒有影響。

如果您對硬件規格有任何影響,則應考慮ROM,如果這是主要意圖;與此相比,它有幾個優點。

最後,您注意到您將通過您的CRC算法傳遞「內存中的每個字節」。如果將正確的校驗和存儲在相同的存儲介質中,則會出現遞歸問題,試圖預先計算包含它自己的校驗和的校驗和。在大多數情況下,有效校驗和應該位於內存本身不受掃描的某個段中。

+0

感謝您的回答!你是對的,我甚至沒有想到這一點。如果我試圖預先定義正確的校驗和,它會被存儲在閃存中,對嗎?這會改變在運行時完成的校驗和.- – RCRod21

+0

@ RCRod21不客氣,請記住在有機會時接受答案。 –

+0

如果您的產品壽命長於數據保留規格,那麼閃存在某些時候會始終失敗。 – Lundin

0

在任何情況下,如果它自發地改變,這正是你的代碼驗證的目的是趕上,你想和期望CRC失敗,所以沒有問題 - 它做它的工作

它主要不是自發改變的問題,而是一種情況,一種情況是沒有正確書寫,或者可能防止惡意或意外篡改。如果部分閃存用於可變非易失性存儲器,則顯然不會在CRC中包含該區域。如果您的將同一閃存分區到代碼空間和NV存儲器中,則NV存儲代碼中的潛在錯誤可能會無意中修改代碼空間,因此您的CRC可以防止這種情況發生,還可以防止外部篡改(例如,通過JTAG)。閃存要經受擦寫週期的耐力,經過多次循環後,某些位可能會「高」。持續時間在10000到100000之間的部分之間變化,並且很少是代碼存儲的問題。閃存還具有標稱的數據保留時間;這通常是10年的報價;但那是最糟糕的極端情況評級 - 您的CRC再次警惕這些影響。

相關問題