Hallo,
ich programmiere eine Datenlogger-Funktionalität auf einem fertigen
Mikrocontroller-Gerät. Das Gerät verfügt über ein Eeprom aus der
M95*-Serie von STMicro.
Leider hab ich das Problem, dass beim Abschalten des Geräts nicht
sichergestellt ist, dass nicht gerade noch auf das Eeprom geschrieben
wird. Eine Pufferschaltung fällt leider aus, da das Gerät schon fertig
ist.
Gibt es vielleicht pinkompatible Eeproms, bei denen sichergestellt ist,
dass bei einem unterbrochenen Speichervorgang wenigstens die Daten nicht
zerstört werden, die vorher in dem Speicherbereich standen? Das würde
mir nämlich reichen.
Ansonsten müsste ich wohl irgendwie redundant abspeichern und die halb
geschriebenen Daten von woanders wiederherstellen.
Schönen Gruß
Gabriel
>dass bei einem unterbrochenen Speichervorgang wenigstens die Daten nicht>zerstört werden, die vorher in dem Speicherbereich standen?
Das kannst Du nie ausschließen und es hängt hauptsächlich vom Timing ab,
wann die Spannung unter den kritischen Wert gefallen ist und ob das
EEPROM da bereits mit dem Tunneln der Elektronen angefangen hat. Das
Problem muß viel eher vom Controller erkannt werden, aber wenn der
Befehl an´s EEPROM ´raus ist, kann der auch nichts mehr machen.
Gibt es, gewissermassen. FRAM von RAMTRON. Erhältlich beispielsweise bei
TME. Die schreiben so schnell wie RAM und sind pinkompatibel zu den
üblichen seriellen I2C/SPI EEPROMs. Wenn man da dafür sorgt, dass der
Powerdown kontrolliert erfolgt (also die Leitungen nicht wild
rumwackeln), kann da kaum etwas passieren.
Quark. Wenn der Schreibbefehl an das FRAM gegengen ist und während des
Schreibvorganges der Saft abgestellt wird, ist der Zustand der
Speicherzelle danach ebenso undefiniert. Das kann kein Baustein
erkennen, daß der Stromausfall unbeabsichtigt war und somit die alten
Daten in den Zellen verbleiben sollen.
> Wenn man da dafür sorgt, dass der Powerdown kontrolliert> erfolgt (also die Leitungen nicht wild rumwackeln),> kann da kaum etwas passieren
Genau das ist ja das Problem ...
@travelrec:
Stimmt schon, nur hängt das erheblich davon ab, wie schnell oder langsam
der Schreibvorgang ist. FRAMs haben keine spürbare Schreibverzögerung,
d.h. um Datenverlust zu provozieren, muss man den Strom schon hart
mittendrin abschalten während es grad schreibt. Und das ist bei gleicher
Schreibrate schonmal weit weniger wahrscheinlich.
Wenn man nun das übliche Minimum an Kondensatoren drinhat (100nF plus ab
und zu 10µF) und den Controller mit BOD fährt, dann wird das Protokoll
zwischen Controller und FRAM abgebrochen, bevor dem FRAM endgültig der
Saft ausgeht und sollte damit in der Lage sein, halb durchgeführte
Schreibvorgänge mit undefiniertem Inhalt auf die Speicherzellen zu
vermeiden.
Was dabei natürlich immer noch passieren kann: dass ein Block halb
geschrieben wurde. Das lässt sich aber m.E. softwareseitig lösen.
Rufus t. Firefly wrote:
> Genau das ist ja das Problem ...
Mit brownout/low-voltage-detector plus passendem Pullup/down hat man das
im Griff.
Wenn man natürlich auch das vergessen hat, dann geht garnichts mehr
richtig. Dann kann es sogar passieren, dass irgendwelche wirren Zellen
schon beim Neustart über Bord gehen.
Wenn genug Platz ist, kann man die Werte immer abwechselnd an zwei
Speicherorte schreiben (z.B. gerade und ungerade Adressen), zusammen mit
einem 2-bit Wert, der jedesmal hochgezählt wird. So weiss man beim
nächsten lesen, welcher der aktuellere Wert ist - bzw dass etwas
schiefgelaufen ist, wenn der Zähler an einem Speicherort nicht 1 höher
ist als am anderen.
Wenn etwas schiefläuft, ist der Wert der Speicherzelle außerdem
wahrscheinlich 0xff (weil sie ja erst gelöscht wird). Wenn das möglich
ist, könnte man diesen Wert als Daten-Wert ausschließen und
dementsprechend Werte mit 0xff verwerfen und auf die jeweils andere
Speicherzellen zurückgreifen.
Ich würde die Daten also in 4-Bit Werte aufteilen (oder vielleicht kommt
man mit 4 Bit eh aus?), den Rest des Bytes für einen 2-Bit-Zähler und
ein festes Bit-Muster als Plausibilitäts-Check verwenden und dann immer
abwechselnd schreiben. So vervierfacht sich allerdings der
Speicherbedarf und es muss etwas gerechnet werden.
Sowas war wohl auch mit "irgendwie redundant" gemeint.
An sowas wie bei Oliver ähnliches hatte ich softwareseitig auch gedacht.
Nur dass man bei FRAM effektiv keine Begrenzung der Anzahl Schreibzyhlen
hat, und daher für diese zweite Speicherstelle immer die gleiche Stelle
verwenden kann.
Wobei bei sowas eine CRC/Prüfsumme hinter dem Datensatz immer sinnvoll
ist. Egal was für Speicher dafür verwendet wird.
Hallo,
danke für die Inputs soweit. Die FRAMs sind ja tatsächlich so wie es
aussieht keine schlechte Sache, leider ist aber auch keins in der Größe
und dem Temperaturbereich verfügbar, wie ich es bräuchte. Und auch kein
Betrieb bei 5V. Als Denkanstoß für zukünftige, neue Sachen aber auch
jeden Fall brauchbar.
Ich denke wohl ich werde die Daten doppelt speichern und mit einer
Prüfsumme sichern, dann kann ich die fehlerhaften Daten aus der Kopie
wiederherstellen.