Hallo Forum,
ich verwende eine ATmega256 und Atmel Studio. Ich möchte den Flash aus
meiner Applikation schreiben. Dazu habe ich einige einfache Funktionen,
die in der BSL-Section abgelegt sind und von meiner Appliaktion gerufen
werden. Um bei unterschidlicher Codegröße oder anderen Versionsständen
dieser Funktionen immer den richtigen Einsprungpunkt zu finden, verwende
ich void-Pointer (für jede Funktion einen), die in einer eigenen Section
ganz am Ende des BSL liegen.
Damit kann sich der Code der Flashroutinen ändern, werden aber trotzdem
von allen Applikationen korrekt angesprungen.
Jetzt das Problem: Bei Sprüngen zum Flash > 64k wird ein Trampolin
gelinkt, welcher dann vor meinen Pointern liegen. Ich lade mit
pgm_read_dword... nicht mehr meine Adresse in der BSL-Section sondern
die Adresse im Trampolin. Das macht natürlich keinen Sinn, denn der
Trampolin ändert sich im Vergleich zum BSL.
Was gibts denn da für eine Lösung?
Hier als Beispiel ein ausschnitt aus der Header-Datei:
1 | typedef void (*BOOT_tvfv)(void); /*Typedef für Funktionen void (void)*/
|
2 |
|
3 | extern const BOOT_tvfv BOOT_fpEraseShadow; /*Funktionszeiger - liegt in der .bootfunctab section*/
|
4 |
|
5 | /*dieses makro wird in der Applikation verwendet*/
|
6 | #define BOOT_CALL_ERASE_SHADOW() \
|
7 | do { \
|
8 | BOOT_tvfv f=(BOOT_tvfv)pgm_read_dword_far(&BOOT_fpEraseShadow); \
|
9 | f(); \
|
10 | } while(0); \
|