Forum: Compiler & IDEs SEI in Interrupt Routine


von Thomas (Gast)


Lesenswert?

Hi,

ich habe eine Frage.
Wenn ich zwei Timer Interrupts habe Timer0 (10ms) und Timer1 (150us) und 
ich nichts besonderes tue, wird ja beim Timer0 Overflow Int. der globale 
Int. handler deaktiviert, d.h. Timer0 ISR Routine läuft komplett durch. 
Braucht sie z.B. länger als 150us muss Timer1 warten und wird dann nach 
verlassen der Timer0 Overflow routine abgearbeitet.

Richtig? ich nehme nicht an das andere Interrupts die während der 
Abarbeitung von Timer0 Overflow auftreten verfallen oder?

Im Datenblatt steht jetzt, das man in der IRS (z.B. von Timer0) den 
globalen Int. Handler mit SEI wieder aktivieren kann. Dann können andere 
Interrupts die Routine unterbrechen und werden dann ausgeführt.

Frage hierzu:
- Spielt die position (prio) im Interrupts Vector eine Rolle dabei oder 
wird jeder auftretende Int. dann ausgeführt?
- Was passiert wenn z.b. Timer1 dann in mitten der Bearbeitung von 
Timer0 ISR auftritt? Timer0 wird dort unterbrochen wo sie gerade steht, 
Timer1 ISR wird ausgeführt und anschließend wieder bei Timer0 ISR da 
weiter gemacht wo man aufgehört hat? oder verfällt dann der Rest von 
Timer0 ISR?

Vielen Dank und Gruß schonmal vorab.

von (prx) A. K. (prx)


Lesenswert?

Thomas schrieb:

> - Spielt die position (prio) im Interrupts Vector eine Rolle dabei oder
> wird jeder auftretende Int. dann ausgeführt?

Ich nehme an, es sind AVRs gemeint.

Die Prio entscheidet nur bei mehreren gleichzeitig anliegenden Ints, und 
zwar welcher Vektor zum Zuge kommt. Ausgelassen wird dadurch zunächst 
keiner, die anderen werden später ausgeführt (wenn ohne SEI in der ISR).

> - Was passiert wenn z.b. Timer1 dann in mitten der Bearbeitung von
> Timer0 ISR auftritt?

Ohne SEI: Kommt dran, wenn T0 ISR durch ist.

> Timer0 wird dort unterbrochen wo sie gerade steht,

Mit SEI in T0 ISR ja.

> Timer1 ISR wird ausgeführt und anschließend wieder bei Timer0 ISR da
> weiter gemacht wo man aufgehört hat?

Exakt so.

Wird natürlich entsprechend mehr Stack benötigt.

von Thomas (Gast)


Lesenswert?

Hallo,

ja sorry geht um AVR's... und danke für die Antwort, das war es was ich 
bestätigt haben wollte.

von Oliver (Gast)


Lesenswert?

A. K. schrieb:
> . Ausgelassen wird dadurch zunächst
> keiner, die anderen werden später ausgeführt (wenn ohne SEI in der ISR).

"Die anderen" sind in diesem Fall aber nur einmalig einer. Sollten 
während der Abarbeitung der ISR von Timer0 Timer1 mehrfach einen 
Interrupt auslösen, dann gehen dessen Interrupts bis auf einen verloren.

Oliver

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.