Forum: Compiler & IDEs Zugriff auf falsche Adresse im EEPROM


von Michael K. (mkfein)


Lesenswert?

Hallo!!

Ich arbeite mit einem AT90PWM316.
WINAVR ist auf dem neuesten Stand und zum programmieren nutze ich 
Eclipse mit dem AVR-Plug-In
Als Compiler verwende ich den gcc.

Ich habe eine Datei eeprom.h, die ich in verschiedenen Sektionen 
unterteil habe:

#define EEMEM __attribute__((section(".eeprom")))
#define EECAL __attribute__((section(".eecal")))

Damit die Ausgabedatei richtig zusammengesetzt wird, und die Sektionen 
an dem von mir gewünschten Platz landen, habe ich folgenden Zeile in das 
Feld für das Erstellen des EEPROM-images eingetragen:

-j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -j .eecal 
--change-section-lma .eecal=0x01F6 -O ihex

.eeprom beginnt ab Adresse 0
.eecal beginnt ab Adresse 0x01F6

Damit die beiden Bereiche nicht unbeabsichtigt in die Flash-Ausgabedatei 
geschrieben werden, sind noch folgenden Einstellungen nötig:

-R .eeprom -R .eecal -O ihex

Somit werden diese beiden Bereiche, welche in der .elf-Datei vorhanden 
sind, nicht in die .hex-Datei geschrieben, sondern nur in die Datei .eep

Im Bereich EEMEM habe ich mehrere Variablen, auf die ich alle problemlos 
zugreifen kann. Es sind jedoch nicht so viele, dass sie in den Bereich 
von .eecal reichen würden.
Im Bereich EECAL habe ich zwei Variablen. Weise ich diesen Variablen 
einen Wert in der Datei eeprom.h zu, so wird dieser Wert auch an die 
richtige Stelle im EEPROM des Controllers geschrieben. Aus der 
Ausgabedatei .eep ist des Weiteren auch ersichtlich, dass sowohl Adresse 
wie auch Wert stimmen.

Versuche ich mit eeprom_read_byte(&eecal_XX) auf eine Variable im 
Bereich .eecal zuzugreifen wird ein falscher Wert zurückgeliefert. Ein 
Schreibbefehl auf diese Adresse hat als Ergebnis, dass im Bereich von 
.eeprom geschrieben wird, jedoch nicht an die gewünschte Adresse im 
Bereich .eecal.

Hatte jemand schon mal ein ähnliches Problem?

Bis jetzt ist mir nur eingefallen die Adressen explizit anzugeben und 
nicht mehr die Variablennamen zu verweden.

Vielen Dank für alle die helfen.

von Stefan E. (sternst)


Lesenswert?

Michael Kaufmann schrieb:
> Versuche ich mit eeprom_read_byte(&eecal_XX) auf eine Variable im
> Bereich .eecal zuzugreifen wird ein falscher Wert zurückgeliefert. Ein
> Schreibbefehl auf diese Adresse hat als Ergebnis, dass im Bereich von
> .eeprom geschrieben wird, jedoch nicht an die gewünschte Adresse im
> Bereich .eecal.

Weil das hier
> --change-section-lma .eecal=0x01F6
keinerlei Einfluss darauf hat, welche Adressen der Linker den Variablen 
gibt. Dem musst du auch noch mitteilen, an welcher Adresse diese Section 
beginnen soll.

von Michael K. (mkfein)


Lesenswert?

Guter Einwand.

Kannst Du mir sagen wo ich die entsprechenden Einstellungen machen kann?

von Stefan E. (sternst)


Lesenswert?

Michael Kaufmann schrieb:
> Kannst Du mir sagen wo ich die entsprechenden Einstellungen machen kann?

Nein. Aber es gibt bestimmt irgendwo die Möglichkeit, zusätzliche 
Optionen für den Linker anzugeben.

PS: Oder sollte das "wo" eigentlich ein "wie" sein?
-Wl,--section-start=.eecal=0x8101f6

von Michael K. (mkfein)


Lesenswert?

Vielen Dank für die Hilfe.

Die letzte Antwort war der Hinweis der mir gefehlt hat.

Ich hab nun auch in Eclipse die passende Stelle gefunden um das Argument 
einzugeben.

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.