Hallo,
schreibe gerade einen Bootloader für einen 8051 basierenden prozessor.
Ich verwende SDCC
Nach dem Reset soll immer zunächst der Bootloader laufen, der dann
gegebenenfalls das flash beschreibt, aber sonst in das Hauptprogramm
springt. Der Bootloader sitzt daher an Addresse 0x0000. Grund ist, dass
so selbst im Fall eines Fehlerhaften Updates immer noch der Bootloader
installiert ist.
Wenn ich nun das Hauptprogramm über --code-loc an Adresse 0x5000
plaziere und vom Bootloader dort hin springe, läuft das Haupprogramm,
jedoch nicht dessen Interrupts.
Ich verstehe das so, dass SDCC zwar die Interrupt Tabelle ab 0x5000
plaziert, jedoch die Hardware beim Interrupt nach wie vor an die
Originalen Adressen springt. (Also z.B. 0xB für Timer1)
Scheinbar kann man das nicht ändern?
Da ich im Bootloader keine Interrupts verwende, frage ich mich, ob man
hier nicht direkt Sprünge an die richtige Stelle plazieren kann.
Aber wie würde man so etwas in SDCC bewerkstelligen?
Das Beste was mir dazu eigefallen ist, ist für jeden Interrupt eine
Funktion der Form
1 | void int_uart1(void) __interrupt (INT_NO_UART1)
|
2 | {
|
3 | _asm
|
4 | ljmp 0500B$
|
5 | _endasm
|
6 | }
|
Im Bootloader zu platzieren. Nicht getestet, aber scheint mir auch nicht
die Beste Möglichkeit zu sein. Geht das besser?
Dank