Interrupt

Ein Interrupt ist eine gezielt ausgelöste Unterbrechung in einem Computerprogramm. Er wird von einem internen oder extenen Ereignis ausgelöst. Ein Interrupt unterbricht dann das laufende Hauptprogramm und führt die jeweilige Unterbrechungsbehandlungsroutine (Interrupt Service Routine) aus. Nach Ende der Interrupt Service Routine wird das Hauptprogramm an der Stelle weiter ausgeführt, an der es unterbrochen wurde.

Die Verarbeitung von Interrupts ist gerade für Echtzeitanwendungen sehr wichtig.

Unterschiede zu Unterprogrammaufrufen

Interrupts sind ähnlich wie Unterprogrammaufrufe. Der Prozessor springt an eine bestimmte Adresse und führt den dortigen Programmcode aus. Nach dem Ausführen folgt der Rücksprung.

Allerdings unterscheiden sich Interrupts von Unterprogrammen in folgenden Punkten.

– Interrupts werden ausgelöst durch ein Ereignis, nicht über einen Aufrufbefehl im Code

– Der Aufruf erfolgt losgelöst vom Programmcode, somit asynchron zum laufenden Programm

– Die Sprungadresse zur Interrupt Service Routine wird je nach Ereignis vom Prozessor ermittelt und ist nicht Teil des Sprungbefehls.

Interrupt-Auslöser

Interrupts werden von Ereignissen ausgelöst. Man unterscheidet in 4 Unterbrechungsquellen:

– durch interne Komponenten

z.B. durch einen AD Wander, Zähler, Timer, etc.

– durch externe Komponenten

durch so genannte Interrupteingänge. Diese ermöglichen externen Komponenten einen Interrupt auszulösen

– durch Ausnahmesituationen im Prozessorkern

Behandlung außergewöhnlicher Fehlersituationen, z.B. ungültiger Befehlscode, Division durch 0, etc.

– durch das laufende Programm selbst

mit Befehlen wie z.B. Break.

Interrupt-Steuerung

Software-Interrupts sind Unterprogrammaufrufe, deren Adressen in einer z.B. vom Betriebssystem verwalteten Tabelle stehen, also nicht wie normale Unterprogrammadressen vom Compiler erzeugt werden.

Die eigentliche Aufgabe der Interrupt-Steuerung ist das Erkennen von Unterbrechungsanforderungen und das zuordnen der Anforderung zum auslösenden Ereignis, um so die richtige Interrupt Service Routine anzuspringen. Dies geschieht mit den so genannten Interruptvektoren, die im Grunde nur eine Kennung des auslösenden Ereignisses sind und somit stellvertretend die Sprungadresse angeben.

Die Zuordnung von Ereignis und Interruptvektor kann variabel oder fest sein. Im Mikrocontrollerbereich ist sie jedoch meist fest.

Da es vorkommen kann, dass 2 Interrupts gleichzeitig ausgelöst werden sollen, bzw. ein anderer ausgelöst wird während sich der Prozessor gerade in einer anderen Interrupt Service Routine befindet, ist es möglich, Prioritäten zu verteilen.

Reaktion auf Unterbrechungen

Die Reaktionszeit auf Unterbrechungen ist bei Echtzeitanwendungen eine wichtige Größe.

Da aber vor dem ausführen der Interrupt Service Routine das Sichern des Prozessorkernstatus (Register, etc.) einige Zeit in Anspruch nehmen kann, verfügen manche Mikrocontroller über mehrere Registersätze die beim Interrupt gewechselt werden. Somit wird eine verbesserte Reaktionszeit erreicht, da keine Sicherung gemacht werden muss. Ein schnellerer Kontextwechsel ist möglich.

Einrichten eines Interrupts

Folgende Dinge müssen durchgeführt werden, um einen Interrupt-Aufruf in einem Programm zu ermöglichen:

– Interrupt in der Resource freischalten (z.B. im AD Wandler)

– Interruptlevel im Interrupt Controller setzen

– Interrupts generell zulassen und einstellen ab welchem Level sie zugelassen werden

– Definition der Interrupt Service Routine und der Interrupt-Vektoren

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert