Wie kann die Lebensdauer des EEPROM verlängert werden?

7

Ich möchte ein paar (ab sofort 8) IR-Codes im EEPROM meines Boards speichern. Es wäre großartig, wenn jemand ein paar Tipps vorschlagen könnte, um die Lebensdauer zu maximieren.

Die IR-Codes in meiner Skizze werden in einer Reihe von vorzeichenlosen Longs gespeichert.

Ich weiß, dass die Anzahl der Male, die ich in das EEPROM schreibe, << 100.000 Mal sein wird, möchte aber trotzdem meine Skizze optimieren. + würde bei zukünftigen Projekten helfen

Karx
quelle
3
Aus Interesse habe ich vor einiger Zeit versucht, mein EEPROM zu "zermürben". Es dauerte ungefähr 1,5 Millionen Schreibvorgänge, bis es fehlschlug.
Nick Gammon
@ NickGammon, wie waren die Fehler? Zufällige Daten?
James Waldby - jwpat7
Ein-Bit-Fehler aus dem Speicher.
Nick Gammon
Wenn Sie die Spezifikationen überschreiten, wird der Speicher möglicherweise weniger zuverlässig. Das habe ich nicht getestet. Möglicherweise stellen Sie fest, dass sich nach einem Monat etwas ändert. Meine eigenen Erkenntnisse waren, dass Sie die empfohlenen Bewertungen um einen erheblichen Betrag übertreffen und das von Ihnen geschriebene Byte einen Moment später noch zurücklesen konnten.
Nick Gammon

Antworten:

4

Ich kann mir ein paar vorstellen:

  1. Schalten Sie es nur ein, wenn Sie es müssen.
  2. schreibe nicht darauf, es sei denn du musst;
  3. Schreiben Sie so wenig Daten wie möglich - komprimieren Sie die Daten; Schreiben Sie nur während des Brown-Outs oder Power-Downs, ...;
  4. Nivellieren Sie die Schreibvorgänge auf so viele Zellen wie möglich. Erhöhen Sie die Schreibadresse mit nachfolgenden Schreibvorgängen.
  5. benutze ein großes eeprom;
  6. benutze fram;
  7. Verwenden Sie sram + Batterie-Backup.

...

3 - 7 sind wirklich Beispiele für die Implementierung von # 2.

dannyf
quelle
7

Die andere Antwort erwähnte einige allgemeine Ideen; Hier sind einige spezifischere Hinweise.

• Sie können Ihre Schreibvorgänge einzelner Bytes durch eine Routine leiten, die die EEPROM-Zelle vor dem Schreiben liest. Wenn sich ihr Wert nicht ändert, wird nicht geschrieben.

• Für den Lastausgleich können Sie den EEPROM-Adressraum in k Buckets unterteilen, wobei k = ⌊E / (n + 1) ⌋, wobei n = Datenarraygröße und E = EEPROMgröße. Initialisieren Sie ein Verzeichnis, ein Array von m Bytes, die alle auf k gesetzt sind, mit m = En · k. Wenn Ihr Gerät startet, liest es das Verzeichnis durch, bis es den aktuellen Eintrag findet, ein Byte ungleich k. [Wenn alle Verzeichniseinträge gleich k sind, initialisieren Sie den ersten mit 0 und fahren Sie von dort fort.] Wenn der aktuelle Verzeichniseintrag j enthält, enthält Bucket j aktuelle Daten. Wenn Sie neue Daten schreiben müssen, speichern Sie j + 1 im aktuellen Verzeichniseintrag. Wenn dies gleich k ist, initialisieren Sie den nächsten Verzeichniseintrag auf 0 und fahren Sie von dort fort. Beachten Sie, dass Verzeichnisbytes ungefähr den gleichen Verschleiß aufweisen wie Bucket-Bytes, da 2 · k> m ≥ k ist.

James Waldby - jwpat7
quelle
Vielen Dank, ich werde versuchen, den Lastausgleich auch für meine Skizze zu implementieren. Tolle Erklärung. Ich überprüfe vor dem Schreiben, ob die Werte gleich sind, damit dieser Teil erledigt wird.
Karx
2

Wenn Ihre Daten nur einen kleinen Teil Ihres EEPROM belegen, können Sie einen der Algorithmen zur Verschleißnivellierung verwenden. Die Essenz dieser Algorithmen besteht darin, jedes Mal an einen anderen Ort zu schreiben, sodass die Schreibvorgänge auf mehrere Orte verteilt sind, während jeder Ort unter der Grenze von 100.000 Schreibvorgängen bleibt.

Es gibt mehrere solcher Algorithmen diskutiert hier , die Sie selbst implementieren könnte. Alternativ können Sie auch eine Bibliothek wie diese verwenden .

Dmitry Grigoryev
quelle
1
Das sind tolle Links Dmitry! Vielen Dank. Jedenfalls verwende ich jetzt ~ das gesamte EEPROM für Daten. Schreibvorgänge sind in meinem Code selten und treten nur zu Beginn des Lebenszyklus (Konfigurationszeitraum meines Geräts) auf. Der Lebenszyklus besteht meist nur aus Lesevorgängen. Da die Größe meiner Konfigurationsdateien zunimmt, suche ich jetzt nach Techniken zur Speicheroptimierung, die all das in das EEPROM passen und keinen zusätzlichen Speicher benötigen.
Karx