Array aus struct in EEPROM

Gast #4069828
Lesenswert?
• ▲
▼
Hi,

versuche ein array einer datenstructur aus dem eeprom zu lesen und zu 
schreiben.
1
typedef struct
2
{
3
    uint8_t a;
4
    uint8_t b;
5
} myStruct_t;
6

7
myStruct_t ee_myStruct[64] EEMEM;
8

9
myStruct s;
10
s.a = 23;
11
s.b = 34;

Folgendes funktioniert nicht (nur datenmüll)
1
eeprom_update_block(&ee_myStruct[34],&s,sizeof(myStruct_t));
2
eeprom_read_block(&s, &ee_myStruct[34],sizeof(myStruct_t));

Was funktioniert ist:
1
    eeprom_update_byte(&ee_myStruct[34],s.a);
2
    eeprom_update_byte(&ee_myStruct[34]+1,s.b);
3

4
    s.a = eeprom_read_byte(&ee_myStruct[34]);
5
    s.b = eeprom_read_byte(&ee_myStruct[34]+1);

was auch funktioniert ist das ganze array zu schreiben:
1
myStruct_t ram_myStruct[64];
2

3
eeprom_update_block(ee_myStruct,ram_myStruct,sizeof(ram_myStruct));
4
eeprom_read_block(ram_myStruct, ee_myStruct,sizeof(ram_myStruct));

ich würde natürlich am liebsten den ganzen block schreiben wier im 
ersten beispiel. Wie kann man das bewerkstelligen? Wo ist der 
Denkfehler?
danke
#4069831
Lesenswert?
• ▲
▼
ben schrieb:
> Folgendes funktioniert nicht (nur datenmüll)
>
> eeprom_update_block(&ee_myStruct[34],&s,sizeof(myStruct_t));

du solltest versuchen die Adresse 0 den Anfang vom struct zu übergeben, 
nicht das Ende

eeprom_update_block(&ee_myStruct[0],&s,sizeof(ee_myStruct));

oder so? bin grad unsicher

eeprom_update_block(&ee_myStruct,&s,sizeof(ee_myStruct));
Gast #4069836
Lesenswert?
• ▲
▼
int array[100] = {0};  (vorausgesetzt wird int 4 byte gross)

memset( array, -1, sizeof(array)/sizeof(&array[0]) );

sizeof(array) = 400 (Bytegrösse des gesamten arrays)
sizeof(&array[0]) = 4 (Bytegrösse eines Feldes)

400/4 = 100 Anzahl der Felder

Die Nichtanwendung von "sizeof(array)/sizeof(&array[0])" könnte eine 
Ursache sein.
#4069865
Lesenswert?
• ▲
▼
ben schrieb:
> Folgendes funktioniert nicht (nur datenmüll)
> eeprom_update_block(&ee_myStruct[34],&s,sizeof(myStruct_t));
> eeprom_read_block(&s, &ee_myStruct[34],sizeof(myStruct_t));

Wie testest du das?


> Was funktioniert ist:
>     eeprom_update_byte(&ee_myStruct[34],s.a);
>     eeprom_update_byte(&ee_myStruct[34]+1,s.b);
>
>     s.a = eeprom_read_byte(&ee_myStruct[34]);
>     s.b = eeprom_read_byte(&ee_myStruct[34]+1);

Das bezweifle ich, &ee_myStruct[34]+1 ist equivalent zu 
&ee_myStruct[35]. Meinten Sie: &ee_myStruct[34].a und &ee_myStruct[34].b 
?
#4069883
Lesenswert?
• ▲
▼
Hast du die Doku überhaupt gelesen?
http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__eeprom_1gaa42f9b445115c9bbbeca19dab6f7fba9.html
1
void eeprom_update_block(
2
  const void * __src,
3
  void * __dst,
4
  size_t __n)
5
Update a block of __n bytes to EEPROM address __dst from __src.

Du hast dst und src vertauscht! Bei eeprom_read_block auch! Lern 
Englisch doku lesen!
Gast #4070392
Lesenswert?
• ▲
▼
Daniel A. schrieb:
> Hast du die Doku überhaupt gelesen?
> http://www.atmel.com/webdoc/AVRLibcReferenceManual...void
> eeprom_update_block(
>   const void * __src,
>   void * __dst,
>   size_t __n)
> Update a block of __n bytes to EEPROM address __dst from __src.
>
> Du hast dst und src vertauscht! Bei eeprom_read_block auch! Lern
> Englisch doku lesen!

Du hast den Fehler gefunden, gratuliere. An deinem Ton solltest du aber 
noch ein bisschen Arbeiten. Mir war ja klar, dass ich irgendeinen Fehler 
gemacht habe, sonst hätte ich die Frage ja nicht gepostet. Dazu ist ein 
Forum da.  Aber klar, am Besten gleich mal willkürlich Sprachprobleme 
unterstellen. Aber DU machst bestimmt alles richtig.
Oh, doch nicht, weil bei eeprom_read_block ist entgegen deiner Aussage 
die Reihenfolge nämlich richtig (siehe Doku, die du ja so toll lesen 
kannst).
#4070662
Lesenswert?
• ▲
▼
ben schrieb:
> Aber DU machst bestimmt alles richtig.
Das habe ich nie Behauptet.

> Oh, doch nicht, weil bei eeprom_read_block ist entgegen deiner Aussage
> die Reihenfolge nämlich richtig (siehe Doku, die du ja so toll lesen
> kannst).

Entschuldigung, ich habe wohl überreagiert. Am Ende sind es immer 
irgendwelche scheinbar vermeidbaren Kleinigkeiten...
Das mir der Fehler ausgerechnet jetzt passieren musste ist mir irgendwie 
peinlich, ich sollte wohl etwas vorsichtiger sein, ich hoffe du kannst 
mir verzeihen?

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.