Forum: Mikrocontroller und Digitale Elektronik Zeiger auf EEPROM


von Marcel K. (viewer)


Lesenswert?

Hallo Forumgemeinde,
ich arbeite mit Eclipse Helius und WINAVR. Ich möchte eine Fkt. 
erstellen die nur ins EEPROM schreibt, wenn der Wert ungleich ist. Dazu 
möchte ich der Fkt. einen EEPROM-Zeiger und den Wert an die Fkt. 
übergeben.
Das ganze sieht so aus:

__________________________________________________
...
#include <avr/eeprom.h>
...

void write_ee_byte(unsigned char new_val, unsigned char *ep_into EEMEM)
{
  unsigned char old_val EEMEM;

  old_val = eeprom_read_byte(&ep_into); // akt. Wert aus EEPROM lesen

  if (old_val == new_val) return;       // neuem Wert vergleichen

  eeprom_write_byte(&ep_into, new_val); // neuen Wert schreiben
}

__________________________________________________

Jetzt bekomme ich folgende Fehler:

section attribute not allowed for 'ep_into'

und

section attribute cannot be specified for local variables

Heißt dass, das man keinen Zeiger auf ein EEPROM erstellen kann und dass 
man keine lokale EEPROM-Variablen erstellen kann?

Viele Grüße,
Marcel (",)
von Stefan E. (sternst)


Lesenswert?

Marcel K. schrieb:
> Heißt dass, das man keinen Zeiger auf ein EEPROM erstellen kann

So was wie "Zeiger auf EEPROM" gibt es gar nicht. Alle Zeiger sind 
gleich. Nur die Verwendung des Zeigers entscheidet, wohin er letztlich 
gezeigt hat.

Marcel K. schrieb:
> dass man keine lokale EEPROM-Variablen erstellen kann?

Natürlich nicht. Wie sollte das denn gehen?
Und welchen Sinn sollte
"lese ein Byte aus dem EEPROM und speichere es im EEPROM zwischen"
überhaupt haben?

PS: Was stört dich an der fertigen Funktion eeprom_update_byte?
von Thomas E. (thomase)


Lesenswert?

Marcel K. schrieb:
> Heißt dass, das man keinen Zeiger auf ein EEPROM erstellen kann und dass
> man keine lokale EEPROM-Variablen erstellen kann?
Lokale EEPROM-Variablen kann man nicht erstellen, das sagt dir der 
Compiler ja. Lokale Variablen werden auf dem Stack erstellt.
Pointer kannst du überall erstellen. Lokal liegen die auch auf dem 
Stack.

Aber das
>unsigned char old_val EEMEM;
ist auch Unsinn. Du musst zum Vergleich keine Variable im EEPROM 
erstellen sondern einen Wert aus dem EEPROM ins RAM holen. Somit muß 
auch old_val im RAM angelegt werden. Also auf dem Stack, weil es ja 
lokal ist:
unsigned char old_val;

>unsigned char *ep_into EEMEM
Das geht gar nicht. Du musst nur den Pointer ep_into übergeben.
Also: void write_ee_byte(unsigned char new_val, unsigned char *ep_into)

Wenn du da 127 reinschreibst zeigt der auf Adresse 127. Mehr nicht. Wo 
diese Adresse liegt, steht da nicht drin. Und ist auch erstmal völlig 
unwichtig.
Die Funktion "eeprom_read_byte(...) " allerdings holt dir damit den Wert 
aus dem EEPROM. Dem Pointer ist das egal. Mit dem könntest du mit der 
richtigen Funktion auch aus dem Flash lesen oder auf einen Port 
schreiben.

mfg.
von Marcel K. (viewer)


Lesenswert?

Hallo Stefan,
was macht denn die fertige Fkt. "eeprom_update_byte"?
Ich möchte einfach nicht ständig ins EEPROM schreiben wenn der Wert 
bereits drin steht.

Grüße,
Marcel
von Stefan E. (sternst)


Lesenswert?

Marcel K. schrieb:
> was macht denn die fertige Fkt. "eeprom_update_byte"?
> Ich möchte einfach nicht ständig ins EEPROM schreiben wenn der Wert
> bereits drin steht.

http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
1
In addition to the write functions there is a set of update ones.
2
This functions read each byte first and skip the burning if the old
3
value is the same with new.
von Marcel K. (viewer)


Lesenswert?

Hallo zusammen,

@Thomas:
Danke für die ausfühliche erklärung. Jetzt geht es auch bei mir!!

@Stefan:
SUUPER, das habe ich ja gesucht! Vielen Dank für die Mühe mir den Link 
zu suchen...

Jetzt kann ich weiter machen :o)

Vielen Dank und schönes Wochenende...

Marcel (",)
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.