Forum: Compiler & IDEs Symbole für Adressen im externen EEPROM


von willy (Gast)


Lesenswert?

Hi,

es soll sowohl das AVR-interne als auch ein externes EEPROM verwendet 
werden.

Wie kann dem Compiler beigebracht werden, dass er für z.B. EEEXT 
anstelle von EEMEM einen neuen Adressblock verwalten soll?

Dankeschön!

von willy (Gast)


Lesenswert?

Habe die Lösung fast gefunden:

http://www.mail-archive.com/avr-gcc-list@nongnu.org/msg06463.html

Eine Frage bleibt jedoch. Welche Adresse kann ich für die neue section 
festlegen (64 kB Speicher)?

von Werner B. (werner-b)


Lesenswert?

Aus einem Makefile extrahiert
1
...
2
  --change-section-address .data-0x800000 \
3
  --change-section-address .bss-0x800000 \
4
  --change-section-address .noinit-0x800000 \
5
  --change-section-address .eeprom-0x810000 
6
...
Es ist also alles jenseits von 0x810000 verfügbar.

Vorschlag: 0x820000

Werner

Edit: Ich sehe gerade dass bis 840000 belegt ist, also 0x850000,
oder gleich 0xA00000.

;)

von willy (Gast)


Lesenswert?

Hallo Werner, danke fuer deine Hilfe!
Was ich an der Sache nicht verstehe: wie wird in diesem Fall denn aus 
einer Variable die Adresse 0? Also, in welchem Speicher ist die section 
0xA00000 und was steht an dieser Adresse? Wuerde mich freuen, wenn du 
mir mit einer Erklaerung den Linker etwas naeherbringen koenntest :-)

von Werner B. (werner-b)


Lesenswert?

Ist im Link aus dem zweiten Beitrag erklärt.

Ein Pointer ist beim AVR 16 Bit, kann also Werte von 0x0000 bis 0xFFFF 
annehmen. Der Compiler/Linker verwendet längere (vermute mal 32 oder 64 
Bit). Hier werden 24 Bit benötigt (0xA00000). Durch den avr-objcopy wird 
dieser Bereich aus dem erzeugten elf-Binärfile extrahiert und 
(üblicherweise) in ein hex File umgewandelt. Da hierbei nur 16 Bit 
Adressen benötigt werden (bzw. verwendet werden können), werden die 
überzähligen Bits einfach abgeschnitten.


Original:  uint32_t orgptr = 0xA01234;
Ziel:      uint16_t targptr = orgptr;   // Ergebnis = 0x1234;

Automagically ;-)

von willy (Gast)


Lesenswert?

Vielen Dank!

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.