Forum: Compiler & IDEs EEPROM Variable ...


von Gerhard Fischer (Gast)


Lesenswert?

Hallo zusammen

Ich hab mal eine Verständnisfrage. Ich möchte einen Abgleichwert (ein 
paar Bytes) im EEPROM ablegen und bei jedem Programmstart wieder abrufen 
...

    uint8_t eeFooByte EEMEM;
    uint8_t myByte;

    myByte = 99;
    eeprom_write_byte(&eeFooByte, myByte);             // schreiben

Kann ich sicher sein, dass jeder Lesevorgang (also auch nach Power off) 
immer auf die richtige EEPROM Zelle (Adresse) zugreift. Oder anders 
gefragt ... bin ich gezwungen in diesem Fall mit absoluten EEPROM 
adressen zu arbeiten?

    myByte = eeprom_read_byte(&eeFooByte);             // lesen


Danke im Vorraus ...
Gerhard

von johnny.m (Gast)


Lesenswert?

Ich kann die Frage nicht ganz nachvollziehen. Wenn Du eine Variable im 
EEPROM mit EEMEM deklarierst, dann legt der Linker die Variable ins 
EEPROM. Da die Variable einen Namen (eeFooByte) hat, wird bei einem 
Aufruf von eeprom_read_byte(&eeFooByte, myByte) natürlich auch auf genau 
diese Variable zugegriffen. Wie sollte es auch sonst sein? Oder meinst 
Du etwas Anderes?

von Gerhard Fischer (Gast)


Lesenswert?

Hi Johnny

Nein, das war schon so gemeint. Beim RAM ist`s klar ... die Variablen 
existiert ja nur während der Laufzeit. Beim EEPROM bin ich mir nicht 
sicher ob die Adresse der Variablen beim nächsten Compilieren / Linken 
evtl. anders vergeben wird?

von klugscheissender Rahul, manchmal auch fies (Gast)


Lesenswert?

>Beim EEPROM bin ich mir nicht
>sicher ob die Adresse der Variablen beim nächsten Compilieren / Linken
>evtl. anders vergeben wird?

Das kann schon passieren, wenn es zwischendurch eine Umdeklaration gibt.
Irgendwie kann man angeblich aber auch feste Adressen für die 
EEPROM-Variablen vergeben (ich weiß nicht, wie es geht...).

von Karl heinz B. (kbucheg)


Lesenswert?

Ich behelfe mir in solchen Fällen mit ein paar Defines.
Wenn ich sowieso eeprom_read_byte und eeprom_write_byte
benutzen muss, dann brauch ich auch keine EEMEM Variablen
dafür.


#define CONFIG_BYTE   ((void*)1)
#define CONFIG_1      ((void*)2)


  eeprom_write_byte( CONFIG_BYTE, myByte );

So bleibt jedes Byte im EEPROM dort wo ich es hin
haben will. Aufpassen muss man nur, dass die Konstanten
in der Größe richtig sind. Wenn CONFIG_1 ein int sein
soll, dann ist die nächste verwendbare EEPROM Position
die 4

Wer will kann da noch mit sizeof() vorbeugend etwas
Sicherheit hineinbringen, bisher hatte ich allerdings
mit diesem einfachen Schema noch keine Probleme.

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.