Struktur Byteweise in EEPROM speichern bzw. von dort laden

Gast #7815221
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++)

{

1
pZieladresse = EEPROM_Read_CHAR(EEPROMAdresse);
2

3
pZieladresse++;
4

5
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

Angehängte Dateien:
(Firma: Privat) #7815245
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.

Moderator #7815329
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.

(Firma: L-E-A) #7815393
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

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