Struktur Byteweise in EEPROM speichern bzw. von dort laden

Gast #7815221

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

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

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

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

Gast #7815419

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über ein Jahr alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.