Forum: Compiler & IDEs EEPROM Struct mit read und write block kopieren?


von Vorn N. (lufthackn)


Lesenswert?

hallo,
ich möchte z.B. nur die Struktur "Bar[1]" einer grossen Struktur ins 
EEPROM schreiben ohne immer die gesamte Strukur kopieren zu müssen.

Meine Struktur:
1
typedef struct
2
  {
3
    struct
4
      { int32_t foo   ; // Foo Struct Member
5
        int32_t bar   ; // "
6
        int32_t baz   ; // "
7
      } Foo           ; // 
8
    struct
9
      { char foobits:2, // Bar Struct Member
10
             barbits:2, // "
11
             bazbits:4; // "
12
      } Bar[10]       ; // Array aus 10 mal Bar Struktur
13
  } Speicherdaten     ; //
14
15
Speicherdaten RAM_Data      ; // RAM_Data = Struktur im RAM
16
Speicherdaten EEP_Data EEMEM; // EEP_Data =Struktur im EEPROM


Am Anfang wird die komplette Struktur aus dem eeprom ins ram geladen...
1
eeprom_read_block(&RAM_Data,&EEP_Data,sizeof(Speicherdaten));
das klappt scheinbar auch.

Um nun nur die "Foo" Struktur ins EEPROM zu schreiben benutze ich 
folgende Codezeile:
1
eeprom_write_block(&RAM_Data,&EEP_Data,sizeof(((Speicherdaten*)0)->Foo));
klappt ebenfalls, allerdings nicht mit der Array-Struktur "Bar"...
1
eeprom_write_block(&RAM_Data,&EEP_Data,sizeof(((Speicherdaten*)0)->Bar[1]));

Ergebniss, die Struktur "Bar[1] wird scheinbar nicht gespeichert.
mach ich einen fehler beim write block zugriff auf die array struktur 
oder soll ich den fehler woanders suchen?

ps, ich bin kein mensch der sich alles gern alles vorkauen lässt, aber 
da ich die eeprom write block codezeile mit dem
-> und den sternchen^^ und so nicht ganz kapiere werde ich hier wohl 
nich zu potte kommen, ist irgendwie frustrierend...

liebe grüsse, Lufthackn

von Karl H. (kbuchegg)


Lesenswert?

Vorn Nachn schrieb:

> Meine Struktur:
>
1
> typedef struct
2
>   {
3
>     struct
4
>       { int32_t foo   ; // Foo Struct Member
5
>         int32_t bar   ; // "
6
>         int32_t baz   ; // "
7
>       } Foo           ; //
8
>     struct
9
>       { char foobits:2, // Bar Struct Member
10
>              barbits:2, // "
11
>              bazbits:4; // "
12
>       } Bar[10]       ; // Array aus 10 mal Bar Struktur
13
>   } Speicherdaten     ; //
14
> 
15
> Speicherdaten RAM_Data      ; // RAM_Data = Struktur im RAM
16
> Speicherdaten EEP_Data EEMEM; // EEP_Data =Struktur im EEPROM
17
>

> Um nun nur die "Foo" Struktur ins EEPROM zu schreiben benutze ich
> folgende Codezeile:
>
1
> eeprom_write_block(&RAM_Data,&EEP_Data,sizeof(((Speicherdaten*)0)->Foo));
2
>
> klappt ebenfalls, ...

sei hier ein bischen expliziter. Das geht davon aus, dass der Foo Anteil 
in der struct Speicherdaten am Anfang liegt. Es schadet nichts, wenn man 
an dieser Stelle explizit hinschreibt was man haben möchte und nicht 
implizit durch die Längensteuerung das Gewünschte erreicht.
1
  eeprom_write_block( & RAM_Data.Foo,
2
                      & EEP_Data.Foo,
3
                      sizeof( RAM_Data.Foo ) );

> allerdings nicht mit der Array-Struktur "Bar"...
>
1
> eeprom_write_block(&RAM_Data,&EEP_Data,sizeof(((Speicherdaten*)0)->Bar[1]));
2
>

siehst du. Hier hast du dich mit dem vorhergehenden selbst ausgetrickst, 
indem du dort einen Zusammenhang ausgenutzt hast, den du hier nicht mehr 
benutzen kannst.
Bist du hier aber genauso explizit, fügt sich eines ganz natürlich zum 
anderen
1
  eeprom_write_block( & RAM_Data.Bar[1],
2
                      & EEP_Data.Bar[1],
3
                      sizeof( RAM_Data.Bar[1] ) );


> da ich die eeprom write block codezeile mit dem
> -> und den sternchen^^

Das sind Pointer.
Und in deinem speziellen Fall völlig unnötig. Das kann man auch ganz 
logisch ohne so ein windiges Konstrukt schreiben.

  write_block will:

           Adresse von wo
           Adresse wohin
           Wieviele Bytes

das ist mehr oder weniger alles.
Der Rest (mit den Sternchen und so) findet sich in jedem C Buch

von Peter D. (peda)


Lesenswert?

Ich schreibe immer die gesamte Struktur.
Mein Trick ist aber, daß meine Schreibroutine erst prüft, ob ein 
Schreiben notwendig ist:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=91306

Obendrein ist der Code auch deutlich schlanker als die GCC-Funktionen, 
die sich irgendwann extrem aufgebläht haben (indirekter Call).


Peter

von Vorn N. (lufthackn)


Lesenswert?

Karl heinz Buchegger schrieb:

> ...Pointer.
> Und in deinem speziellen Fall völlig unnötig. Das kann man auch ganz
> logisch ohne so ein windiges Konstrukt schreiben.
>
>   write_block will:
>
>            Adresse von wo
>            Adresse wohin
>            Wieviele Bytes
>

>
1
>   eeprom_write_block( & RAM_Data.Bar[1],
2
>                       & EEP_Data.Bar[1],
3
>                       sizeof( RAM_Data.Bar[1] ) );
4
>
> das ist mehr oder weniger alles.
> Der Rest (mit den Sternchen und so) findet sich in jedem C Buch

Oi, vielen dank herr buchverkäufer^^


@ H.Danneger,

mal sehn wie ich das jetzt handhabe und wie oft ich die codezeile 
schreiben muss..., sollte sich eine Funktion zum speichern anbieten 
werde ich mir das mal genauer angucken.

liebe grüsse

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.