Was ist ein Interrupt?

"Interrupt" heißt ins Deutsche übersetzt "Unterbrechung"

Als Analogie zu Interrupts eines Microcontrollers kann man sich z.B. einen Mitarbeiter in der Technischen Entwicklung vorstellen, der an seinem Projektauftrag arbeitet (Hauptprogramm). Nun kommt es vor, dass der Vorgesetzte ins Büro kommt und eine wichtige Aufgabe übergibt, die unmittelbar zu erledigen ist. Das bedeutet der Mitarbeiter muss die Arbeit an seinem Projektauftrag unterbrechen, merkt sich aber an welcher Stelle er aufgehört hat (Interrupt). Nach der Abarbeitung der zwischengeschobenen Aufgabe steigt er an diesem Punkt wieder ein.

Interrupts werden für zeitkritische Anwendungen, bei Eintreten eines bestimmten Ereignisses, verwendet. Die technisch unkomplizierteste Lösung wäre dauerhaft auf das Ereignis zu warten, also eine dauerhafte bzw. regelmäßige Zustandsabfrage durchzuführen. Im Analogon würde das heißen, dass der Mitarbeiter regelmäßig zu seinem Vorgesetzten laufen würde um zu prüfen ob ein wichtiger Termin ansteht. In der Microcontrollertechnik wird dies als "Polling" bezeichnet. Diese Lösung hat den großen Nachteil, dass der Mitarbeiter seine alltägliche Arbeit stark vernachlässigen würde. Außerdem könnte er auch einen wichtigen Termin verpassen, wenn er nicht zum richtigen Zeitpunkt im Büro des Chefs vorbeischaut. Deshalb können Microcontroller ohne aktive Abfrage im Programm auf ein Ereignis reagieren. Das aktuell laufende Programm A wird abgebrochen und ein anderes Programm B (die sog. Interrupt Service Routine) ausgeführt. Anschließend kehrt der Controller selbstständig an den Punkt im Programm A zurück, an dem der Interrupt aufgetreten ist.


Interrupts (d.h. Unterbrechungsanforderungen) werden im Mikrocontroller beispielsweise ausgelöst durch:

  • Pegeländerung an deinem bestimmten PIN,
  • Erreichen eines bestimmten Zählerstandes im Timer,
  • Beendigung einer seriellen Übertragung oder Analog-Digital-Wandlung.

Wenn eine Unterbrechungsanforderung registriert wird, wird ein Interruptflag in einem Statusregister gesetzt. Durch das Setzen dieses Interruptflags wird von dem Anwendungsprogramm in die Interrupt Service Routine (ISR), die ein Unterprogramm darstellt, gesprungen. Durch diesen Sprung wird das Interruptflag wieder gelöscht. Ist die ISR beendet, kehrt das Programm an die ursprüngliche Stelle im Anwendungsprogramm zurück.

In dieser ISR kann im einfachsten Fall z.B. über eine dort angesteuert Lampe angezeigt werden, dass das Ereignis, das den Interrupt auslöst, eingetreten ist. Würde dies nicht über einen Interrupt abgefragt werden, müsste der Zustand im Hauptprogramm regelmäßig abgefragt werden (Polling), was die oben genannten Nachteile mit sich bringt.

Abb.: Veranschaulichung Interrupts; Quelle: BBS2 Wolfsburg

Wichtige Eigenschaften

Interrupts können an einem beliebigen Punkt im Anwendungsprogramm auftreten.

ISRs sind möglichst kurz zu halten; im Allgemeinen sollten sie aber kürzer sein als das Anwendungsprogramm, damit sichergestellt ist, dass keine Interrupts verschluckt werden können. Komplizierte Berechnungen, Auswertungen, Warteschleifen oder größere Ausgaben sollten nicht innerhalb von ISRs verwendet werden. Sinnvolle Funktionsinhalte wäre beispielsweise die Übergabe von Parametern.


Unterschied zu Unterprogrammen

Auch wenn ISR ähnlich wie ein Unterprogramm (Funktion) zu programmieren ist, gibt es einige entscheidende Unterschiede.

  • Die ISR wird anders als ein UP nicht durch einen Aufruf aus einem anderen Programmteil gestartet, sondern durch ein Ereignis.
  • ISR müssen durch entsprechende Anweisungen im Programm zunächst freigegeben sein, damit sie durchlaufen werden können.

Zuletzt geändert: Dienstag, 22. Februar 2022, 11:15