Jaka jest rzeczywista żywotność EEPROM?

21

ATMEL twierdzi, że żywotność komórki EEPROM wynosi około 100 000 cykli zapisu / komórkę. Czy tak właśnie działa EEPROM na wolności?

Jeśli nie zmienię wartości komórki, czy to wpływa na żywotność? Na przykład, jeśli piszę wartość 0xFFdo tej samej komórki znowu i znowu, jest to inaczej na piśmie 0x00, 0xFF, 0x00itd.

Marlon Abeykoon
źródło

Odpowiedzi:

19

Jak twierdzisz, wewnętrzna pamięć EEPROM ma żywotność 100 000 cykli zapisu. To nie jest przypuszczenie - bardzo znaczna część ATmega328 osiągnie tę liczbę bez żadnych problemów. Testowałem już trzy procesory i wszystkie osiągnęły 150 000 cykli bez problemów.

Ważne jest, aby zwrócić uwagę na tryb awarii EEPROM. Większość projektów „niszczycieli EEPROM” wielokrotnie odczytuje / zapisuje, aż dane w ogóle nie zostaną zapisane. Przed tym punktem pamięć EEPROM nadal będzie uszkodzona. Przejawem tego byłby brak zatrzymywania danych przez rozsądny okres. Z tego powodu nierozsądne jest poleganie na czymkolwiek więcej niż 100 000 cykli zapisu.

EEPROM różni się od pamięci RAM w ATmega. Pisanie do niego nie jest proste ani szybkie, ale jest zapakowane w przyjazną bibliotekę Arduino , ukrywając tę ​​złożoność przed użytkownikiem.

Pierwszym poziomem pośrednictwa jest biblioteka EEPROM , która jest banalnie prosta], po prostu wywołując dwie inne funkcje do odczytu i zapisu. To wywołuje eeprom_write_byte, znalezione tutaj .

Ta funkcja używa wbudowanego zestawu, więc może nie być łatwo zrozumiała. Istnieje jednak komentarz, który można łatwo zrozumieć:

Ustaw tryb programowania: kasowanie i zapis

Wskazuje to na jedną ze złożoności radzenia sobie z EEPROM - aby do niego napisać, najpierw musisz go usunąć. Oznacza to, że jeśli wywołasz EEPROM.write (), wykona cykl zapisu niezależnie od zapisywanej wartości.

Oznacza to, że wielokrotne zapisywanie 0xFF prawdopodobnie będzie miało taki sam efekt jak zapisywanie 0xFF, 0x00,0xFF, 0x00 itp.

Istnieją sposoby obejścia tego problemu - możesz spróbować wywołać EEPROM.read () przed EEPROM.write (), aby sprawdzić, czy wartość jest już taka sama, ale zajmuje to więcej czasu.

Istnieją inne techniki pozwalające uniknąć nadmiernego zużycia pamięci EEPROM, ale ich użycie zależy od zastosowania.

Cybergibbons
źródło
3
Wyrównanie zużycia pamięci EEPROM: electronics.stackexchange.com/questions/60342/…
jippie
9

Raz przeprowadziłem eksperyment na zewnętrznej pamięci EEPROM z maks. 1 milionem cykli znamionowych. Poważna korupcja zajęła około 6 milionów cykli, a wcześniej postępowała sporadycznie.

Kiedy mówisz, że nie zmieniasz wartości, zakładam, że wielokrotnie zapisujesz te same dane na adres. To prawie na pewno podkreśliłoby życie, chociaż prawdopodobnie nie obciążyłoby otaczających komórek.

Doktor
źródło
2

http://hackaday.com/2011/05/16/destroying-an-arduinos-eeprom/

Arduino podłączono do ściennej brodawki i usiadł „za kanapą przez kilka miesięcy”. W pamięci EEPROM po raz pierwszy wystąpił błąd zapisu po 47 dniach i 1230 163 cyklach. Jest to rząd wielkości lepszy niż specyfikacja w arkuszu danych atmel, ale podobny do wyników podobnych eksperymentów.

80HD
źródło
To wydaje się zdecydowanie za wysokie. Słyszałem wcześniej o 150 do 200
000
5
Problem polega na tym, że nie wykrywa to wszystkich trybów awarii. Gdy pamięć EEPROM zostanie uszkodzona, czas przechowywania danych będzie stopniowo zmniejszany. Przy 100 000 cykli Atmel gwarantuje 20 lat przechowywania danych. Ponadto zmniejsza się zatrzymywanie danych. Po osiągnięciu 1,2 m cykli i pojawieniu się błędu, jest to błąd natychmiastowy. przy 1.230.160 cyklach może nie wystąpić natychmiastowy błąd, ale dane mogły być przechowywane tylko przez kilka dni.
Cybergibbons,
0

Magiczne rozwiązanie - jeśli nie chcesz kodować tego, co Cybergibbons powiedział o czytaniu przed napisaniem, jest funkcja EEPROM.update (). Robi to dokładnie tak:

EEPROM.update (adres, wartość);

zapisze i zaakcentuje pamięć tylko wtedy, gdy wartość jest inna niż wartość już zapisana.

Jorge
źródło