Forum: Mikrocontroller und Digitale Elektronik Struktur Byteweise in EEPROM speichern bzw. von dort laden


von Michael (synchronmotor)


Angehängte Dateien:

Lesenswert?

Guten Abend,

ich habe zu einer fundamentalen Sache in der Sprache C zu folgendem 
Problem eine Frage:

Ich habe eine Datenstruktur mit Variablen unterschiedlichen Typs und 
bilde damit mehrere Variablen.

Jetzt möchte ich diese Variablen in ein EEPROM (internes EEPROM des 
ATMEGA8, aber das ist hier ohne Bedeutung) transferieren bzw. von dort 
laden.

Dazu habe ich mir eine Funktion geschrieben, die genau ein Byte vom 
EEPROM lesen bzw. in das EEPROM schreiben kann.

Meine Frage ist nun wie ich solch eine Struktur Byteweise übertragen 
kann, so dass ich mich nicht um die einzelnen Variablen kümmern muss?

Also im wesentlich so etwas:

  for (n = 0; n < sizeof (struct FunctionVar); n++)

  {

    pZieladresse = EEPROM_Read_CHAR(EEPROMAdresse);

    pZieladresse++;

    EEPROMAdresse++;

  }

Anbei mein Lösungsansatz etwas ausführlicher im Anhang, mit den zu 
erwartenden Warnings.

Wahrscheinlich gehört das zu den C-Grundlagen, aber irgendwie steige ich 
jetzt da überhaupt nicht durch.

Für eine Hilfestellung bedanke ich mich herzlich.
Michael

: Bearbeitet durch User
von Ozvald K. (Firma: Privat) (ozvaldk)


Lesenswert?

Michael schrieb:
> Meine Frage ist nun wie ich solch eine Struktur Byteweise übertragen
> kann, so dass ich mich nicht um die einzelnen Variablen kümmern muss?

Bilde eine Union deiner Struktur mit einem Byte Array, was genau so groß 
ist, wie die Struktur selbst. (sizeof (struct FunctionVar))
Du kannst dann auf einzelne Bytes auf Byte Array in einem Loop 
zugreifen, so wie es vor hattest.

von Hannes (taurus16)


Lesenswert?

Spricht was gegen EEMEM und die schreib/update/read Befehle aus der 
eeprom.h?

von Axel S. (a-za-z0-9)


Lesenswert?

Hannes schrieb:
> Spricht was gegen EEMEM und die schreib/update/read Befehle aus der
> eeprom.h?

NIH!

von Yalu X. (yalu) (Moderator)


Lesenswert?

In Zeile 1338 fehlt der Cast nach (unsigned char *):
1
  pZieladresse = (unsigned char *)&VAR_Kanal0;

In Zeile 1343 fehlt die Dereferenzierung des Zielpointers:
1
    *pZieladresse = EEPROM_Read_CHAR(EEPROMAdresse);

Echte C-Programmierer fassen die drei Anweisungen in der Schleife zu
einer einzigen zusammen:
1
  for (n = 0; n < sizeof (struct FunctionVar); n++)
2
    *pZieladresse++ = EEPROM_Read_CHAR(EEPROMAdresse++);

Das entspricht dem gängigen Idiom
1
for (...)
2
  *y++ = *x++;

für das Kopieren eines Speicherbereichs.

: Bearbeitet durch Moderator
von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Michael schrieb:

> Jetzt möchte ich diese Variablen in ein EEPROM (internes EEPROM des
> ATMEGA8, aber das ist hier ohne Bedeutung) transferieren bzw. von dort
> laden.

Wenn Du nur einzelene Elemente der Struct aus dem EEPROM laden 
möchstest, also nicht die gesamte Struct in einem Rutsch, hilft das 
Macro
1
 size_t offsetof(type, member);
aus dem System-Header stddef.h.

Grüße,
Volker

von Michael (synchronmotor)


Lesenswert?

Yalu X. schrieb:
> Echte C-Programmierer .....
Auf diesem Weg bin ich, aber eben noch nicht ganz bei "Echten 
Programmierer" angelangt ;-)

Herzlichen Dank für die Tip-Top Lösung. Die Übertragung funktioniert 
perfekt.

Viele Grüße Michael

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.