Hallo,
ich programmiere derzeit einen Bootloader für einen AT90CAN64. Dieser funktioniert einwandfrei. Ich habe 64 kB Flash-Speicher und die Bootloader-Fuse-Bits auf 0x7000 gesetzt. In den Linker-Options habe ich folgendes hinzugefügt: -Ttext=E000
Dadurch landet der Bootloader an der korrekten Adresse im Flash und es läuft auch alles einwandfrei.
Jetzt kommt allerdings ein Zusatz: Ich muss auch vom Haupt-Programm ebenfalls in den Flash-Speicher schreiben können. Da dieser Code nur von der Bootsector-Section aus ausgeführt werden kann, muss die entsprechende Funktion also in den Bootloader. Diese hätte ich dann gerne an eine fixe Adresse, damit ich die Funktion auch sicher anspringen kann.
Dazu habe ich mir in den Memory-Einstellungen des Bootloader-Projekts eine Section (.bootloader_end) an die Adresse 0x7F80 hinzugefügt und die Funktion, die vom Hauptprogramm aufgerufen werden soll wie folgt deklariert:
#define BOOTLOADER_END_SECTION __attribute__ ((section (".bootloader_end")))
void write_flash (U16* ptrData, U32 destination, U32 size) BOOTLOADER_END_SECTION;
Leider meckert jetzt der Linker:
../avr/bin/ld.exe: section .bootloader_end loaded at [0000f418,0000f499] overlaps section .data loaded at [0000f418,0000f49f]
Kann mir jemand einen Tipp geben, wie ich das gelöst bekomme?
Viele Grüße,
Andreas
Lesezeichen