www.mikrocontroller.net

Forum: Compiler & IDEs EEMEM


Autor: Maggus (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
/* Wort */
uint16_t eeFooWordReleaseCount EEMEM = 0;  // A
uint16_t ReleaseCount;                     // B
 

//...
    ReleaseCount = eeprom_read_word(&eeFooWordReleaseCount); // lesen
    //ReleaseCount hat nun den Wert aus dem EEMEM
//...
    ReleaseCount = 2222;
    eeprom_write_word(&eeFooWordReleaseCount, ReleaseCount); // schreiben
//... 

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 );

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.