Hallo, ich habe ein Programm welches Timer Interrupts nutzt. Nun möchte ich es um einen Bootloader ergänzen, der ebenfalls Timer Interrupts nutzt. Die Vektortabelle kann ich mittels IVSEL auf umstellen. Nur wie kann ich die Vektortabelle im Bootloader-Bereich anlegen lassen? Vielen Dank! Simon
Indem man sie dort definiert. Der Bootloader ist ja ein selbstaendiges Programm.
Oh D. schrieb: > Indem man sie dort definiert. Der Bootloader ist ja ein selbstaendiges > Programm. Zur Zeit ist der Bootloader nur eine Funktion im Hauptprogramm.
1 | BOOTLOADER_SECTION void boot() |
2 | {
|
3 | while (1) |
4 | {
|
5 | }
|
6 | }
|
wenn ich jetzt irgendwo
1 | ISR(TIMER1_COMPB_vect) |
2 | {
|
3 | }
|
definiere wird doch in der Vektortabelle die Funktionsadresse abgelegt. Wie sage ich dem Compiler/Linker wo die Tabelle ist. Bzw. welche Funktion welche Tabelle nutzt. Oder kann ich selbst mit einem Trick die Funktionsadresse in die Tabelle schreiben?
Simon schrieb: > Zur Zeit ist der Bootloader nur eine Funktion im Hauptprogramm. Er kann sich also selber löschen und das wars dann.
Peter D. schrieb: > Er kann sich also selber löschen und das wars dann. Ja? Ich dachte, ich kann den Bootloader-Bereich vor überschreiben schützen.
Der Bootloader muss ein selbstaendiges Programm sein. Man kann dessen Einsprungpunkte im Hauptprogramm erwaehnen. Allenfalls kann ein Bootloader auch trivialste Libraryfunktionen fuer das Hauptptogramm beinhalten. Und muss dem irgendwie die Einsprungpunkte uebergeben. Aber : Der Bootloader kann sich natuerlich nicht ueberschreiben, und das Hauptprogramm kann es sowieso nicht. Der Bootloaderbereich ist per Manual definiert, lediglich die Groesse kann gewaehlt werden. Das erdachte Konzept wird leider von den Tools nicht unterstuetzt. Denn dann muesste der Compiler das bootloaderkonzept kennen, und neben anderem zwei Interrupttabellen anlegen koennen.
Ich hoffe wir sprechen gerade nicht aneinander vorbei. Natürlich ist der Bootloader ein eigenständiges Programm welches ja Dank der BOOTRST Fuse auch nach dem Start ausgeführt wird. Es ist in der C-Datei nur als Funktion im Bootloader-Bereich deklariert, da ich so eine hex Datei bekomme in der die gesammte Funktionalität vereint ist. Kann ich eine Variable im Flash mit der Funktionsadresse der ISR am Platz der Vektortabelle definieren?
Über den Compiler/Linker bekommt man im allgemeinen kein Gesamtimage hin. Es müssen ja alle Abhängigkeiten getrennt nach Bootloader und Applikation aufgelöst werden. Ansonsten kann es passieren, dass z.B. ein memcpy() im Bootloader zu einem Sprung in die nicht vorhandene Applikation führt. Warum sollte der Compiler (besser der Linker) in diesem Beispiel memcpy() zweimal bereitstellen?
Oh D. schrieb: > Der Bootloader muss ein selbstaendiges Programm sein. Kann er sein, mus er aber nicht sein. > Man kann dessen > Einsprungpunkte im Hauptprogramm erwaehnen. Allenfalls kann ein > Bootloader auch trivialste Libraryfunktionen fuer das Hauptptogramm > beinhalten. Also meine Bootloader enthalten ziemlich regelmäßig den vollständigen Gerätetreiber und zumindest einen Teil des Protokollstacks, die später auch die Applikation nutzt. Was ganz logisch ist, weil das Hauptprogramm dieses Medium wegen seiner Verfügbarkeit zur Kommunikation nutzt und der Bootloader dasselbe Medium aus genau demselbem Grunde zum Heranschaffen der Firmwareupdates. Nur Idioten würden zweimal denselben Gerätetreiber und zweimal den gleichen Protokollstack implementieren. Und übrigens ist es auch Quatsch, dass ein Bootloader sich nicht selber aktualisieren könnte. Das kann er natürlich, wenn man die entsprechenden Voraussetzungen dafür schafft.
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.