EEPROM Struct mit read und write block kopieren?

OP #1838879
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
#1838895
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
OP #1839093
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

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.