Forum: Compiler & IDEs EEMEM


von Maggus (Gast)


Lesenswert?

1
/* Wort */
2
uint16_t eeFooWordReleaseCount EEMEM = 0;  // A
3
uint16_t ReleaseCount;                     // B
4
 
5
6
//...
7
    ReleaseCount = eeprom_read_word(&eeFooWordReleaseCount); // lesen
8
    //ReleaseCount hat nun den Wert aus dem EEMEM
9
//...
10
    ReleaseCount = 2222;
11
    eeprom_write_word(&eeFooWordReleaseCount, ReleaseCount); // schreiben
12
//...

Mit obigem Code bekommt man ja Zugriff auf das EEPROM. Da ich mich mit C 
nicht sonderlich gut auskenne, möchte ich gerne fragen, was genau das in 
Zeile A definierte Teil jetzt ist. Ich hatte erst vermutet dass das nur 
ein Zeiger ist, aber damit liege ich glaube ich daneben.

Und was muss man nun tun, wenn man eine zweite Variable im EEPROM 
lesen/speichern möchte. Benötigt man dann Zeile A und B ein zweites 
Mal?

Viele Grüße,  Markus

von Karl H. (kbuchegg)


Lesenswert?

> Ich hatte erst vermutet dass das nur
> ein Zeiger ist, aber damit liege ich glaube ich daneben.

Aus Compilersicht ist das eine ganz normale Variable,
deren Attributierung allerdings verhindert, dass sie
im SRAM angelegt wird.

Der Compiler kümmert sich also nur darum, dass dieser
Variablen eine Adresse zugewiesen wird (genauso
wie er es auch bei Variablen im SRAM macht) aber ansonsten
ist es ratsam, die Finger von dieser Variablen zu lassen.

> Und was muss man nun tun, wenn man eine zweite Variable im EEPROM
> lesen/speichern möchte

Du legst eine 2.te variable an.

uint16_t eeFooWordReleaseCount EEMEM = 0;
uint8_t  eeNochEineVariable EEMEM = 5;

'Zeile B' hat mit 'Zeile A' nichts zu tun. in 'Zeile B'
wird lediglich eine ganz stinknormale Variable vereinbart,
damit man auch einen Speicherplatz hat, wohin eeprom_read_word
die Daten schreiben kann.

Das ganze ist doch im Grunde nur eine Zuweisung

  int i;
  int j;

  i = j;

Nur halt mit dem Unterschied, dass j im EEPROM zu liegen
kommt. Ergo
  * muss man dem Compiler auch sagen, dass j im EEPROM liegt.
    Das macht das EEMEM da drinnen

    int EEMEM j;

  * kannst du nicht eine normale Zuweisung benutzen, da EEPROM
    etwas anders angesprochen wird. In üblicher C Manier gibt
    es dafür eine Spezialfunktion, die das erledigt

    i = eeprom_read_word( &j );

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.