AVR GCC Interrupts im Bootloader und im main

Gast #4542240
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
Gast
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?
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.
Gast
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?
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.