Forum: Compiler & IDEs EEPROM - HighByte first?


von Josef K. (zumlin)


Lesenswert?

Hallo

wenn ich folgende Daten im EEPROM ablege
1
#define EE_DEVICE_MEM_NEXTFREE 0x001
2
#define EE_DEVICES_START       0xFF
3
uint8_t eeMem[]    EEMEM = {[EE_DEVICE_MEM_NEXTFREE] = 0x00, [EE_DEVICE_MEM_NEXTFREE+1] = EE_DEVICES_START};
und diese dann mit
1
uint16_t tmp;
2
tmp = eeprom_read_word((uint16_t*)EE_DEVICE_MEM_NEXTFREE);
wieder auslese, bekomme ich dann als Ergebnis 0x00FF, 0xFF00 oder 
funktioniert das erst gar nicht? :)

von Stefan (Gast)


Lesenswert?

Hallo,

das Ganze funktioniert schon und da dein AVR eine "Little Endian 
machine" ist bekommst du 0xFF00.

Das Problem ist nur: Wer beschreibt dir dein EEPROM, der Programmer ???
Normalerweise tut er das nicht ohne spezielle Anweisung !!!

von Stefan (Gast)


Lesenswert?

Hallo,
ich  hab mir gerade nochmal die Fragestellung und meine Antwort 
angesehen und muss einiges richtig stellen!

Die Antwort dass das Ganze funktioniert ist zwar gültig aber dennoch 
sehr grenzwertig! (das heisst mehr zufällig)

Man muss sich folgende Zeile genau ansehen und überlegen was sie macht!

> uint8_t eeMem[]    EEMEM = {[EE_DEVICE_MEM_NEXTFREE] = 0x00, 
[EE_DEVICE_MEM_NEXTFREE+1] = EE_DEVICES_START};

Du deklarierst hier ein Array eeMem (mit zunächst unbekannter Länge) in 
der Sektion ".eeprom" und initialisierst das Element mit Index 
EE_DEVICE_MEM_NEXTFREE (=0x001) auf 0x00 und das nachfolgende Element 
auf den Wert EE_DEVICES_START.

Das Array ist mit den gegebenen Werten dann 3 Byte (uint8_t) lang und 
steht als erstes im EEPROM.

Jetzt greifst du mit
> tmp = eeprom_read_word((uint16_t*)EE_DEVICE_MEM_NEXTFREE);
auf ein Element im EEPROM zu das an der Adresse 0x001 steht. Diese 
Adresse  zeigt jetzt mehr zufällig auf das gewollte Element im Array 
eeMem.

Denn sind vor eeMem weitere Variablen (etc.) in der Sektion ".eeprom" 
deklariert dann steht eeMem nicht mehr an erster Stelle im EEPROM und es 
geht schief.

Die Zeile
> tmp = eeprom_read_word((uint16_t*)EE_DEVICE_MEM_NEXTFREE);
müsste dann besser lauten
  tmp = eeprom_read_word((uint16_t*)eeMem[EE_DEVICE_MEM_NEXTFREE]);

von Josef K. (zumlin)


Lesenswert?

Hi

schon mal vielen Dank für die detaillierte Antwort.
Ich muss aber - glaube ich - noch kurz erklären wie ich mir Daten im 
EEPROM ablege. :)
Ich schreibe mir immer Art Define-Liste, die mir wieder spiegelt was wo 
im EEPROM zu liegen hat.
1
#define   EE_DUMMY         0x000  // Dummyelement (Adresse 0 sollte nicht genutzt werden)
2
3
#define   EE_IP0           0x001  // Eine Bytevariable
4
#define   EE_IP1           0x002
5
#define   EE_IP2           0x003
6
#define   EE_IP3           0x004
7
#define   EE_IP_CKS        0x005
8
#define   EE_HOSTIP0       0x006
9
#define   EE_HOSTIP1       0x007
10
//etc.
und lege mir dann genau ein Array namens eeMem an, in dem ich alle Werte 
initialisieren (siehe Beitrag oben) und flashe dann die Werte einmalig 
mit ins EEPROM. Damit sollte ich auf der sicheren Seite sein.
Dass das ganze schief gehen kann, wenn ich mehrere Arrays kreuz und quer 
anlege war mir wirklich nicht mehr bewusst.
Ich glaube ich sollte echt mal anfangen mir das ab zu gewöhnen und mit 
Variablen arbeiten :)

von Walter S. (avatar)


Lesenswert?

struct ist hilfreich UND
wenn du ein Wort im eeprom speichern willst, warum definierst du dann 
nicht eins, dann musst du dir beim Auslesen auch keinen Kopf machen

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.