Forum: Compiler & IDEs reti statt bad interrupt


von Herbert (Gast)


Lesenswert?

Kann man dem avr-gcc irgendwie z.B. per Parameter beibringen, anstatt 
des Aufrufs von "bad interrupt" einfach "reti" in die Interrupt Table 
reinzuschreiben? Standardmäßig wird ja ein Sprung nach 0 gemacht, was 
einem Reset gleichkommt.
Der Hintergrund ist der, dass ich einen Bootloader schreibe. Kommt es 
nun zu einem Reset und es sind noch Interrupts aktiv (andere als im 
Bootloader), werden diese natürlich nicht korrekt behandelt und der 
Bootloader bleibt hängen. Leider habe ich zu wenig Platz, daher wäre es 
praktisch, einfach diese (je) zwei Bytes für reti direkt in der 
Interrupt Table zu haben.

von (prx) A. K. (prx)


Lesenswert?

Ein Reset löscht alle anstehenden Interrupts.
Da kann also nichts mehr kommen.

von Herbert (Gast)


Lesenswert?

Ein Sprung nach 0 ist aber kein richtiger Reset. Dann bleibt z.B. auch 
ADCSRA auf dem alten Wert. Wenn der ADC-Interrupt an ist und auslöst, 
hat man den Salat.

von Jim M. (turboj)


Lesenswert?

Ohne Rücksetzen der Interrupt Bedingung wird oft erneut ein Interrupt 
ausgelöst, Du hast jetzt also eine Endlosschleife (Deadlock) statt einem 
Reset.

Ich würde lieber die Quellen ausschalten, das sind bei AVR normalerweise 
nicht soo viele.

von Rolf M. (rmagnus)


Lesenswert?

Herbert schrieb:
> Der Hintergrund ist der, dass ich einen Bootloader schreibe. Kommt es
> nun zu einem Reset und es sind noch Interrupts aktiv

Herbert schrieb:
> Ein Sprung nach 0 ist aber kein richtiger Reset.

Oben schreibst du reset, hier ist es ein Sprung nach 0. Warum springst 
du denn nach 0, statt einen richtigen Reset zu machen?

von Herbert (Gast)


Lesenswert?

Der Sprung nach 0 ist der Default bei nicht definierter ISR.

von Peter D. (peda)


Lesenswert?


von Herbert (Gast)


Lesenswert?

Danke, ich verstehe nicht so ganz, was du damit sagen willst. Momentan 
ist es so:
1
ISR(__vector_default, ISR_NAKED) {
2
  asm volatile ("reti");
3
}

Leider verursacht das 2 unnötige Jumps.

von Peter D. (peda)


Lesenswert?

Herbert schrieb:
> Leider verursacht das 2 unnötige Jumps.

Ach Gottchen, fehlen wirklich die 2 Byte Flash?
1
EMPTY_INTERRUPT(BADISR_vect);

von Rolf M. (rmagnus)


Lesenswert?

Herbert schrieb:
> Der Sprung nach 0 ist der Default bei nicht definierter ISR.

Jetzt versteh ich's dann nicht mehr. Warum aktiviert dein Programm denn 
Interrupts, für die keine ISRs definiert sind? Du schreibst doch:

Herbert schrieb:
> Der Hintergrund ist der, dass ich einen Bootloader schreibe. Kommt es
> nun zu einem Reset und es sind noch Interrupts aktiv [...]

Und nun frage ich mich, was für einen "Reset" du hier meinst. Kommt es 
zu einem echten Reset, sind danach keine Interrupts mehr aktiv, und das 
Problem existiert nicht. Wird stattdessen, wie du hier nun sagst, durch 
eine nicht definierte ISR ein Sprung nach 0 gemacht, dann ergibt sich 
die Frage, warum dein Programm den entsprechenden Interrupt überhaupt 
einschaltet.

von Peter D. (peda)


Lesenswert?

Viele Interrupts löschen ihr Flag nicht beim Einsprung. Dann läuft mit 
RETI das Main in Zeitlupe (je 10 Zyklen Interrupt + 1 Zyklus Main).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sinnvoller wäre es unter diesen Umständen, im Bootloader einfach
komplett auf Interrupts zu verzichten und sie per cli abzuschalten.

Die Applikation sollte man dann wohl per Watchdog-Reset anspringen,
damit sichergestellt ist, dass sie nicht mit Altlasten der vorherigen
Applikation kämpfen muss.

Ansonsten: mit dem in der Bibliothek mitglieferten crt0.o kannst du
es nicht erreichen, die RETIs direkt in die Vektortabelle zu
bekommen, aber wenn du das partout willst, hindert dich natürlich
niemand daran, dein eigenes Startup-File zu schreiben und linken zu
lassen.

von uwe (Gast)


Lesenswert?

Kenne das auch mit Watchdog aktivieren und ner folgenden Endlosschleife 
ohne Watchdog Reset, schon hast du einen richtigen Reset.

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.