langes Interrupt

OP #4282602
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ß
#4282608
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).
Gast #4282639
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
Gast #4282646
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?
#4282649
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.
#4282659
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.
Gast #4282668
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?
#4282670
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.
Gast #4282673
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
Gast #4282680
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 :(.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.