Was ist die tatsächliche Lebensdauer von EEPROM?


21

Laut ATMEL beträgt die Lebensdauer einer EEPROM-Zelle etwa 100.000 Schreibzyklen / Zelle. Funktioniert das EEPROM tatsächlich so in freier Wildbahn?

Wenn ich den Wert einer Zelle nicht ändere, belastet dies die Lebensdauer? Zum Beispiel, wenn ich den Wert schreiben 0xFFzu derselben Zelle wieder und wieder, ist dies anders zu schreiben 0x00, 0xFF, 0x00usw.

Antworten:


19

Wie Sie feststellen, hat das interne EEPROM eine Lebensdauer von 100.000 Schreibzyklen. Dies ist keine Vermutung - ein sehr bedeutender Anteil von ATmega328 wird diese Zahl ohne Probleme erreichen. Ich habe bereits drei Prozessoren getestet und alle 150.000 Zyklen ohne Probleme erreicht.

Es ist wichtig, den Fehlermodus des EEPROM zu beachten. Die meisten "EEPROM-Zerstörer" -Projekte lesen / schreiben wiederholt, bis die Daten überhaupt nicht mehr geschrieben werden. Vor diesem Zeitpunkt ist das EEPROM immer noch beschädigt. Dies würde sich dadurch manifestieren, dass die Daten nicht für einen angemessenen Zeitraum aufbewahrt werden. Aus diesem Grund ist es nicht ratsam, sich auf mehr als 100.000 Schreibzyklen zu verlassen.

EEPROM unterscheidet sich vom RAM eines ATmega. Das Schreiben ist nicht einfach oder schnell, aber es ist in eine freundliche Arduino-Bibliothek eingebettet , die diese Komplexität vor dem Benutzer verbirgt.

Die erste Indirektionsebene ist die trivial einfache EEPROM-Bibliothek , die nur zwei weitere Funktionen zum Lesen und Schreiben aufruft. Dies ruft eeprom_write_byte auf, das Sie hier finden .

Diese Funktion verwendet die Inline-Assemblierung und ist daher möglicherweise nicht leicht zu verstehen. Es gibt jedoch einen leicht verständlichen Kommentar:

Programmiermodus einstellen: Löschen und schreiben

Dies deutet auf eine der Komplexitäten des Umgangs mit EEPROM hin - um darauf zu schreiben, müssen Sie es zuerst löschen. Dies bedeutet, dass beim Aufrufen von EEPROM.write () ein Schreibzyklus ausgeführt wird, unabhängig davon, welchen Wert Sie schreiben.

Dies bedeutet, dass das wiederholte Schreiben von 0xFF wahrscheinlich den gleichen Effekt hat wie das Schreiben von 0xFF, 0x00,0xFF, 0x00 usw.

Es gibt Möglichkeiten, dies zu umgehen. Sie können versuchen, EEPROM.read () vor EEPROM.write () aufzurufen, um festzustellen, ob der Wert bereits derselbe ist. Dies erfordert jedoch zusätzliche Zeit.

Es gibt andere Techniken, um übermäßigen EEPROM-Verschleiß zu vermeiden, deren Verwendung jedoch von Ihrer Anwendung abhängt.



9

Ich habe einmal ein Experiment mit einem externen EEPROM mit maximal 1 Million Nennzyklen durchgeführt. Es dauerte ungefähr 6 Millionen Zyklen, bis sie stark korrumpiert waren, und davor hatte sie sporadisch an Korruption zugenommen.

Wenn Sie sagen, dass Sie den Wert nicht ändern, gehe ich davon aus, dass Sie die gleichen Daten mehrmals an eine Adresse schreiben. Dies würde mit ziemlicher Sicherheit das Leben belasten, obwohl es die umgebenden Zellen wahrscheinlich nicht belasten würde.


2

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

Der Arduino wurde an eine Wandwarze angeschlossen und saß "für ein paar Monate hinter einer Couch". Der EEPROM sah seinen ersten Schreibfehler nach 47 Tagen und 1.230.163 Zyklen. Dies ist eine Größenordnung besser als die Spezifikation auf dem Atmel-Datenblatt, aber den Ergebnissen ähnlicher Experimente ähnlich.


Das scheint viel zu hoch. Ich hatte schon einmal von 150.000 bis 200.000 gehört, aber niemals von: o
asheeshr

5
Das Problem ist, dass dies nicht alle Fehlermodi erkennt. Wenn der EEPROM beschädigt wird, verringert sich allmählich die Zeitspanne, in der die Daten gespeichert werden. Bei 100.000 Zyklen garantiert Atmel 20 Jahre Datenspeicherung. Darüber hinaus verringert sich die Vorratsdatenspeicherung. Wenn 1,2 m Zyklen erreicht sind und ein Fehler angezeigt wird, handelt es sich um einen sofortigen Fehler. Bei 1.230.160 Zyklen ist möglicherweise kein sofortiger Fehler aufgetreten, die Daten wurden jedoch möglicherweise nur für Tage gespeichert.
Cybergibbons

0

Die magische Lösung - wenn Sie nicht das codieren möchten, was Cybergibbons über das Lesen vor dem Schreiben gesagt haben, ist die EEPROM.update () - Funktion. Es macht genau das:

EEPROM.update (Adresse, Wert);

schreibt und belastet den Speicher nur, wenn sich der Wert von dem bereits gespeicherten Wert unterscheidet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.