EEPROM Schreibzyklen

Gast #7070151
Lesenswert?

Hallo

bzgl. Schreibzyklen-Anzahl erhöhen habe ich schon mehrmals einen 
Kommentar wie siehe unten gelesen.

Doch wie soll das gehen? Leuchtet mir gerade nicht ein.

Die Adresse/Position des Wertes müsste man ja auch im Eeprom 
reinschreiben und inkrementieren... somit geht zwar nicht die 
Speicherstelle des Wertes defekt aber irgendwann die Speicherstelle für 
die Adresse/Position.., weil die ist ja dann immer an der gleichen 
Stelle.....

Danke

> Wenn man z.b. nur 10% eines EEPROMS nutzt könnte man das Programm
> so
> schreiben das diese 10% bei jedem Neustart 10% nach untengeschoben
> werden.
Beitrag #7070159 wurde von einem Moderator gelöscht.
#7070848
Lesenswert?

Hallo,

ich hatte das Problem der "max. Schreibzykeln" eines EEPromdatum anders 
gelöst.

Man definiert die Größe des benötigten Speicherbereichs für seine Daten.
Z.B. 250 Byte, dazu kommt noch eine 3 Byte unsigned int Zähler für die 
Anzahl der geschriebenen Seitenupdates.

D.h. die Page - Seite ist dann 256 Byte groß.

D.h. man schreibt und liest in seinem Programm die Daten nur über einen 
gespiegelten RAM Bereich.

Mit einem Update RAM-->EEprom wir dann diese 256 Byte Page ins EEprom 
übertragen.
An EEprom-Adresse 0 liegt dann z.B. der Page-Zähler, der je nach Anzahl 
der Pages in ein 8 Byte oder 16 Byte Datum passt.

Ist die maximale Anzahl der Page Schreibvorgänge erreicht, wählt man 
einfach die nächste Page aus, speichert diese im 8 Byte oder 16 Byte 
Datum und schreibt dort seine gespiegelten RAM Bereich hinein.

Bei booten / starten des AVR, werden einfach die Daten der aktuellen 
Page aus dem EEprom in den gespiegelten RAM Bereich kopiert.

In seinem Programm muss man dann noch die maximale Anzahl der Pages 
beachten und hierzu einen Fehlfall ausdenken!

Fertig.

Bsp.:
EEprom 2048 Byte, Page 256 Byte ==> 1-7 Page
Einfach formuliert: in Page 0 liegt der Pagezähler.
Hier könnte man auch noch die 3 Byte (4 Byte) Schreibzähler für jede 
Page ablegen.

Die erste Page für Daten ist die Page 1, die Letzte ist 7.

Wichtig ist dabei man schreibt nie direkt ins Eprom nur über das 
gespiegelte  RAM!
Gast #7070879
Lesenswert?

hawky schrieb:
> Die Adresse/Position des Wertes müsste man ja auch im Eeprom
> reinschreiben und inkrementieren...

Tja, ohne ein bissel nachzudenken geht es eben nicht. Man muß eben den 
aktuellen Satz an Merkwerten am Speicherinhalt erkennen und nicht an 
irgend einer Zahl, die auf selbigen hinweist. Ich hatte das (allerdings 
für einen seriellen Flash) so gemacht, daß immer die nächste zur 
Verfügung stehende Seite gelöscht war und somit der Datensatz, der 
direkt davor steht, der aktuelle ist. OK, bei einem seriellen Flash kann 
man nur seitenweise löschen, da bot sich das an.

Bei jedem Update des Datensatzes wird er dabei in die nächste Seite 
geschrieben und die auf diesen folgende Seite gelöscht. Damit braucht 
man beim Start bloß einmal die Seite zu suchen, die vor einer gelöschten 
Seite steht - und wenn so eine nicht gefunden wird (also bei der 
Inbetriebnahme), dann wird der Datensatz mit Defaultwerten gefüllt und 
in die erstbeste Seite geschrieben.

W.S.
#7071179
Lesenswert?

Thosch schrieb:
> Einfach ein FRAM nehmen, dann spart man sich sowohl das Theater
> mit
> wear-leveling als auch die elendige Warterei aufs BUSY-Bit beim
> Schreiben.

Ich finde FRAM prinzipiell auch gut, allerdings nervt die Abkünderitis 
in diesem Produktbereich doch sehr.

Ansonsten verwende ich auch einen ähnlichen Ansatz wie von W.S. 
beschrieben. Man kann es so hinbekommen, dass es immer bullet-proof ist, 
d.h. ein abgebrochener Schreibvorgang erkannt und anhand des vorherigen 
Datensatzes restauriert wird. Dafür ist allerdings eine genaue Planung 
der Schreib- und Löschfeihenfolge erforderlich. Und dann testen, testen, 
testen, in dem man Szenarien bewusst provoziert. Man glaubt garnicht, 
was für Fehler einem da noch über den Weg laufen.
Gast #7071234
Lesenswert?

W.S. schrieb:
> Man muß eben den
> aktuellen Satz an Merkwerten am Speicherinhalt erkennen und nicht an
> irgend einer Zahl, die auf selbigen hinweist.

Wieso eigentlich nicht? Man teilt den Speicher in Blöcke für die Daten 
und speichert die Nummer des Blocks - da man diese nur erhöhen muss wenn 
man die Schreibzyklen des aktuellen Blocks erreicht hat wird für die 
Blocknummer niemals die Grenze erreicht - jedenfalls nicht zu deinen 
Lebzeiten. Ich würde sicherheitshalber die Blocknummer 2mal speichern.

Georg
Gast #7071299
Lesenswert?

>man muss quasi dem Wert noch irgendein Erkennungswert/byte/bit mitgeben,

Richtig. Ein Bit reicht dazu. Man nennt es "sentinel bit" (engl. 
"Wächter"). In den restlichen 7 Bits kann man sogar Nutzdaten speichern.

>und zählt solange hoch bis man es gefunden hat.

Ja. Irgendwo im EEPROM-Speicher gibt es bzgl. des Sentinel-Bits eine 
0-1-Grenze und eine 1-0-Grenze. Die erste dieser Grenzen muss man finden 
und gibt dann die gesuchte Adresse des letztmalig gespeicherten Wertes 
an. Dazu muss man im ungünstigsten Fall den gesamten EEPROM-Speicher 
auslesen, aber das ist kein Problem, weil Lesen ja schnell geht und die 
Zellen nicht abnutzt.
Gast #7071799
Lesenswert?

Je nach Datensatz läßt sich auch auf irgendwelche Bits oder Kennung 
verzichten.
Der leere Speicher enthält 0xffffffff (z.B. beim meinem STM32F103)
Eine Page hat 1K und wird Wortweise beschrieben solange noch Platz ist.
Wenn voll wird in 2. 1K Page weiter gemacht und die erste Page wird 
gelöscht.
Macht 256 Schreibvorgänge für einmal Löschen.

Der zweite Fall schreibt 2 32Bit Worte in den gelöschten Speicher, auch 
2 1K Pages.

Beim Starten wird aus dem Speicher solange gelesen bis 0xffffffff 
gefunden wird, der letzte Wert davor ist der zuletzt gespeicherte.
Gast #7071859
Lesenswert?

Es gibt eine schicke Alternative zu üblichen EEPROMs - den 48L512 bzw. 
48LM01 von Microchip. Das ist eine Kombination aus schnellem SPI-RAM und 
EEPROM, das sich selbst darum kümmert, den RAM-Inhalt ins EEPROM zu 
übertragen und umgekehrt. Die Übertragung erfolgt automatisch bei 
Anlegen der Versorgungsspannung bzw. beim Brown-Out. Zur Pufferung wird 
ein Kondensator benötigt, 100 µF reichen hier aus.

https://www.microchip.com/en-us/product/48LM01

Im normalen Betrieb muss man sich um das EEPROM nicht kümmern und kann 
das Ding ohne irgendwelche Busy-Bits abzufragen ansteuern - bei 66 MHz 
SPI-Takt ist das Ding eine gute Nummer schneller als übliche EEPROMs 
oder Flash-ROMs.

Wenn man nur drei Konfigurationsbytes sichern möchte, ist das allerdings 
leichter Overkill, bei 64 bzw. 128 kByte Kapazität.
#7071966
Lesenswert?

DerEinzigeBernd schrieb:
> Wenn man nur drei Konfigurationsbytes sichern möchte, ist das allerdings
> leichter Overkill, bei 64 bzw. 128 kByte Kapazität

Wenn man bei Microchip nach EERAM sucht, bekommt man auch andere 
Kapazitäten und auch I²C-Varianten, z.B. das 47C04 mit 4kBit/5V/I²C, ein 
echter Exot.
https://www.microchip.com/en-us/product/47C04
Kostet bei Mouser weniger als 1€, und es sind sogar noch welche da, was 
ja heutzutage nicht selbstverständlich ist.

Danke für den Tip, genau sowas hab ich gesucht, wäre gar nicht drauf 
gekommen das es sowas gibt...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren