Warning bei eeprom_write_word und eeprom_read_word

OP #6348392
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:
OP
Vielen Dank für die schnelle Antwort:)
Folgendes habe ich bereits probiert, allerdings wird mir da der selbe 
Fehler angezeigt.
1
uint16_t adress = 0x00;
2
uint16_t *p_adress = &adress;
3
uint16_t value = 0;
4

5
value = eeprom_read_word(*p_adress);
Moderator Persönliche Seite
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.