ATMEL說EEPROM單元的單元壽命約為100,000個寫週期/單元,這實際上是EEPROM在野外的表現嗎?
如果我不更改單元的值,是否這壓力一生嗎?例如,如果我一次又一次將值 0xFF
寫入同一單元格,這與寫入 0x00
, 0xFF
, 0x00
等
ATMEL說EEPROM單元的單元壽命約為100,000個寫週期/單元,這實際上是EEPROM在野外的表現嗎?
如果我不更改單元的值,是否這壓力一生嗎?例如,如果我一次又一次將值 0xFF
寫入同一單元格,這與寫入 0x00
, 0xFF
, 0x00
等
如您所述,內部EEPROM的壽命為100,000個寫週期。這不是猜測-很大一部分ATmega328可以毫無問題地達到這個數字。我之前已經測試了三個處理器,所有處理器都達到了150,000個週期,而且沒有問題。大多數“ EEPROM破壞器”項目會反復進行讀/寫操作,直到完全不寫入數據為止。在此之前,EEPROM仍然會損壞。這將通過在合理的時間內未保留數據來體現。因此,依靠超過100,000個寫週期是不明智的。
EEPROM與ATmega上的RAM不同。編寫它不是簡單或快速的,但是將它包裝在友好的Arduino庫中,向用戶隱藏了這種複雜性。
間接的第一層是 EEPROM庫,這非常簡單],只需調用另外兩個函數進行讀寫。此函數調用eeprom_write_byte,可在此處找到。
此函數使用內聯彙編,因此可能不容易理解。有一句話很容易理解:
設置編程模式:擦除和寫入
這暗示了處理EEPROM的複雜性之一-要編寫toit,首先需要擦除它。這意味著如果您調用EEPROM.write(),則無論您要寫入的值如何,它都會執行一個寫週期。
這意味著重複寫入0xFF與寫入0xFF,0x00可能具有相同的效果。 ,0xFF,0x00等。
有多種方法可以解決此問題-您可以嘗試在EEPROM.write()之前調用EEPROM.read()以查看該值是否已經相同,但這需要額外的時間。時間。
還有其他技術可以避免EEPROM過度磨損,但是其使用取決於您的應用程序。
我曾經在外部EEPROM上進行過最大額定循環數百萬次的實驗。大約花費了600萬個週期才成為嚴重的腐敗,在此之前,它已經發生了零星的腐敗。
當您說不更改值時,我假設您多次將同一數據寫入一個地址。儘管幾乎不會對周圍的細胞造成壓力,但這幾乎可以肯定會給生命帶來壓力。
http://hackaday.com/2011/05/16/destroying-an-arduinos-eeprom/
Arduino已插入壁式疣然後坐在“在沙發後面幾個月。” EEPROM在47天和1,230,163個週期後看到了第一次寫入錯誤。這比atmel數據表上的規格好一個數量級,但與類似實驗的結果類似。
神奇的解決方案-如果您不想在寫之前編寫Cybergibbons關於讀取的內容,則是EEPROM.update()函數。確實做到了:
EEPROM.update(address,value);
僅在值與已存儲的值不同的情況下才寫入內存並對其施加壓力。
幾年前,我為設備製造了運行時記錄器。以1s分辨率記錄6個月40小時後,內存被破壞=> 144000次寫入。我的解決方案是將寫入內容分散到整個eeprom中。