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

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