Interrupt erklärt: Ablauf, IRQ und sichere ISR
Ein Interrupt unterbricht den normalen Programmablauf kurz, damit der Prozessor auf ein wichtiges Ereignis reagieren kann. Er sichert den benötigten Zustand, führt eine Interrupt Service Routine (ISR) aus und setzt danach das unterbrochene Programm fort.
Auf dieser Seite lernst du, warum Interrupts gegenüber Polling nützlich sind, welche Schritte bei einer Unterbrechung ablaufen und worauf eine sichere ISR achten muss.
Hake ab, was du schon kannst — und komm am Ende hierher zurück!
Warum Interrupts statt ständiger Abfragen?
Stell dir vor, ein Prozessor wartet auf einen Tastendruck. Er könnte den Zustand der Tastatur immer wieder abfragen. Dieses Verfahren heißt Polling.
Beim Polling entscheidet das Abfrageintervall über den Zielkonflikt:
- Häufige Abfragen verkürzen die mögliche Reaktionszeit, beanspruchen aber viel Prozessorzeit.
- Seltene Abfragen sparen Prozessorzeit, können ein Ereignis jedoch verspätet erkennen.
Bei einem Interrupt meldet sich das Gerät selbst. Der Prozessor kann bis dahin andere Aufgaben bearbeiten oder in einem energiesparenden Zustand warten.
Interrupt Request
Ein Interrupt Request, kurz IRQ, ist die Unterbrechungsanforderung eines Geräts oder einer anderen Interruptquelle. Der IRQ meldet dem Prozessor: Ein Ereignis muss behandelt werden.
Die Türklingel liefert eine passende Analogie: Mit Klingel arbeitest du weiter, bis ein Besucher ein Signal gibt. Polling wäre das regelmäßige Nachsehen an der Tür. Die Analogie hat eine Grenze: Bei Vorgängen, die ständig überwacht werden müssen, kann regelmäßiges Prüfen sinnvoller sein.
Polling fragt regelmäßig nach einem Ereignis. Bei einem Interrupt meldet die Quelle das Ereignis selbst.
So läuft ein Hardware-Interrupt ab
Ein Hardware-Interrupt wird durch ein externes, zeitlich nicht genau vorhersehbares Ereignis ausgelöst. Beispiele sind ein Tastendruck, eingetroffene Netzwerkdaten, ein abgelaufener Timer oder der Abschluss einer Ein-/Ausgabeoperation.
Der typische Ablauf besteht aus diesen Schritten:
- Ein Gerät oder Timer erzeugt einen IRQ.
- Ein Interrupt-Controller prüft gegebenenfalls Maskierung und Priorität.
- Der Prozessor beendet die gerade laufende Instruktion.
- Er sichert den nötigen Ausführungskontext. Dazu gehören mindestens die Rücksprunginformation und je nach Architektur weitere Register oder Statusinformationen.
- Über einen festen Eintrag oder einen Interruptvektor ermittelt der Prozessor die zuständige ISR.
- Die ISR behandelt das Ereignis, sichert nötige Daten und quittiert die Ursache beziehungsweise löscht das Interrupt-Flag.
- Die gesicherten Register und Statusinformationen werden wiederhergestellt.
- Eine besondere Rückkehranweisung beendet die ISR. Das unterbrochene Programm wird an der passenden Stelle fortgesetzt.
Interrupt Service Routine
Die Interrupt Service Routine, kurz ISR, ist der Programmteil, der ein gemeldetes Ereignis behandelt. Sie wird auch Interrupt-Handler oder Unterbrechungsroutine genannt.
Der Stack ist dabei ein Speicherbereich für vorübergehend gesicherte Rücksprung- und Kontextinformationen. Ohne korrekte Sicherung könnte das Hauptprogramm nach der ISR mit veränderten Registern weiterlaufen und schwer nachvollziehbare Fehler erzeugen.
Du drückst eine Taste, während der Prozessor ein anderes Programm ausführt:
- Der Tastaturcontroller meldet einen IRQ.
- Der Prozessor beendet seine aktuelle Instruktion und sichert den benötigten Zustand.
- Er startet die ISR des Tastaturtreibers.
- Die ISR liest die bereitgestellte Eingabe und bestätigt das Ereignis.
- Nach der Rückkehr stellt der Prozessor den alten Zustand wieder her und setzt das zuvor laufende Programm fort.
Der entscheidende Gedanke: Nicht das Anwendungsprogramm muss die Tastatur ununterbrochen abfragen. Die Hardware macht durch den IRQ auf die Eingabe aufmerksam.
Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.
Eine Interruptquelle sendet einen . Der Prozessor sichert den benötigten Kontext häufig auf dem . Anschließend läuft die . Vor der Rückkehr muss die Ursache bestätigt oder das Interrupt-Flag werden.
Hardware-Interrupt, Softwareinterrupt oder Exception?
Nicht jede interruptähnliche Unterbrechung kommt von einem Gerät.
- Ein Hardware-Interrupt entsteht durch ein externes Ereignis. Sein Zeitpunkt ist zum laufenden Programm asynchron, also nicht an eine bestimmte Programmanweisung gebunden.
- Ein expliziter Softwareinterrupt wird absichtlich durch einen Programmbefehl ausgelöst. Betriebssysteme können einen solchen Mechanismus beispielsweise für Systemaufrufe verwenden.
- Eine Exception entsteht durch ein von der CPU erkanntes Ereignis, etwa eine Division durch null, eine verbotene Instruktion oder einen unerlaubten Speicherzugriff.
Diese Fälle können ähnliche Mechanismen für Kontextwechsel und Handleraufruf verwenden. Ihre Auslöser sind jedoch verschieden.
Wie Maskierung und Priorität zusammenarbeiten
Mehrere Geräte können fast gleichzeitig eine Unterbrechung anfordern. Deshalb muss das System entscheiden, welche Anforderung zuerst behandelt wird.
Ein Interrupt-Controller sammelt Anforderungen verschiedener Quellen. Er kann sie priorisieren, einzeln sperren und dem Prozessor eine Interruptnummer beziehungsweise einen Vektor liefern. Der Vektor führt nicht zwingend direkt zur Einsprungadresse; er kann auch einen Eintrag in einer Tabelle auswählen, in dem die Handleradresse steht.
Maskierung bedeutet, dass bestimmte Interruptanforderungen vorübergehend nicht angenommen werden. Ein maskierbarer Interrupt kann beispielsweise während eines besonders kritischen Ablaufs zurückgestellt werden.
Ein nicht maskierbarer Interrupt (NMI) ist für besondere Ereignisse wie schwerwiegende Hardwarefehler oder einen drohenden Stromausfall vorgesehen. Er lässt sich nicht wie ein gewöhnlicher maskierbarer IRQ unterdrücken.
Priorität beantwortet eine andere Frage als Maskierung:
- Maskierung: Darf diese Anforderung momentan behandelt werden?
- Priorität: Welche der zugelassenen Anforderungen kommt zuerst?
Besitzt ein Prozessor nur einen gemeinsamen IRQ-Eingang, muss die Software prüfen, welche Quelle den Interrupt ausgelöst hat. Bei vektorisierten Interrupts kann eine Kennung direkt zum passenden Tabelleneintrag führen.
Ein Timer und eine Netzwerkschnittstelle melden gleichzeitig ein Ereignis. Der Controller prüft zunächst, ob beide Quellen freigegeben sind. Danach wählt er anhand der festgelegten Priorität eine Anforderung aus. Nach ihrer Behandlung kann die noch anstehende Anforderung folgen.
Eine höhere Priorität bedeutet dabei nicht, dass andere Ereignisse unwichtig sind. Eine lange Behandlung kann niedrigere Prioritäten verzögern und im ungünstigen Fall zum Überlaufen eines Gerätepuffers führen.
So bleibt eine ISR sicher und kurz
Eine ISR unterbricht andere Arbeit. Deshalb soll sie nur die zeitkritische Behandlung erledigen und aufwendige Weiterverarbeitung möglichst vorbereiten oder an einen normalen Task übergeben.
In einer ISR solltest du insbesondere vermeiden:
- blockierende Wartefunktionen;
- Endlosschleifen;
- langsame oder ungeeignete System- und Bibliotheksaufrufe;
- Operationen wie
printf,mallocodernew, wenn sie nicht ausdrücklich für den ISR-Einsatz geeignet sind.
Außerdem muss die ISR die Interruptursache quittieren oder das zugehörige Flag löschen. Geschieht das nicht, kann dieselbe Anforderung sofort erneut auftreten oder der Controller weitere Meldungen dieser Quelle zurückhalten.
Gemeinsame Daten brauchen besondere Aufmerksamkeit
Ein externer Interrupt kann das Hauptprogramm an einer kaum vorhersehbaren Stelle unterbrechen. Greifen Hauptprogramm und ISR auf dieselben Daten zu, kann das Ergebnis von der Ausführungsreihenfolge abhängen. Das nennt man Race Condition.
Das Hauptprogramm liest eine gemeinsam verwendete Variable und will sie danach verändern. Genau zwischen Lesen und Schreiben tritt ein Interrupt auf. Die ISR verändert dieselbe Variable. Wenn anschließend das Hauptprogramm mit seinem alten gelesenen Wert weitermacht, kann die Änderung der ISR verloren gehen.
Die sichere Lösung hängt von Prozessor, Betriebssystem und Datenzugriff ab. Entscheidend ist, den gemeinsamen Zugriff als kritischen Bereich zu erkennen und mit einem passenden Synchronisationskonzept zu schützen.
Werden Interrupts bereits innerhalb einer ISR wieder freigegeben, kann eine höher priorisierte ISR dazwischenlaufen. Auch ein erneuter Eintritt in dieselbe Routine ist je nach System möglich. Eine ISR muss für eine solche Verschachtelung ausdrücklich ausgelegt sein.
Eine gute ISR sichert den benötigten Kontext, behandelt nur das Dringende, bestätigt die Ursache und kehrt kontrolliert zurück.
Interrupts im System beurteilen
Interrupts sind besonders nützlich, wenn Ereignisse unregelmäßig auftreten oder schnell gemeldet werden müssen. Dazu gehören Eingaben, empfangene Daten, abgeschlossene Geräteoperationen, Fehler und Timerereignisse.
Polling kann trotzdem passend sein, wenn ein Zustand ohnehin regelmäßig geprüft wird, die Schleife kurz und vorhersagbar ist oder zusätzliche Interrupttechnik nicht benötigt wird. Die Wahl hängt also von Reaktionszeit, Prozessorbelastung und Systemaufbau ab.
Auch Interrupts verursachen Aufwand: Der Kontext muss gesichert und wiederhergestellt werden, Prioritäten müssen sinnvoll gewählt sein und lange ISRs können andere Arbeit verzögern. Sie beseitigen Nebenläufigkeitsprobleme nicht, sondern können sie durch unvorhersehbare Unterbrechungsstellen sichtbar machen.
Interruptlatenz bezeichnet die Zeit zwischen einer Unterbrechungsanforderung und dem Beginn ihrer Verarbeitung. Sie hängt unter anderem von der Hardware, der Maskierung und bereits laufenden, höher priorisierten Behandlungen ab.
Karteikasten
Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.
Alles auf einen Blick
- Interrupt
- Auslöser
- Hardwareereignis
- Softwarebefehl
- CPU-Exception
- Ablauf
- IRQ prüfen
- Kontext sichern
- ISR ausführen
- Ursache quittieren
- Kontext wiederherstellen
- Steuerung
- Maskierung
- Priorität
- Interruptvektor
- sichere ISR
- kurz bleiben
- nicht blockieren
- gemeinsame Daten schützen
- Auslöser
Abschluss-Check
Du beherrschst das Grundmodell, wenn du zu einem Ereignis den Weg IRQ → Prüfung → Kontextrettung → ISR → Quittierung → Rückkehr erklären und die Wahl zwischen Polling und Interrupt begründen kannst.
Mit Google fortfahren