Forum: Compiler & IDEs Array aus struct in EEPROM


von ben (Gast)


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

von Joachim B. (jar)


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));

: Bearbeitet durch User
von Decius (Gast)


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.

von ben (Gast)


Lesenswert?

ich würde aber gerne nur 2 byte, also nur einen array eintrag auf einmal 
schreiben / lesen

von Joachim B. (jar)


Lesenswert?

ben schrieb:
> versuche ein array einer datenstructur aus dem eeprom zu lesen und zu
> schreiben.

ben schrieb:
> ich würde aber gerne nur 2 byte, also nur einen array eintrag auf einmal
> schreiben / lesen

und warum behauptest du hier was anderes als oben?

oben wolltest du das array lesen und schreiben, hier plötzlich nur einen 
Teil davon?

von Daniel A. (daniel-a)


Lesenswert?

Decius schrieb:
> sizeof(&array[0]) = 4 (Bytegrösse eines Feldes)

Falsch. sizeof(&array[0]) = sizeof(void*)
Bytegrösse eines Feldes = sizeof(array[0]) = sizeof(int)

: Bearbeitet durch User
von Daniel A. (daniel-a)


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 
?

von Daniel A. (daniel-a)


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!

von ben (Gast)


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).

von Daniel A. (daniel-a)


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?

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.