Forum: Mikrocontroller und Digitale Elektronik langes Interrupt


von Highii H. (highii)


Lesenswert?

Hallo,

Ich habe ein Interrupt bei einem xmega, dass durch CTC ausgelöst wird. 
Das Interrupt hat hohe Priorität.
Das Interrupt wird sehr häufig ausgelöst, da der Zähler nicht weit 
zählt. Sagen wir, der Zähler zählt bis 1000 Systemtakte. Wenn ich nun 
beim Auslösen des Interrupts eine Routine starte (ISR), die mehr als 
1000 Systemtakte benötigt, was passiert dann bei einem neuen Interrupt?

Es ist eine Verständnisfrage darüber, wie ein mC arbeitet.

Wird das neue Interrupt erst wieder ausgelöst, wenn die alte Routine 
fertig ist? Oder wird die alte unterbrochen?

Mit ist bewusst, dass ein Interrupt nur sehr kurz sein soll. Aber mal 
angenommen man hat diesen Fall.

Danke und Gruß

von Falk B. (falk)


Lesenswert?

@ Highii H. (highii)

>Das Interrupt wird sehr häufig ausgelöst, da der Zähler nicht weit
>zählt. Sagen wir, der Zähler zählt bis 1000 Systemtakte. Wenn ich nun
>beim Auslösen des Interrupts eine Routine starte (ISR), die mehr als
>1000 Systemtakte benötigt, was passiert dann bei einem neuen Interrupt?

https://www.mikrocontroller.net/articles/Interrupt#Zeitverhalten_eines_Timerinterrupts

>Wird das neue Interrupt erst wieder ausgelöst, wenn die alte Routine
>fertig ist?

Ja.

> Oder wird die alte unterbrochen?

Ein Interrupt kann sich SELBER nicht unterbrechen (jaja, man kann es 
hintricksen, daber das ist keine Lösung, eher ein neues Problem).

von Amateur (Gast)


Lesenswert?

>Mit ist bewusst, dass ein Interrupt nur sehr kurz sein soll. Aber mal
>angenommen man hat diesen Fall.

Wenn Dein Rechner nicht mal zwischendurch Einkaufen war, ist die Gefahr 
groß, dass der Interrupt sich nochmal unterbricht, und nochmal 
unterbricht, und...

Dein PC würde in diesem Falle: Stack overflow sagen und einen Abstecher 
ins Nirwana machen.

Ein µC macht zwar dasselbe, hüllt sich dabei aber in Schweigen

von Elektrotiger (Gast)


Lesenswert?

Falk B. schrieb:
>>Wird das neue Interrupt erst wieder ausgelöst, wenn die alte Routine
>>fertig ist?
>
> Ja.

Wie ist das wenn ich unterschiedlich priorisierte Interruptroutinen 
habe.
Wenn z.B. ein Interrupt gerade abgearbeitet wird, welches eine geringere 
Priorisierung besitzt als gerade ausgelöst wird?
Wird dann die noch weniger priorisierte Interruptroutine zu ende 
bearbeitet oder an dem Punkt wo sie ist unterbrochen und zur wichtigen 
Interruptroutine springen?

von Karl H. (kbuchegg)


Lesenswert?

Amateur schrieb:

> Ein µC macht zwar dasselbe, hüllt sich dabei aber in Schweigen

Kommt drauf an.
Bei einem AVR sind die Interrupts während der Abarbeitung einer ISR 
automatisch gesperrt. Was nicht heisst, dass ein auftretender Interrupt 
nicht registriert wird - er wird registriert (genau einer). Nur kommt es 
nicht zu einer Unterbrechung der ISR und damit auch nicht zu einem Stack 
Overflow.
Im schlimmsten Fall wird dann ein Interruptereignis übersprungen, was 
sich normalerweise dann in fehlerhaften Werten manifestiert.

Ist es allerdings der Normalfall, dass Interrupts schneller auftreten 
als sie abgearbeitet werden können, dann hat man ein Problem. Das ist 
so, wie wenn du zur Bearbeitung einer Reperatur 20 Minuten brauchst, 
aber alle 10 Minuten kommt ein zu reparierendes Gerät herein. Die 
Situation kannst du logischweise alleine nicht mehr meistern, irgendwann 
ist die Werkstatt voll. Dann heisst es entweder schneller arbeiten oder 
keine neuen Aufträge mehr annehmen. Zaubern kann keiner, auch nicht ein 
AVR.

: Bearbeitet durch User
von Elektrotiger (Gast)


Lesenswert?

Ich beziehe mich auf ARM :P.

von Falk B. (falk)


Lesenswert?

@ Elektrotiger (Gast)

>Wie ist das wenn ich unterschiedlich priorisierte Interruptroutinen
>habe.

Anders.

>Wenn z.B. ein Interrupt gerade abgearbeitet wird, welches eine geringere
>Priorisierung besitzt als gerade ausgelöst wird?
>Wird dann die noch weniger priorisierte Interruptroutine zu ende
>bearbeitet

Nein, sie wird vom höher priorisierten Interrupt sofort unterbrochen.

> oder an dem Punkt wo sie ist unterbrochen und zur wichtigen
>Interruptroutine springen?

Klar, sonst hätte das Konzept der Interruptprioritäten wenig Sinn.

von Elektrotiger (Gast)


Lesenswert?

Haben TC Handler automatisch höchste Priorität?
Bei mir unterdrückt es Systick, also der wichtigsten Interruptroutine. 
Mein Button Handler ist brav an letzter Stelle, aber bei einem TC 
Handler kann ich keine Priorität einstellen?

von Karl H. (kbuchegg)


Lesenswert?

Wer oder was ist ein TC Handler?
Und wovon sprichst du konkret?

NOrmalerweise kann man Interrupt Prioritäten immer einstellen. Wenn du 
ein Framework benutzt (wovon ich ausgehe - ARM - T(ouch)C(ontroller) - 
Systick), dann wird irgendwo in den Tiefen des Frameworks die NVIC 
Priorität eingestellt sein.

von Joe (Gast)


Lesenswert?

Highii H. schrieb:
> Das Interrupt wird sehr häufig ausgelöst, da der Zähler nicht weit
> zählt. Sagen wir, der Zähler zählt bis 1000 Systemtakte. Wenn ich nun
> beim Auslösen des Interrupts eine Routine starte (ISR), die mehr als
> 1000 Systemtakte benötigt, was passiert dann bei einem neuen Interrupt?



Wenn ein Interrupt nach 1000 Taten ausgelöst wird und selbst mehr als 
1000 Takte benötigt, dann ist der MC überlastet.

Wie schon geschrieben wird die IRS danach direkt, aber zeitlich falsch, 
ausgeführt.

Joe

von Falk B. (falk)


Lesenswert?

@ Joe (Gast)

>Wenn ein Interrupt nach 1000 Taten ausgelöst wird und selbst mehr als
>1000 Takte benötigt, dann ist der MC überlastet.

Ja. Aber es gibt manchmal auch verzeigte ISRs, wo ein Zweig nur 100 
Takte, ab und an ein anderer Zweig aber 1500 Takte braucht. Siehe 
Interrupt.

von Elektrotiger (Gast)


Lesenswert?

Karl H. schrieb:
> NOrmalerweise kann man Interrupt Prioritäten immer einstellen. Wenn du
> ein Framework benutzt (wovon ich ausgehe - ARM - T(ouch)C(ontroller) -
> Systick), dann wird irgendwo in den Tiefen des Frameworks die NVIC
> Priorität eingestellt sein.

-.- Richtig, danke.
Arbeite mit der ASF von Atmel, deren Ordnung ist Teils sehr verwirrend.
So stellt man die Priorisierung des Button Handlers über
pio.h:
1
pio_handler_set(PIOA, ID_PIOA, BUTTON_01_MASK, BUTTON_01_ATTR, BUTTON_Handler);

Allerdings die TC wie es sein sollte dann über NVIC. Für nen Laien echt 
doof :(.

von Kaj (Gast)


Lesenswert?

Amateur schrieb:
> st die Gefahr
> groß, dass der Interrupt sich nochmal unterbricht, und nochmal
> unterbricht, und...
Unsinn!

Karl H. schrieb:
> Wer oder was ist ein TC Handler?
TC -> Timer/Counter

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.