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:
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:
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.
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.
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.
Ignacio Vazquez-Abrams
Jim