Forum: Compiler & IDEs struct in ein EEPROM schreiben


von Frank Sch. (Gast)


Lesenswert?

Hallo,

ich habe bei einer Software für einen PIC32-µC eine Struktur in der 
Form:

struct Daten
{
  unsigned char Daten_1[10];
  unsigned char Daten_2;
  unsigned short Daten_3;
  signed int Daten_4;
  unsigned char Daten_5;

  ...

} EEPROM_Daten;

Diese Struktur möchte ich so wie sie im RAM abgelegt ist in ein EEPROM 
schreiben und später wieder vom EEPROM ins RAM zurückschreiben.
Dazu möchte ich die Länge der Struktur ermitteln und sie dann Byte für 
Byte bearbeiten, ohne ihren Aufbau (der sich gelegentlich ändern wird) 
beachten zu müssen.
Meine Frage dazu ist: Wie adressiere ich die einzelnen Bytes der 
Struktur?

Für alle Hinweise möchte ich mich schon vorweg ganz herzlich bedanken.

von bal (Gast)


Lesenswert?

Wenn du die Größe deiner Struktur kennst:

void writeDatenToEeprom(struct Daten *data, uint8_t size)
{
  uint8_t i;
  uint8_t eepAddr;

  // hier eepAddr auf die gewünschte Startposition setzen

  for (i=0; i<size; i++)
  {
    eep_write_byte( ((uint8_t *) data)[i]);
    eepAddr++;
  }
}

von Oliver (Gast)


Lesenswert?

hardcore-Variante:
1
uint8_t* p = (uint8_t*) &EEPROM_Daten;
2
3
for (int i=0; i<structLength ; i++)
4
   write_eeprombyte(irgendwo, p[i]);

Alternativ per union, oder per memcopy in ein uint8_t-Array, aber 
portabel ist das halt alles nicht.

Oliver

von Helfer (Gast)


Lesenswert?

bal schrieb:
> Wenn du die Größe deiner Struktur kennst:

sizeof(EEPROM_Daten) verrät Dir die Größe.

von Dauergast (Gast)


Lesenswert?

Frank Sch. schrieb:
> ohne ihren Aufbau (der sich gelegentlich ändern wird)
> beachten zu müssen.

http://de.wikipedia.org/wiki/ASN.1

von Frank Sch. (Gast)


Lesenswert?

Es funktioniert - herzlichen Dank :-)

von Le X. (lex_91)


Lesenswert?

Aber du verstößt damit gegen die Strict-Aliasing-Regel! :-)

von Michael S. (msb)


Lesenswert?

Ich würde Dir empfehlen noch eine Prüfsumme dazu zu speichern. Im 
einfachsten Fall eine Längsparität (xor mit basiswert) oder besser ein 
crc8 oder crc16

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.