AVR GCC Interrupts im Bootloader und im main

Gast #4542240
Lesenswert?
• ▲
▼
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 #4542345
Lesenswert?
• ▲
▼
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?
#4542372
Lesenswert?
• ▲
▼
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 #4542378
Lesenswert?
• ▲
▼
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?
#4542386
Lesenswert?
• ▲
▼
Ü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 #4542397
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren