Warning bei eeprom_write_word und eeprom_read_word

OP #6348392
Lesenswert?

Hallo zusammen,
ich habe eine Frage zu den Lese- und Schreibfunktionen des EEPROMs. 
Aktuell habe ich die Speicheradresse für das EEPROM in einer uint16_t 
gespeichert und übergebe diese an die eeprom_write_word und 
eeprom_read_word. Das funktioniert auch, allerdings wirft der Compiler 
ein Warning, dass er einen Pointer erwartet und keinen Integer Wert 
(siehe Anhang). Ich habe leider keine Ahnung, wie ich die 
Speicheradresse als Pointer übergeben kann. Hat da vielleicht jemand 
eine Idee?
Angehängte Dateien:
Moderator Persönliche Seite #6348410
Lesenswert?

Sebastian F. schrieb:
> value = eeprom_read_word(*p_adress);

Das hätte übrigens mit
1
value = eeprom_read_word(p_adress);

funktioniert, denn dann übergibst du wieder einen Zeiger. So aber 
dereferenzierst du den Zeiger wieder, womit du auf dessen Inhalt 
zugreifst. Das ist nicht, was du willst.

Aber die Zwischenvariable ist schlicht nicht nötig.

Die Idee, warum diese Funktionen Zeiger nehmen und keine Zahlen ist, 
dass man EEPROM-"Variablen" anlegen kann:
1
uint16_t some_eeprom_value EEMEM;
2

3
// ...
4

5
    uint16_t current_val = eeprom_read_word(&some_eeprom_value);

In diesem Falle überlässt man Compiler und Linker die tatsächliche 
Adressaufteilung des EEPROMs.
Gast #6348416
Lesenswert?

Oder so (falls AVR):
(das EEMEM Makro ist schnell gebaut, wenn dein System das nicht kennt)
1
uint16_t eeprom_read_word(uint16_t *dummyptr) // dummyfunktion
2
{
3
  (void)dummyptr; 
4
  return 42; 
5
}
6

7
uint16_t imEeprom EEMEM = 4711; // section .eeprom / landet in *.eep
8
uint16_t imRam = 0 ;
9

10

11
int main() 
12
{
13

14
  imRam = eeprom_read_word(&imEeprom);
15
}
Moderator Persönliche Seite #6348419
Lesenswert?

Wenn man allerdings Wert auf eine bestimmte Reihenfolge der Elemente im 
EEPROM legt (weil man sie beispielsweise auch von außen über den 
Programmer lesen oder modifzieren können möchte), dann ist es das 
sinnvollste, dass man alle EEPROM-Daten in einer einzigen Variablen als 
struct hinterlegt. Ansonsten kann einem der Linker die Adressen 
irgendwie nach seinem Gusto sortieren.
Gast #6348421
Lesenswert?

Jörg W. schrieb:
> Ansonsten kann einem der Linker die Adressen
> irgendwie nach seinem Gusto sortieren.
Ja, das tut er.

Jörg W. schrieb:
> in einer einzigen Variablen als struct
Dafür wurde offsetof() erfunden, um dann noch einzelne Werte da raus 
picken zu können.


Ansonsten:
Ich spreche mich klar gegen das händische berechnen der EEPROM Adressen 
aus.
Denn Kompiler und Linker machen da keine Flüchtigkeitsfehler.
Menschen schon.
Auch hat die gewonnene Typsicherheit einiges an Vorteilen gegenüber 
Pointercasts.

Mantra:
> Jeder vermeidbare Cast, ist ein böser Cast.
> Jeder vermiedene Cast, ist ein guter Cast.

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