"Clear Interrupt" Anweisung bei µCs = Schwachsinn??

Gast #532671
Lesenswert?
• ▲
▼
Hallo!

Ich bin gerade am Programmierien eines µC und versuche mich dabei 
unteranderem am RTI. Was ich überhaupt nicht verstehe - wieso muss in 
der ISR der Interrupt "gecleared" oder auch "bestätigt" werden. Ich 
mein, wie kann dieser (oder egal welcher) Interrupt überhaupt verpasst 
werden. Der Name sagt doch schon "Interrupt" = "Alles andere 
Unterbrechen und mich ausführen". Ich hoffe doch mal der µC hat intern 
eine kleine Queue für Interrupts, damit falls ein IRQ während dem 
Ausführen einer anderen ISR, einfach gepuffet wird.

Wie auch immer, da ich sie wohl benötigte, da ansonsten der RTI 
andauernd und nicht nur im angegebenen Intervall aufgerufen wird - 
schreibe ich diese "Clear" Anweisung dann am besten am Anfang der ISR, 
ganz am Ende oder einfach in der Mitte. Was passiert wenn ich den 
Interrupt mehrmals bestätige?

Kurz gesagt, mir ist der Sinn + die Logik dahinter total 
unbegreiflich...

Beste Grüße
Gast #532680
Lesenswert?
• ▲
▼
Nein der Controller hat keine Que für Inerrupts wär ja auch schwachsinn 
Inerrups sind dafür da das sie ausgeführt werden wenn etwas passiert und 
nicht irgendwann später mal. Es wird lediglich das Flag gesetzt.
#532681
Lesenswert?
• ▲
▼
Mit welchem µC arbeitest Du denn.

Es gibt da einen großen Unterschied.

Ein normaler CLI Befehl sperrt schlichtweg alle Interrupts, bis auf den
NMI (non maskable interrupt) falls vorhanden.

Das was Du innerhalb der ISR meinst, ist wohl das Rücksetzen des 
jeweiligen
InterruptFLags)
Dies soll bedeuten, ich habe den Interrupt erkannt und bearbeitet.
Außerdem schützt er vor dem nächsten gleichen Interrupt.

In manchen ISR wie zum Beispiel bei der seriellen Schnittstelle erzeugen
mitunter versch. Ereignisse einen Interrupt auf dem gleichen I-Vector.
Durch auslesen und rücksetzen dieser Flags kannst Du dann die einzelnen
Ereignisse in der ISR abarbeiten.
Gast #532683
Lesenswert?
• ▲
▼
Grundsätzlich wird erstmal irgendwo ein Flag gesetzt,sobald die 
Interruptbedingung eintritt.Dann wird,sofern Interrupts nicht global 
gesperrt sind,nach der aktuell gerade in Arbeit befindlichen Instruktion 
in den Interrupt verzweigt.

Wie man nun die Interrupt-Kondition wieder los wird ist von Controller 
zu Controller unterschiedlich.Bei einigen muss man ein bestimmtes 
Statusregister lesen,bei anderen auf irgend ein Datenregister 
lesend/schreibend zugreifen und bei wieder anderen genügt wenn die 
Interruptroutine angesprungen wird.

Nun gibt es allerdings auch Controller,wo sich mehrere Module (z.B. 
UART-Empfänger und UART-Transmitter) den selben Interruptvektor 
teilen.In diesem Fall bestünde die Gefahr,das ein Interrupt nicht 
behandelt wird,wenn 2 Interruptbedingungen gleichzeitig eintreten.Von 
daher macht es schon Sinn,wenn man explizit die Bedingung löschen 
muss,da man gezwungen ist zumindest den Fall einzuplanen,das der 
Interrupt auftritt.

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.