Forum: Mikrocontroller und Digitale Elektronik AVR GCC Interrupts im Bootloader und im main


von Simon (Gast)


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

von Pandur S. (jetztnicht)


Lesenswert?

Indem man sie dort definiert. Der Bootloader ist ja ein selbstaendiges 
Programm.

von Simon (Gast)


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?

von Peter D. (peda)


Lesenswert?

Simon schrieb:
> Zur Zeit ist der Bootloader nur eine Funktion im Hauptprogramm.

Er kann sich also selber löschen und das wars dann.

von Simon (Gast)


Lesenswert?

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.

von Pandur S. (jetztnicht)


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.

von Simon (Gast)


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?

von Steffen R. (steffen_rose)


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?

von c-hater (Gast)


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.

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
Noch kein Account? Hier anmelden.