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.
EAF schrieb:> "Wear Leveling" heißt das Zauberwort eigentlich.> Von Atmel gabs gar ein AN dazu> http://ww1.microchip.com/downloads/en/appnotes/doc2526.pdf
ok, ich glaube verstehe es, man muss quasi dem Wert noch irgendein
Erkennungswert/byte/bit mitgeben, und zählt solange hoch bis man es
gefunden hat.
Danke
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!
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.
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.
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
>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.
> ein abgebrochener Schreibvorgang erkannt und anhand> des vorherigen Datensatzes restauriert wird.
Kann man ja per CRC machen. Wenn der beim höchsten Datensatz nicht
korrekt ist, nimmt man den zweithöchsten Datensatz.
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.
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.
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...
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.
Dafür zählt jeder Lesezyklus als Schreibzyklus, geht also in die
Lebensdauer mit ein.
Soul E. schrieb:> Dafür zählt jeder Lesezyklus als Schreibzyklus, geht also in die> Lebensdauer mit ein.
Wenn du sekündlich schreibst, reicht es etwa noch 4 Milliarden Jahre bis
du nicht mehr garantiert richtig schreiben kannst.
Hält der Rest der Schaltung so lange?
Jens M. schrieb:> Wenn du sekündlich schreibst, reicht es etwa noch 4 Milliarden Jahre bis> du nicht mehr garantiert richtig schreiben kannst.> Hält der Rest der Schaltung so lange?
Ja, FRAM ist schon sehr komfortabel. Nutzt nur nix, wenn man ihn nicht
mehr kaufen kann...
c-hater schrieb:> Nutzt nur nix, wenn man ihn nicht> mehr kaufen kann...
Du willst nur nicht.
Mouser hat noch tausende im Lager, wird woanders ähnlich sein.
Sind halt ein wenig teuer, aber "nicht" sieht für mich anders aus.