Forum: Mikrocontroller und Digitale Elektronik Datensätze im Eeprom verwalten (ATMega)


von Daniel L. (danielschlumpf)


Lesenswert?

Hallo zusammen,

ich bin seit einigen Wochen dabei, mich in die Thematik von 
Mikroprozessoren einzuarbeiten. Bei meinen Recherchen bin ich immer 
wieder auf dieses Forum gestossen und habe unzählige hilfreiche 
Anleitungen und Tipps gefunden, daher vorab ein großes Danke an die 
Fragesteller und -beantworter! Mir eurer Hilfe habe ich inzwischen 
testweise zwei Controller im Betrieb, die einige Taster und LEDs 
betreiben und über I2C miteinander kommunizieren können, quasi zur 
'Grundlagenforschung'.

Habe aber nun doch eine Frage, zu der ich nicht viel im Netz gefunden 
habe:

Ich habe auf längere Sicht vor, eine Vielzahl von Datensätzen 
abzuspeichern und zu verwalten. Wie ich Werte an bestimmten Addressen in 
einem Eemprom speichern und auslesen kann, ist klar. Was mir jedoch nun 
fehlt, sind einige Tipps zur dynamischen Verwaltung dieser Daten - ich 
will keine konkrete Anleitung oder Code sondern einfach ein paar Tipps, 
nach welchem System ihr ggf arbeitet oder was sinnvoll wäre:

Ein Datensatz besteht aus mehreren Werten, die jeweils eine bestimmte 
Bedeutung haben (z.B. für viele Personen jeweils Haarfarbe, Gewicht etc) 
Ausserdem bekommt jeder Datensatz einen Namen (oder eine ID), damit ich 
sehen kann welche Daten vorhanden sind. Im Betrieb werden Datensätze 
gelöscht, editiert und neu erstellt. Letztlich will ich eine Liste der 
vorhandenen Datensätze anzeigen lassen und einzelne Sätze in den RAM 
laden können.

Auf höherer Ebene ist das eine simple Datenstruktur, auf Eeprom-Ebene 
dachte ich bislang an einen reservierten Bereich mit den IDs oder Namen, 
hinter denen jeweils die Addresse des restlichen Datensatzes steht, so 
als Inhaltsverzeichnis. An den jeweils verlinkten Addressen stehen dann 
Blöcke von n Bytes, die in einer festgelegten Reihenfolge die Werte 
enthalten (1. Gewicht, 2. Größe...). Oder alternativ eine Liste von 
Wertepaaren, bei denen der erste Wert die Datentyp angibt und der zweite 
dann den Wert darstellt...

Meinungen dazu, macht das Sinn? :)

von Andreas V. (tico)


Lesenswert?

Sinn machen beide Ansätze: Der erste verbraucht weniger Speicherplatz, 
der zweite ist leichter erweiterbar. Welchen Du wählst, hängt von Deinen 
Anforderungen ab.
Falls einzelne Datensätze sehr oft geändert werden sollen, kannst Du 
dich auch mal mit wear leveling beschäftigen. Ist ein interessantes 
Thema, in das man viel Gehirnschmalz stecken kann.

Gruss
Andreas

von Daniel L. (danielschlumpf)


Lesenswert?

Hallo Andreas,

danke für deine Antwort, dann lag ich ja gar nicht so falsch. Ich denke, 
ich werde letztlich ein Zwischending der Varianten nehmen und die 
Datensätze in kleinere Pakete unterteilen. Dann brauche ich zu jedem 
Datensatz jeweils nur die benötigten Datenpakete zu schreiben (jeweils 
mit nem Byte als Ankündigung was kommt), und ab da eine festgelegte 
Anzahl und Reihenfolge von Werten.

Grüße

von Peter D. (peda)


Lesenswert?

Ich arbeite nie direkt im EEPROM, sondern lege eine Struct im SRAM an.
Und dann wird von der EEPROM-Adresse (Index * sizeof(struct)) ein 
Element gelesen bzw. dahin zurückgespeichert.
Dadurch kannst Du bequem mit dem Datensatz arbeiten und ihn auch 
editieren, ohne unnötige EPROM-Schreibzugriffe.

Ich brauche dann auch nur eine kleine Zugriffsroutine:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=91306

Die EEPROM-Zugriffe mit indirekten Calls beim AVR-GCC sind ja doch sehr 
aufwendig und langsam.


Peter

von Daniel L. (danielschlumpf)


Lesenswert?

Hallo Peter,

danke für den Tipp - die Frage, wie mich ich nun innerhalb des EEPROM 
oder eben SRAM organisiere, ist ja die eine Sache, aber um dann damit zu 
arbeiten werde ich in Zukunft wohl genau so eine Lösung wie deine 
brauchen. Und es ist mal wieder ein mit "Dannegger'scher Effizienz" 
programmierter Code, ich fand deine debounce-Routinen schon prima.

Müsste ja dann durch die erhöhte Geschwigkeit auch möglich sein, mit 
mehreren ICs auf einem gemeinsamen SRAM zu arbeiten, oder?

Grüße,
Daniel

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.