EEPROM-Schreibzykluszeit und Schreibzyklusdauer

Ich habe eine eingebettete Softwareanwendung, die einen Puffer vom RAM in das EEPROM kopiert. In diesem Fall ist das EPROM-Gerät ein 28C010 (128K x 8). Das Kopieren erfolgt in unregelmäßigen Abständen, im Allgemeinen in Blöcken von mehreren Bytes. Ich würde davon ausgehen, dass sich andere (nicht alle) EEPROMs so verhalten, aber damit muss ich arbeiten.

Die Antworten auf meine nachstehenden Fragen helfen dabei, die Strategie zum Speichern persistenter Informationen bei der Echtzeitverarbeitung zu bestimmen.

Auf das EEPROM kann wie auf das RAM zugegriffen werden, mit einigen Ausnahmen zum Schreiben:

  • BYTE WRITE: Einzelne Bytes können geschrieben werden, und der Abschluss des Schreibzyklus kann durch Polling bestimmt werden
  • PAGE WRITE: Aneinandergrenzende Byteblöcke können für Bytes innerhalb desselben 128-Byte-Blocks geschrieben werden, und solange auf jedes Byte-Schreiben ein weiteres Byte-Schreiben in denselben Block innerhalb von 150 Mikrosekunden folgt, wird der Vorteil von PAGE WRITE erzielt . Der Vorteil besteht darin, dass der Abschluss des Seitenschreibens durch Abfragen am Ende des Schreibens des Blocks erfolgen kann. (Es gibt keine Verzögerungen zwischen Byte-Schreibvorgängen, und der Abschluss des Seitenschreibzyklus wird im EEPROM internalisiert.)
  • Schreibzyklusdauer: Es gibt ein Limit von 10.000 Schreibzyklen. Es werden keine weiteren Details angegeben.

In beiden Fällen wird die Abfrage durchgeführt, indem das letzte geschriebene Byte zurückgelesen wird, bis der zurückgegebene Wert gleich dem geschriebenen Wert ist.

Es gibt andere Möglichkeiten, um festzustellen, ob ein Schreibvorgang abgeschlossen ist, einschließlich des Wartens auf die maximal angegebene Page Write-Zykluszeit, die 10 Millisekunden beträgt.

Ich beabsichtige, Polling zu verwenden, mit der Erwartung, dass es den Abschluss früher als die 10-Millisekunden-Zykluszeit für das Schreiben von Seiten bestimmt.

Ich habe zwei Fragen:

  1. Kann ich davon ausgehen, dass meine Abfragezeit im Seitenschreibmodus proportional zur Anzahl der geschriebenen Bytes ist (oder sehe ich einen Vorteil darin, ein paar Bytes im Gegensatz zu einer ganzen Seite zu schreiben)?
  2. Wie funktioniert die Write Cycle Endurance? Wird es auf jedes Byte allein oder auf zwei eine ganze Seite (oder auf den gesamten Speicher als Ganzes) angewendet? Mit anderen Worten, wenn ich eine Teilseite in einem Page Write-Zyklus und später den Rest der Seite in einem anderen Page Write-Zyklus schreibe, wie wirkt sich das auf meine Schreibzyklusdauer aus? Zählt es als zwei Schreibzyklen? Kann das jemand näher erläutern?

Da Seitenschreibvorgänge in das EEPROM intern vom EEPROM nach dem letzten Schreiben auf eine Seite abgeschlossen werden, kann ich die Schreibvorgänge in den meisten Fällen im Hintergrund ausführen.

Die Größe der kopierten Blöcke variiert jedes Mal etwas, und es kann nicht erwartet werden, dass sie ein Vielfaches der Seitengröße haben. Sie können so klein gemacht werden, dass sie nur knapp über einer Seitengröße oder mehreren Seiten und mehr liegen, basierend auf einem Schwellenwert, der später festgelegt wird.

Solche Dinge sind der Grund, warum ich NVRAM oder batteriegepuffertes SRAM verwende.
Verstanden. Aber wie gesagt, damit muss ich arbeiten. Es ist ein bestehendes Design, und das ist keine Wahl.

Antworten (2)

Was Sie beschreiben, ist typisch für EEPROM-Chips. Die minimale Anzahl von Bytes, die Sie auf einmal löschen müssen, die maximale Anzahl, die Sie auf einmal schreiben können, und die minimale Anzahl, die Sie auf einmal schreiben können, können alle unterschiedlich sein.

Die Art und Weise, wie ich normalerweise damit umgehe, besteht darin, ein Modul zu haben, das Lese- und Schreibvorgänge in das EEPROM virtualisiert. Dieses Modul stellt eine prozedurale Schnittstelle zum Lesen und Schreiben einzelner Bytes dar.

Übrigens ist es eine gute Idee, dieses Modul eine breitere Adresse verwenden zu lassen, als das, was das EEPROM tatsächlich benötigt. Es ist überhaupt nicht ungewöhnlich, dass sich Projekte weiterentwickeln und den EEPROM-Chip später durch einen größeren ersetzen. Wenn Sie nur eine 16-Bit-Adresse verwendet haben und von 64 kB auf ein größeres EEPROM umgestiegen sind, müssen Sie einen Haufen App-Code überprüfen und möglicherweise neu schreiben, der jetzt mindestens 3 Adressbytes verwenden muss, wenn er für 2 geschrieben wurde. Normalerweise verwende ich 24-Bit-Adressen auf einer 8-Bit-Maschine und 32-Bit-Adressen auf einer 16-Bit-Maschine, um damit zu beginnen, es sei denn, es gibt einen guten projektspezifischen Grund dagegen. Auf diese Weise können Sie auch Module für verschiedene EEPROMs erstellen, die alle dieselbe prozedurale Single-Byte-Lese-/Schreibschnittstelle darstellen.

Auf jeden Fall verwaltet das EEPROM-Modul einen RAM-Puffer von einer Löschseite (diese sind normalerweise größer oder gleich groß wie Schreibseiten). Das Modul verfolgt, welcher EEPROM-Block, falls vorhanden, sich derzeit im RAM-Puffer befindet und ob Änderungen vorgenommen wurden (Dirty Flag), die noch nicht in das physikalische EEPROM geschrieben wurden. App-Lese- und -Schreibvorgänge arbeiten mit diesem RAM-Puffer und führen nicht unbedingt zu Lese-/Schreibvorgängen direkt im EEPROM. Eine FLUSH-Routine wird bereitgestellt, damit die App erzwingen kann, dass zwischengespeicherte Daten in das EEPROM geschrieben werden. In einigen Fällen habe ich einen Timer verwendet, um die Flush-Routine automatisch einige feste Zeit nach dem letzten Schreiben aufzurufen.

Wenn die App auf ein Byte zugreift, das sich nicht im RAM-Puffer befindet, wird der Block, der das Byte enthält, zuerst aus dem EEPROM gelesen. Wenn der Puffer verschmutzt ist, wird er immer geleert, bevor ein anderer EEPROM-Block in ihn geschrieben wird.

Dieses Schema ist im Allgemeinen schneller und minimiert auch die tatsächliche Anzahl von Schreibvorgängen in das EEPROM. Das Dirty-Flag wird nur gesetzt, wenn sich die neuen Daten von den alten Daten unterscheiden. Wenn die App mehrmals die gleichen Daten schreibt, wird das EEPROM höchstens einmal beschrieben.

Dieses Schema verwendet auch das EEPROM effizienter, da ganze Blöcke gleichzeitig gelöscht und geschrieben werden. Dies erfolgt einmal pro Block, unabhängig davon, wie viel Schreibaktivität innerhalb des Blocks vorhanden war, bevor die App ein Byte in einem anderen Block adressierte. Bei den meisten EEPROMs zählt das Schreiben eines ganzen Blocks oder das Schreiben eines Bytes innerhalb eines Blocks in Bezug auf die Lebensdauer gleich. Um die EEPROM-Lebensdauer zu maximieren, möchten Sie so selten wie möglich schreiben und dabei ganze Blöcke löschen und schreiben.

Dies gibt mir einige Ideen, aber ich glaube nicht, dass dieses spezielle Gerät seinen RAM-Puffer so verwendet, wie Sie es beschreiben, basierend darauf, wie ich das Datenblatt gelesen habe. Wenn innerhalb von 150 uS kein neuer Byte-Schreibvorgang auf derselben Seite erfolgt, ist die Page Write-Operation so abgeschlossen, wie ich sie gelesen habe, auch wenn nur ein Teil einer Seite geschrieben wurde. (IN diesem Fall muss die Software dies berücksichtigen, bevor sie mit weiteren Zugriffen fortfährt, bis der Schreibvorgang abgeschlossen ist.) Ich könnte die RAM-Pufferfunktion, die Sie gerade in SW beschrieben haben, auslagern, sodass ich nur ganze Seiten schreibe (es ist ein sequentieller Protokollpuffer ) bis es Zeit ist, es zu schließen.
@ Jim: Ich habe nie etwas über einen Puffer in diesem Gerät erwähnt. Wie gesagt, das Modul, das den Zugriff auf das EEPROM virtualisiert, verwaltet intern einen Einseiten-RAM-Puffer.
Ah. Okay. Guter Vorschlag also. Ich habe vielleicht einige andere Probleme mit diesem Ansatz, aber ich werde sehen, ob ich eine Art Hybrid entwickeln kann. (Die letzten Bytes zum ROM müssen im Falle einer Stromunterbrechung immer eine EOF-Markierung sein, es sei denn, wir haben andere Ideen dazu. Das Vorbefüllen mit EOF-Markierungen kann eine Antwort sein, aber auf Kosten der Schreibzyklusdauer.)

Bei einigen Chipdesigns entspricht die Seitenschreibzeit im Wesentlichen der Byteschreibzeit, da ein Chip, der extern als 128Kx8 organisiert sein kann, intern 1024x1024 groß sein kann und somit ein EEPROM-Array hat, das bis zu 1024 Bit schreiben kann (128 Bytes) gleichzeitig. Bei anderen Chipdesigns wird jeder Seitenschreibvorgang als Folge kleinerer Operationen (möglicherweise einzelne Byteschreibvorgänge) ausgeführt, aber die Leistung kann immer noch schneller sein als das Schreiben einzelner Bytes, wenn die Chipchips Ladungspumpen verwenden, um Schreibstrom zu liefern; oft müssen solche Ladungspumpen vor jeder Schreiboperation hochgefahren und danach heruntergefahren werden; Wenn ein Chip z. B. 1 ms zum Einschalten und 1 ms zum Schreiben eines Bytes benötigt, würde das Schreiben eines Bytes 2 ms dauern.

Im Allgemeinen würde ich erwarten, dass das Schreiben vieler Bytes auf einer Seite länger dauern kann als das Schreiben von einem, aber viel schneller ist, als alle diese Bytes einzeln zu schreiben. Selbst auf einem Chip mit einem Bus voller Breite zwischen den Seitenpuffern und dem Speicherarray ist die Ladungspumpe möglicherweise nicht in der Lage, genügend Strom zu liefern, um 1024 Bits so schnell zu schreiben, wie sie eines schreiben könnte. Ferner könnten einige Chips Verriegelungsschaltkreise enthalten, um die Anzahl gleichzeitiger Bitschreibvorgänge zu begrenzen; Jedes Mal, wenn ein Bit-Schreibvorgang abgeschlossen ist, könnte der Chip mit der Verarbeitung eines anderen fortfahren, der noch nicht gestartet wurde.