EEPROM - HighByte first?

OP #2535742
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? :)
Gast #2536202
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 !!!
Gast #2537499
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]);
OP #2538967
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren