Heim

Unterbrechungsroutine

Ein Interrupthandler (auch Unterbrechungsroutine genannt) ist ein Programmstück, das von einer CPU ausgeführt wird, wenn sie durch einen Interrupt Request (oder Unterbrechungsanforderung) gezwungen wird, den normalen Programmablauf zu unterbrechen und einen Interrupt auszuführen.

Ablauf

Innerhalb einer Unterbrechungsroutine geschieht normalerweise folgendes:

Je nachdem, ob das Betriebssystem Multitasking unterstützt und welcher Natur die Behandlung des Interrupts ist, kann es notwendig sein, weitere Unterbrechungen bei der Verarbeitung zu verhindern. Je nach Architektur sieht dies unterschiedlich aus, z. B. wird ein Interruptflag gesetzt.
Um das unterbrochene Programm nicht zu stören, darf es von der zwischengeschalteten Ausführung der Unterbrechungsroutine nichts bemerken. Daher ist dieser Zwischenschritt notwendig. Normalerweise wird der Prozessorzustand auf einem Stapel abgelegt.
Hier wird nun die eigentliche Kernarbeit verrichtet. Beispielsweise legen die meisten Betriebssysteme bei einem Tastendruckinterrupt den Code der Taste in eine Tastenqueue, aus der die Anwendungsprogramme mit den Benutzereingaben gespeist werden.
Die Vorgänge dieser Phase sind zeitkritisch, da Interrupts Vorrang vor dem normalen Ablauf von Anwendungen haben bzw. selbst nicht durch Interrupts unterbrochen werden können. In Echtzeitbetriebssystemen gelten enge Vorgaben, wie lange in dieser Phase verweilt werden darf. In modernen Multitaskinganwendungen ist dies ebenfalls ein wichtiger Faktor, da dem Benutzer die Illusion der Gleichzeitigkeit von Programmabläufen durch andauerndes und schnelles Umschalten zwischen verschiedenen Tasks vermittelt wird.
Falls oben Interrupts verboten wurden, müssen sie nun wieder erlaubt werden.
Der oben gesicherte Zustand wird nun wiederhergestellt.

Merkmale

Aus dem geschilderten Ablauf ergeben sich für Unterbrechungsroutinen drei wichtige Merkmale. Sie sind:

Entsprechend anspruchsvoll ist die Implementierung dieser Routinen. Als Beispiel sei der Linuxkernel genannt, bei dem

  1. ein Großteil der Entwicklung zwischen den Versionen 2.4 und 2.6 in die Möglichkeit floss, möglichst viele Routinen selbst wieder unterbrechbar zu machen und so die Latenzzeit für die Anwendungen zu verkürzen und
  2. ein Fehler in der Abarbeitung eines mathematischen Interrupts (die Unterbrechungsroutine löste selbst einen Interrupt aus, der sie wieder aufrief) bösartigen Programmen die Möglichkeit bot, das System komplett einzufrieren.

Ablaufplan

ISR --> Timer stop(TRx=0) --> Timer vorladen --> Timer start(TRx=1) --> [Zähler=Zähler+1] --> Wenn Zähler = (gewünschter Wert) (1)

(1) --> Nicht (gewünschter Wert) --> RETURN

(1) --> Ja --> ENDE