Forum: Compiler & IDEs EEPROM Offset


von Josef K. (josefk)


Lesenswert?

Hallo,

heute muß ich aber wieder viel fragen :)

Ich versuche gerade ein paar Sachen im Eeprom zu speicher und wieder zu 
lesen. Leider klappt das nicht wirklich, aber hier erst mal der Code:
1
#define   EE_DUMMY     0x000  // Dummyelement (Adresse 0 sollte nicht genutzt werden)
2
#define   EE_IP0        0x001  // Eine Bytevariable  
3
#define   EE_IP1        0x002 
4
#define   EE_IP2        0x003
5
#define   EE_IP3  0x004 
6
#define   EE_HOSTIP0  0x005
7
#define   EE_HOSTIP1  0x006
8
#define   EE_HOSTIP2  0x007
9
#define   EE_HOSTIP3  0x008
10
#define   EE_NETMASK0  0x009
11
#define   EE_NETMASK1  0x00A
12
#define   EE_NETMASK2  0x00B
13
#define   EE_NETMASK3  0x00C
14
15
16
17
static uint8_t eeIp[] EEMEM = { [EE_IP0] = 192,  [EE_IP1] = 168, [EE_IP2] = 0, [EE_IP3] = 110 };
18
static uint8_t eeHostip[] EEMEM = { [EE_HOSTIP0] = 192, [EE_HOSTIP1] = 168,   EE_HOSTIP2] = 0, [EE_HOSTIP3] = 254 };
19
static uint8_t eeNetmask[] EEMEM = { [EE_NETMASK0] = 255, [EE_NETMASK1] = 255, [EE_NETMASK2] = 255, [EE_NETMASK3] = 0 };
20
21
//Etnernet IP
22
#define ENC28J60_IP1    eeprom_read_byte((unsigned char *)EE_IP0)
23
#define ENC28J60_IP2    eeprom_read_byte((unsigned char *)EE_IP1)
24
#define ENC28J60_IP3    eeprom_read_byte((unsigned char *)EE_IP2)
25
#define ENC28J60_IP4    eeprom_read_byte((unsigned char *)EE_IP3)
26
//Etnernet Host IP                 
27
#define ENC28J60_HIP1    eeprom_read_byte((unsigned char *)EE_HOSTIP0)
28
#define ENC28J60_HIP2    eeprom_read_byte((unsigned char *)EE_HOSTIP1)
29
#define ENC28J60_HIP3    eeprom_read_byte((unsigned char *)EE_HOSTIP2)
30
#define ENC28J60_HIP4    eeprom_read_byte((unsigned char *)EE_HOSTIP3)
31
//Etnernet Netmask                 
32
#define ENC28J60_NM1    eeprom_read_byte((unsigned char *)EE_NETMASK0)
33
#define ENC28J60_NM2    eeprom_read_byte((unsigned char *)EE_NETMASK1)
34
#define ENC28J60_NM3    eeprom_read_byte((unsigned char *)EE_NETMASK2)
35
#define ENC28J60_NM4    eeprom_read_byte((unsigned char *)EE_NETMASK3)
36
37
//main
38
char enc_ip_buff[16];                    
39
rs232_puts_P(eth_status);
40
rs232_puts_P(eth_status_ip);
41
strcpy(enc_ip_buff, "");
42
inttostring(ENC28J60_IP1, enc_ip_buff); strcat(enc_ip_buff, ".");
43
inttostring(ENC28J60_IP2, enc_ip_buff); strcat(enc_ip_buff, ".");
44
inttostring(ENC28J60_IP3, enc_ip_buff); strcat(enc_ip_buff, ".");
45
inttostring(ENC28J60_IP4, enc_ip_buff);
46
rs232_puts(enc_ip_buff);
47
rs232_puts_P(eth_status_hostip); 
48
strcpy(enc_ip_buff, "");
49
inttostring(ENC28J60_HIP1, enc_ip_buff); strcat(enc_ip_buff, ".");
50
inttostring(ENC28J60_HIP2, enc_ip_buff); strcat(enc_ip_buff, ".");
51
inttostring(ENC28J60_HIP3, enc_ip_buff); strcat(enc_ip_buff, ".");
52
inttostring(ENC28J60_HIP4, enc_ip_buff);
53
rs232_puts(enc_ip_buff);
54
rs232_puts_P(eth_status_netmask);
55
strcpy(enc_ip_buff, "");
56
inttostring(ENC28J60_NM1, enc_ip_buff); strcat(enc_ip_buff, ".");
57
inttostring(ENC28J60_NM2, enc_ip_buff); strcat(enc_ip_buff, ".");
58
inttostring(ENC28J60_NM3, enc_ip_buff); strcat(enc_ip_buff, ".");
59
inttostring(ENC28J60_NM4, enc_ip_buff);
60
rs232_puts(enc_ip_buff);

Was dann gelesen wird:
1
ENC28j60 konfiguriert mit:
2
IP:
3
192.168.0.110
4
HOST IP
5
0.0.0.0
6
NETMASK:
7
0.192.168.0

Verwirrend! Gibts da sowas wie nen Offset von 5 Adressen?

von Werner B. (Gast)


Lesenswert?

Die simpleste Lösung ist doch den Compiler (OK eigentlich den Linker) 
entscheiden zu lassen wo die Datem im  EEProm liegen.
1
static uint8_t eeDummy EEMEM = 0xFF
2
static uint8_t eeIp[] EEMEM = { 192,  168, 0, 110 };
3
static uint8_t eeHostip[] EEMEM = { 192, 168, 0, 254 };
4
static uint8_t eeNetmask[] EEMEM = { 255, 255, 255, 0 };
5
6
//Etnernet IP
7
#define ENC28J60_IP1    eeprom_read_byte(&eeIp[0])
8
#define ENC28J60_IP2    eeprom_read_byte(&eeIp[1])
9
#define ENC28J60_IP3    eeprom_read_byte(&eeIp[2])
10
#define ENC28J60_IP4    eeprom_read_byte(&eeIp[3])
11
//Etnernet Host IP                 
12
#define ENC28J60_HIP1    eeprom_read_byte(&eeHostip[0])
13
#define ENC28J60_HIP2    eeprom_read_byte(&eeHostip[1])
14
#define ENC28J60_HIP3    eeprom_read_byte(&eeHostip[2])
15
#define ENC28J60_HIP4    eeprom_read_byte(&eeHostip[3])
16
//Etnernet Netmask                 
17
#define ENC28J60_NM1    eeprom_read_byte(&eeNetmask[0])
18
#define ENC28J60_NM2    eeprom_read_byte(&eeNetmask[1])
19
#define ENC28J60_NM3    eeprom_read_byte(&eeNetmask[2])
20
#define ENC28J60_NM4    eeprom_read_byte(&eeNetmask[3])
21
22
...

von Stefan E. (sternst)


Lesenswert?

Was mir auffällt, ist, dass in dieser Zeile
1
static uint8_t eeHostip[] EEMEM = { [EE_HOSTIP0] = 192, [EE_HOSTIP1] = 168,   EE_HOSTIP2] = 0, [EE_HOSTIP3] = 254 };
ein "[" fehlt.

von Josef K. (josefk)


Lesenswert?

Oh. Das gehört da natürlich schon hin. Das war nur ein Copy&Paste 
Fehler. :)

von Josef K. (josefk)


Lesenswert?

@Werner

Ich wollte mit der fixen Zuweisung erreichen, dass ich später die *.eep 
Datei einfach austauschen kann und nicht immer im Quelltext rumwerken 
muss bzw. compilieren muss.
Das werde ich dann bei der dynamischen Zuweisung verlieren, oder?

von Stefan E. (sternst)


Lesenswert?

1
static uint8_t eeHostip[] EEMEM = { [EE_HOSTIP0] = 192, [EE_HOSTIP1] = 168,   [EE_HOSTIP2] = 0, [EE_HOSTIP3] = 254 };

Das bedeutet: erzeuge ein Array, mit eeHostip[5] = 192, eeHostip[6] = 
168, etc.

Du hast also folgende Arrays:
eeIp:
0,192,168,0,110
eeHostip:
0,0,0,0,0,192,168,0,254
eeNetmask:
0,0,0,0,0,0,0,0,0,255,255,255,0

Und die werden hintereinander im EEPROM abgelegt.

von Stefan E. (sternst)


Lesenswert?

Nachtrag:

Wenn du es also auf die Art mit absoluten Adressen machen willst, darfst 
du nur ein einziges Array anlegen:
1
static uint8_t eeData[] EEMEM = { [EE_IP0] = 192, ... , [EE_NETMASK3] = 0 };

von Josef K. (josefk)


Lesenswert?

Achso. Dachte, das funktioniert anders. Das erklärt aber die Ausgabe. 
Danke!

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.