GCC: relative/absolute Sprünge
-
Moin zusammen,
ich mache mir gerade Gedanken um eine Flashroutine für ein embedded System, d.h. eine Funktion, die ein Binary in einen Flashspeicher schreibt. Entwicklungssystem ist GCC 4.2.8 für Coldfire. Nun soll diese Routine selbst im Flash stehen. Zum Flashen muß sie sich natürlich selbst ins RAM umkopieren, damit sie sich nicht selbst überschreibt. Das wiederum bedeutet, dass die Routine keine Sprünge an absolute Adressen (d.h. Mnemonics jmp/jsr) enthalten darf, da diese Sprünge - sowie die Routine aus dem RAM läuft - ja in das Flash (wg. absoluter Adresse) zeigen würden.
Wie teile ich dem GCC nun mit, daß er statt jmp nur bra und statt jsr eben bsr nimmt und mich notfalls darauf hinweist, wenn die relativen Sprünge zu groß sind? Sonst müßte ich alles in Assembler schreiben.
Any idea?Thanx, Arne
-
Ich mache das meistens so, daß ich ein zweites Projekt anlege, das komplett im RAM läuft und den Flashercode enthält. Dieses Projekt wird gebaut und der Output des Linkers wird in dem Hauptprojekt als Binärfile hinzugefügt. Das Hauptprojekt kopiert dann den Code vom Flash ins RAM und ruft ihn auf.
-
Ich denke, ich kann mir die Antwort selbst geben. Nachdem ich auf der Suche nach einem speziellen __attribute__ für den GCC nicht fündig wurde, fiel mir auch wieder der engl. Fachbegriff für mein Problem ein: position independent code
Google brachte mich hierhin:
http://www-user.tu-chemnitz.de/~hmai/gcc/Ausarbeitung_1/code_opt.html
und die Option -fpic scheint beim Coldfire-Port unterstützt zu seinSchönes Wochenende,
Arne