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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.