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!
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)?
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. ;)
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 :-)
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.