Forum: Mikrocontroller und Digitale Elektronik Optimierung EEPROM Zugriff (AVR)


von Stephan V. (orca)


Lesenswert?

Ich verwende die eeprom_write_block() Funktion um Messwerte in einen 
Ringbuffer ins EEPROM zu schreiben.

Zum Algorithmus:
1
1. Datenzeile ins EEPROM schreiben, index++
2
2. nächste Datenzeile im EEPROM mit 0xFF als leer markieren
3
3. weiter mit dem Programm und irgendwann wieder zu 1. zurück.

Das "leeren" (0xFF setzen) der nächsten Datenzeile hat den Vorteil, dass 
ich damit die index-Variable nicht jedes Mal (an die selbe Stelle) ins 
EEPROM schreiben muss -> wirkliche, gleichmäßige Verteilung der EEPROM 
Schreibzugriffe.  Außerdem passt es mit der default-Initialisierung des 
EEPROMS zusammen :-)
Nachteil: pro Datensatz werden 2 Zeilen geschrieben (aber eben immer 
andere Zeilen)

Gibt es andere, EEPROM schonendere, Möglichkeiten?

Ist es besser die beiden Datenzeilen in einem Rutsch ins EEPROM zu 
schreiben, oder kann ich eeprom_write_block() auch 2x hintereinander 
aufrufen?

von MicroSD (Gast)


Lesenswert?

Stephan V. schrieb:
> Gibt es andere, EEPROM schonendere, Möglichkeiten?

Der AVR kann Löschen (Setzen auf FF) und Schreiben (Ver-AND-en der 
EEPROM-Zelle mit dem neuen Wert) getrennt ausführen.
=> Effektiv nur ein Schreibzugriff.

Leider wurde diese Funktion irgendwann in den letzten Jahren aus der 
AVR-Libc entfernt, d.H. inline-ASM mus her.

von Peter D. (peda)


Lesenswert?

Der AVR-EEPROM kann nur Byteweise beschrieben werden.
Man kann aber getrennt löschen und programmieren.


Peter

von Peter D. (peda)


Lesenswert?

MicroSD schrieb:
> Leider wurde diese Funktion irgendwann in den letzten Jahren aus der
> AVR-Libc entfernt

Außerdem wurden sie unnötig aufgebläht (indirekter Call), brauchen also 
viel Code und Zeit.

MicroSD schrieb:
> d.H. inline-ASM mus her.

Nö, muß garnicht.
Die IO-Bits und Bytes sind in io.h definiert, also einfach in C 
schreiben.

Zusätzlich kann man noch den Verschleiß minimieren, indem bei Gleichheit 
das Schreiben übersprungen wird.
Sieh dann so aus:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=91306


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.