Interrupts und Ausnahmen: Arten von Interrupts. Interrupt-Behandlung, Interrupt-Vektoren, Software-Interrupts, IRQ-Interrupt-Vektor

Das Betriebssystem wird weitgehend durch das Interrupt-System gesteuert. Im Real-Modus gibt es zwei Arten von Interrupts: Hardware und Software. Software-Interrupts werden mit dem Befehl int initialisiert. Hardware – externe Ereignisse, die in Bezug auf das laufende Programm asynchron sind. Normalerweise werden Hardware-Interrupts von der E/A-Hardware initiiert, nachdem der aktuelle Vorgang abgeschlossen ist.

Um Interrupts im Real-Modus zu verarbeiten, verwendet der Prozessor eine Interrupt-Vektortabelle. Die zum Auffinden von Interrupt-Routinen verwendeten Segmentadressen werden Interrupt-Vektoren genannt.

Die Interrupt-Vektortabelle befindet sich ganz am Anfang des OP, d.h. seine physikalische Adresse = 0. Die Interrupt-Vektortabelle besteht aus 256 Elementen zu je 4 Bytes. Vektoren bestehen aus einer 16-Bit-Segmentadresse und einem 16-Bit-Offset (zuerst kommt der Offset und dann das Segment). Jeder Interrupt-Vektor hat eine eigene Nummer, die sogenannte Interrupt-Nummer, die seinen Platz in der Tabelle angibt. Diese Zahl, multipliziert mit 4, ergibt die absolute Adresse des Speichervektors.

Interrupt-Vektoren erhalten ihre Werte beim Systemstart. Erstens legt das BIOS bei der Durchführung von Initialisierungsvorgängen die Werte bestimmter Interrupt-Vektoren fest. Beim Booten von DOS werden den DOS-Interrupt-Vektoren Werte zugewiesen.

DOS weist seinen Routinen möglicherweise einige der BIOS-Vektoren neu zu. Der Benutzer kann auch die Interrupt-Vektorwerte ändern. Wenn ein Software- oder Hardware-Interrupt auftritt, Aktuellen Zustand CS:IP-Register sowie die Werte des Flag-Registers werden in den Programmstapel geschrieben. Als nächstes werden neue CS:IP-Werte aus der Interrupt-Vektortabelle ausgewählt. In diesem Fall wird die Kontrolle an die Interrupt-Behandlungsprozedur übergeben.

Vor Beginn der Interrupt-Behandlungsprozedur werden das TF-Trace-Flag und das IF-Interrupt-Aktivierungsflag zwangsweise gelöscht. Nach Abschluss der Interrupt-Verarbeitung muss die Prozedur den IRET-Befehl ausgeben, der die Werte der CS:IP-Register und des Flag-Registers aus dem Stapel entfernt. Anschließend wird die Ausführung des unterbrochenen Programms fortgesetzt.

Die Interrupt-Behandlungsprozedur muss mit der IRET-Prozedur enden, wonach die Werte von Flags, CS, IP gelesen werden.

Interrupt – ein Ereignis, das eine sofortige Reaktion des Prozessors erfordert. Die Reaktion besteht darin, dass der Prozessor die Verarbeitung des aktuellen Programms unterbricht ( unterbrochenes Programm) und fährt mit der Ausführung eines anderen Programms fort ( Programm unterbrechen), speziell für diese Veranstaltung konzipiert. Nach Abschluss dieses Programms kehrt der Prozessor zur Ausführung des unterbrochenen Programms zurück.

Jedes Ereignis, das eine Unterbrechung erfordert, wird begleitet von Unterbrechungssignal, benachrichtigte den Computer darüber und rief an Unterbrechungsanforderung.

Programmstatus stellt eine Menge von Zuständen aller Speicherelemente zum entsprechenden Zeitpunkt dar (z. B. nachdem der letzte Befehl ausgeführt wurde). Wenn ein Interrupt auftritt, speichert der Mikrocontroller den Inhalt des Programmzählers auf dem Stapel und lädt die Adresse des entsprechenden Interrupt-Vektors hinein. Der letzte Befehl der Interrupt-Serviceroutine muss ein Befehl sein, der zum Hauptprogramm zurückkehrt und den zuvor gespeicherten Programmzähler wiederherstellt. Während der Interrupt-Handler ausgeführt wird, können sich einige Informationen ändern. Daher ist es beim Wechsel zum Interrupt-Handler erforderlich, die geänderten Elemente zu speichern. Die Menge solcher Elemente ist Programmzustandsvektor. In diesem Fall sind andere Informationen über den Zustand der Speicherzellen nicht von Bedeutung oder können programmgesteuert wiederhergestellt werden.

Anfangszustandsvektor enthält alle notwendigen Informationen für den ersten Start des Programms. In vielen Fällen enthält der Anfangszustandsvektor nur ein Element – ​​die Startadresse des zu startenden Programms.

Unterbrechungsvektor ist der Vektor des Anfangszustands des unterbrechenden Programms (Handler) und enthält alle notwendigen Informationen zum Wechseln zum Handler, einschließlich seiner Startadresse. Jeder Interrupt-Typ verfügt über einen eigenen Interrupt-Vektor, der die Ausführung des entsprechenden Handlers initiiert. Typischerweise werden Interrupt-Vektoren an speziell zugewiesenen festen Speicherplätzen mit kurzen Adressen gespeichert, die darstellen Interrupt-Vektortabelle. Um zum entsprechenden Interrupt-Programm zu springen, muss der Prozessor über einen Interrupt-Vektor und die Adresse dieses Vektors verfügen. An dieser Adresse steht in der Regel ein unbedingter Sprungbefehl zum Interrupt-Handling-Unterprogramm.

Die Steuerung des Speicherns und Zurückgebens wird in der Regel dem Interrupt-Handler übertragen. In diesem Fall besteht der Handler aus drei Teilen – dem vorbereitenden (Prolog) und dem abschließenden (Epilog), die den Programmwechsel sicherstellen, und dem eigentlichen Unterbrechungsprogramm, das die von der Anfrage angeforderten Operationen ausführt. Die Reaktionszeit ist definiert als das Zeitintervall vom Eingang einer Interrupt-Anforderung bis zum Beginn der Ausführung des unterbrechenden Programms.


t p– Reaktionszeit des Systems auf Unterbrechung;
t z– Zeit zum Speichern des Status des unterbrochenen Programms;
t ppr– Zeitpunkt des eigentlichen Unterbrechungsprogramms;
Zinn– Zeit, den Zustand des unterbrochenen Programms wiederherzustellen

Bei mehreren Anfragequellen muss eine bestimmte Reihenfolge zur Bearbeitung eingehender Anfragen festgelegt, genannt, werden vorrangige Beziehungen oder Servicedisziplin. Die Menge aller möglichen Prozessor-Interrupt-Typen ist Interrupt-System Mikrocontroller. Die Servicedisziplin legt fest, welche von mehreren gleichzeitig eingehenden Anfragen zuerst bearbeitet wird und ob dieser oder jener Interrupt-Handler das Recht hat, diese Anfrage zu unterbrechen.
Wenn während der Interrupt-Bearbeitung eine Interrupt-Anfrage mit mehr eintrifft hohes Level Priorität wird die Steuerung an den Interrupt-Handler mit höherer Priorität übertragen, während der Interrupt-Handler mit niedrigerer Priorität ausgesetzt wird. Entsteht Verschachtelung unterbrechen. Die maximale Anzahl von Programmen, die sich gegenseitig anhalten können, wird aufgerufen Tiefe der Unterbrechungen.

Wenn die Unterbrechungsanforderung nicht bearbeitet wird, wenn eine neue Anforderung von derselben Quelle (gleicher Priorität) eintrifft, dann Unterbrechen Sie die Systemsättigung. In diesem Fall gehen einige Interrupt-Anfragen verloren, was für den normalen Betrieb des Mikrocontrollers nicht akzeptabel ist.

Eigenschaften des Interrupt-Systems Sind:

  • Gesamtzahl der Interrupt-Anfragen Anzahl der Quellen von Interrupt-Anfragen;
  • Interrupt-Darstellungstyp – in der Regel wird eine Interrupt-Anfrage durch einen logischen Signalpegel dargestellt;
  • Unterbrechungspriorität – legt die Reihenfolge fest, in der jede Unterbrechungsanforderung verarbeitet wird. Je höher die Priorität, desto kürzer ist die Verzögerung bei der Ausführung des Unterbrechungsprogramms.
  • Reaktionszeit – das Zeitintervall zwischen dem Erscheinen der Unterbrechungsanforderung und dem Beginn der Ausführung des unterbrechenden Programms;
  • Unterbrechungsverzögerung – bestimmt durch die Gesamtzeit zum Speichern und Wiederherstellen des Programms;
  • Tiefe stimmt normalerweise mit der Anzahl der Prioritätsstufen im Interrupt-System überein;
  • Systemsättigung unterbrechen;
  • zulässige Momente der Programmunterbrechung (normalerweise das Ende der Ausführung des nächsten Befehls).

Maskierung unterbrechen Wird verwendet, um den Mikrocontroller anzuweisen, auf jede Art von Interrupt zu reagieren oder ihn zu ignorieren. Die Interrupt-Maske stellt einen Binärcode dar, dessen Bits den Quellen der Interrupt-Anfrage zugeordnet sind. Das eine Bit im Binärcode weist den Mikrocontroller an, diese Art von Interrupt zu verarbeiten. Ein Nullbit hingegen erlaubt dem Mikrocontroller nicht, mit der Verarbeitung von Interrupts des angegebenen Typs fortzufahren.
In der Regel gibt es neben der Maskierung von Interrupts auch ein globales Interrupt-Enable-Bit, dessen Nullwert alle Interrupt-Handler deaktiviert (außer Hardware-Reset und Sprung zum Anfang des ausführenden Programms).
Zusätzlich zum Interrupt-Masken-Binärcode gibt es auch einen Binärcode Interrupt-Flags, wodurch der Interrupt-Handler die Quelle des Interrupts festlegen kann, wenn im Mikrocontroller mehrere Quellen mit der angegebenen Anforderung vorhanden sind.

Um Ereignisse zu verarbeiten, die asynchron zur Programmausführung auftreten, ist der Interrupt-Mechanismus am besten geeignet. Eine Unterbrechung kann als ein besonderes Ereignis im System betrachtet werden, das eine sofortige Reaktion erfordert.

Fast alle Eingabe-/Ausgabesysteme in einem Computer arbeiten mit Interrupts. Insbesondere wenn Sie Tasten drücken oder mit der Maus klicken, generiert die Hardware Interrupts. Als Reaktion darauf liest das System entsprechend den Code der gedrückten Taste oder merkt sich die Koordinaten des Mauszeigers. Interrupts werden vom Festplattencontroller und Adapter generiert lokales Netzwerk, serielle Schnittstellen, Audioadapter und andere Geräte.

Es scheint klar, dass verschiedenste Unterbrechungen aus unterschiedlichen Gründen möglich sind. Daher ist einer Unterbrechung eine Nummer zugeordnet – die sogenannte Unterbrechungsnummer.

Diese Nummer entspricht eindeutig einem bestimmten Ereignis. Das System kann Interrupts erkennen und startet bei ihrem Auftreten eine Prozedur entsprechend der Interrupt-Nummer.

Einige Interrupts (die ersten fünf in numerischer Reihenfolge) sind für die Verwendung durch die CPU im Falle besonderer Ereignisse wie dem Versuch einer Division durch Null, eines Überlaufs usw. reserviert.

Programme können selbst Interrupts mit einer bestimmten Anzahl verursachen. Dazu verwenden sie den INT-Befehl. Dabei handelt es sich um sogenannte Software-Interrupts. Software-Interrupts sind nicht asynchron, da sie innerhalb des Programms aufgerufen werden.

Software-Interrupts sind praktisch, um den Zugriff auf einzelne Funktionen zu organisieren, die allen Programmen gemeinsam sind. Beispielsweise sind Betriebssystemfunktionen für Anwendungsprogramme über Interrupts zugänglich. Beim Aufruf dieser Module ist es nicht erforderlich, ihre aktuelle Adresse im Speicher zu kennen.

Anwendungsprogramme und Treiber können ihre eigenen Interrupt-Handler zur späteren Verwendung durch andere Programme installieren. Dazu müssen integrierte Interrupt-Handler speicherresident sein.

Hardware-Interrupts werden durch physische Geräte verursacht und treten daher asynchron in Bezug auf die Ausführung von Programmen auf. Diese Interrupts informieren das System über Ereignisse im Zusammenhang mit dem Gerätebetrieb. Zum Beispiel, dass der Drucker endlich mit dem Drucken eines Zeichens fertig ist und es schön wäre, das nächste Zeichen zu drucken, oder dass ein Festplattensektor bereits gelesen wurde und sein Inhalt dem Programm zur Verfügung steht.

Durch die Verwendung von Interrupts beim Arbeiten mit langsamen externen Geräten können Sie E/A mit der Datenverarbeitung im Zentralprozessor kombinieren. Dies führt zu einer verbesserten Gesamtsystemleistung.

Manchmal ist es wünschenswert, das System gegenüber allen oder einzelnen Hardware-Interrupts unempfindlich zu machen. Dazu nutzen sie die sogenannte Interrupt-Maskierung, auf die wir später noch eingehen werden. Es gibt aber auch einen nicht maskierbaren Interrupt (der übrigens immer noch maskiert, genauer gesagt, blockiert werden kann).

Beachten Sie, dass Interrupt-Handler selbst Software-Interrupts aufrufen können, um beispielsweise Zugriff auf einen BIOS- oder MS-DOS-Dienst zu erhalten.

Zusammenstellung eigene Programme Die Interrupt-Verarbeitung und das Ersetzen von Standard-MS-DOS- und BIOS-Handlern ist eine ziemlich komplexe Aufgabe. Dabei müssen alle Feinheiten der Gerätebedienung sowie das Zusammenspiel von Software und Hardware berücksichtigt werden. Beim Debuggen kann es zu einer Zerstörung des Betriebssystems mit unvorhersehbaren Folgen kommen. Sie müssen daher sehr vorsichtig sein, was Ihr Programm tut.

4.1. Interrupt-Vektortabelle

Um die Adresse des Interrupt-Handlers mit der Interrupt-Nummer zu verknüpfen, wird eine Tabelle von Interrupt-Vektoren verwendet, die das erste Kilobyte RAM belegt. Diese Tabelle liegt im Adressbereich von 0000:0000 bis 0000:03FFh und besteht aus 256 Elementen – Fernadressen von Interrupt-Handlern.

Die Einträge in der Interrupt-Vektortabelle werden Interrupt-Vektoren genannt. Das erste Wort des Tabellenelements enthält die Offset-Komponente und das zweite Wort enthält die Segmentkomponente der Interrupt-Handler-Adresse.

Interrupt-Vektor Nummer 0 befindet sich an der Adresse 0000:0000, Interrupt-Vektor Nummer 1 an Adresse 0000:0004 usw.

Für einen Programmierer, der die Sprache C verwendet, kann die Interrupt-Vektortabelle wie folgt beschrieben werden:

void (far* interrupt_table)();

Die Tabelleninitialisierung wird teilweise durch das BIOS-Basis-Ein-/Ausgabesystem nach dem Hardwaretest und vor Beginn des Betriebssystemladevorgangs und teilweise beim Laden von MS-DOS durchgeführt. Das MS-DOS-Betriebssystem kann einige vom BIOS festgelegte Interrupt-Vektoren ändern.

Lassen Sie uns über den Zweck der wichtigsten Interrupt-Vektoren sprechen.

Nummer Beschreibung
0 Divisionsfehler: Wird automatisch nach der Ausführung eines DIV- oder IDIV-Befehls ausgelöst, wenn die Division zu einem Überlauf führt (z. B. Division durch 0). Normalerweise zeigt MS-DOS bei der Verarbeitung dieses Interrupts eine Fehlermeldung an und stoppt die Programmausführung. In diesem Fall verweist die Rücksprungadresse beim i8086-Prozessor auf den Befehl, der dem Divisionsbefehl folgt, und beim i80286-Prozessor und älteren Modellen auf das erste Byte des Befehls, der den Interrupt verursacht hat
1 Interrupt im Schritt-für-Schritt-Modus wird nach der Ausführung jedes Maschinenbefehls generiert, wenn das Schritt-für-Schritt-Ablaufverfolgungsbit TF im Flag-Wort gesetzt ist. Wird zum Debuggen von Programmen verwendet. Dieser Interrupt wird nicht generiert, nachdem Daten mithilfe der MOV- und POP-Anweisungen an Segmentregister gesendet wurden.
2 Nicht maskierbarer Hardware-Interrupt. Dieser Interrupt kann in verschiedenen Maschinen unterschiedlich verwendet werden. Typischerweise wird es generiert, wenn ein Paritätsfehler im RAM vorliegt und wenn ein Interrupt vom Coprozessor angefordert wird
3 Trace-Interrupt. Wird beim Ausführen eines Ein-Byte-Maschinenbefehls mit dem Code CCh generiert und wird häufig von Debuggern verwendet, um einen Haltepunkt festzulegen.
4 Überlauf. Wird vom INTO-Maschinenbefehl generiert, wenn das Überlaufflag OF gesetzt ist. Wenn das Flag nicht gesetzt ist, wird die INTO-Anweisung als NOP ausgeführt. Dieser Interrupt wird zur Fehlerbehandlung bei der Ausführung arithmetischer Operationen verwendet
5 Drucken Sie eine Bildschirmkopie. Wird generiert, wenn der Benutzer eine Taste gedrückt hat In MS-DOS-Programmen wird es normalerweise zum Drucken eines Bildschirmbilds verwendet. Für den i80286-Prozessor und ältere Modelle wird es beim Ausführen des BOUND-Maschinenbefehls generiert, wenn der überprüfte Wert außerhalb des angegebenen Bereichs liegt
6 Undefinierter Opcode oder Befehlslänge größer als 10 Byte
7 Ein Sonderfall Fehlen eines arithmetischen Coprozessors
8
9 IRQ1 – Tastaturunterbrechung. Wird generiert, wenn der Benutzer Tasten drückt und loslässt. Wird zum Lesen von Daten von der Tastatur verwendet
A
B
C
D IRQ5 – Interrupt vom Festplattencontroller (nur für IBM PC/XT-Computer)
E IRQ6 – Interrupt, der vom HDD-Controller nach Abschluss des E/A-Vorgangs generiert wird
F IRQ7 – Interrupt vom Paralleladapter. Wird generiert, wenn der an den Adapter angeschlossene Drucker bereit ist, einen weiteren Vorgang auszuführen. Wird normalerweise nicht verwendet
10 Wartung des Videoadapters
11 Definieren der Konfiguration von Geräten im System
12 Bestimmen der RAM-Größe
13 Wartung des Festplattensystems
14 Arbeiten mit einem asynchronen seriellen Adapter
15 Erweiterter Service
16 Tastaturwartung
17 Druckerwartung
18 Ausführen von BASIC im ROM, falls verfügbar
1A Wachdienst
1B Interrupt-Handler, der auftritt, wenn der Benutzer eine Tastenkombination drückt
1C Software-Interrupt, der vom Hardware-Timer-Interrupt-Handler 18,2 Mal pro Sekunde aufgerufen wird
1D Videotabellenadresse für Videoadapter-Controller 6845
1E Zeiger auf die Diskettenparametertabelle
1F Zeiger auf eine Grafiktabelle für Zeichen mit den ASCII-Codes 128-255
20-5F Wird von MS-DOS verwendet oder ist für MS-DOS reserviert
60-67 Für Benutzerprogramme reservierte Interrupts
68-6F Nicht benutzt
70
71
72 IRQ10 – reserviert
73 IRQ11 – reserviert
74 IRQ12 – reserviert
75
76
77 IRQ15 – reserviert
78 - 7F Nicht benutzt
80-85 Reserviert für BASIC
86-F0 Wird vom BASIC-Interpreter verwendet
F1-FF Nicht benutzt

Die mit IRQ0–IRQ15 bezeichneten Interrupts sind Hardware-Interrupts.

4.2. Maskierung unterbrechen

Bei der Ausführung kritischer Programmabschnitte ist es häufig erforderlich, Interrupts zu deaktivieren, um die unterbrechungsfreie Ausführung einer bestimmten Befehlsfolge sicherzustellen. Dies kann mit dem CLI-Befehl erfolgen. Es muss am Anfang der kritischen Befehlsfolge stehen und am Ende muss ein STI-Befehl stehen, der es dem Prozessor ermöglicht, Interrupts zu akzeptieren. Der CLI-Befehl deaktiviert nur maskierbare Interrupts; dieser Befehl hat keine Auswirkung auf die Verarbeitung nicht maskierbarer Interrupts.

Wenn Sie die Interrupt-Deaktivierung über einen CLI-Befehl verwenden, achten Sie darauf, Interrupts nicht über einen längeren Zeitraum zu deaktivieren, da dies unerwünschte Folgen haben kann. Zum Beispiel auf eine nacheilende Systemuhr oder eine Fehlfunktion von Computerperipheriegeräten.

Wenn Sie nicht alle Interrupts deaktivieren müssen, sondern nur einige, beispielsweise über die Tastatur, müssen Sie hierfür die Dienste eines Interrupt-Controllers nutzen. Durch das Schreiben bestimmter Steuerinformationen auf diesen Controller können Interrupts von einzelnen Geräten maskiert werden.

4.3. Ändern der Interrupt-Vektortabelle

Ihr Programm muss möglicherweise einige Interrupts verarbeiten. Dazu muss das Programm die Vektoren der notwendigen Interrupts auf seinem Handler installieren. Dies kann durch Ändern des Inhalts des entsprechenden Interrupt-Vektortabellenelements erfolgen.

Es ist sehr wichtig, nicht zu vergessen, vor dem Herunterfahren den Inhalt der geänderten Vektoren in der Interrupt-Tabelle wiederherzustellen.

Tatsache ist, dass der dem Programm zugewiesene Speicher nach dem Beenden des Programms freigegeben wird. Es kann beispielsweise zum Herunterladen eines anderen Programms verwendet werden. Wenn Sie vergessen, den Vektor wiederherzustellen, und es zu einem Interrupt kommt, kann das System zusammenbrechen – der Vektor zeigt nun auf einen Bereich, der alles enthalten kann.

Daher sollte die Reihenfolge der Aktionen für nicht residente Programme, die Interrupts verarbeiten möchten, wie folgt sein:

  • Lesen Sie den Inhalt des Interrupt-Vektortabellenelements für den Vektor mit der benötigten Nummer.
  • Merken Sie sich diesen Inhalt (die Adresse des alten Interrupt-Handlers) im Programmdatenbereich.
  • Legen Sie eine neue Adresse in der Interrupt-Vektortabelle fest, sodass sie auf den Anfang Ihrer Interrupt-Routine zeigt.
  • Lesen Sie vor dem Beenden des Programms die Adresse des alten Interrupt-Handlers aus dem Datenbereich und schreiben Sie sie in die Interrupt-Vektortabelle.

Darüber hinaus muss die Änderung des Interrupt-Vektors in dem Sinne kontinuierlich erfolgen, dass während der Änderung keine Unterbrechung auftreten darf. Wenn Sie beispielsweise einen neuen Offsetwert schreiben, aber keine Zeit haben, die Segmentadresse zu aktualisieren, an welche Adresse wird dann die Steuerung im Falle einer Unterbrechung übertragen und was passiert? Darüber kann man nur raten.

MS-DOS-Funktionen zum Arbeiten mit der Interrupt-Tabelle

Um das Ersetzen von Interrupt-Vektoren zu erleichtern, stellt Ihnen MS-DOS spezielle Funktionen zur Verfügung, mit denen Sie ein Element der Interrupt-Vektortabelle lesen und eine neue Adresse darauf schreiben können. Wenn Sie diese Funktionen verwenden, stellt MS-DOS sicher, dass der Vektorersetzungsvorgang korrekt abgeschlossen wird. Sie müssen sich keine Sorgen um die Kontinuität des Interrupt-Vektor-Ersetzungsprozesses machen.

Um den Vektor zu lesen, verwenden Sie die Interrupt-Funktion INT 21h 35h. Vor dem Aufruf muss das AL-Register die Vektornummer in der Tabelle enthalten. Nach Ausführung der Funktion enthalten die ES:BX-Register die erforderliche Adresse des Interrupt-Handlers.

Für die im AL-Register befindliche Vektornummer installiert die Interrupt-Funktion 25h INT 21h einen neuen Interrupt-Handler. Die Adresse des Interrupt-Handlers sollte über die DS:DX-Register übergeben werden.

Natürlich können Sie auch direkt auf die Interrupt-Vektortabelle zugreifen, müssen dann aber beim Schreiben die Interrupts mit dem CLI-Befehl maskieren und daran denken, sie nach dem Schreiben mit dem STI-Befehl zu aktivieren.

Für C-Benutzer stehen die Funktionen _dos_getvect und _dos_setvect zur Verfügung. Die erste Funktion erhält die Adresse aus der Interrupt-Vektortabelle, die zweite legt eine neue Adresse fest. Beide Funktionen greifen auf die oben beschriebenen INT 21h-Interruptfunktionen 35h und 25h zu.

Was sind die Anforderungen an ein Interrupt-Service-Programm?

Wenn Interrupts häufig auftreten, kann deren Behandlung das Anwendungsprogramm stark verlangsamen. Daher sollte der Interrupt-Handler ein kurzes, schnell laufendes Programm sein, das nur die notwendigsten Aktionen ausführt. Lesen Sie beispielsweise das nächste Zeichen vom Druckeranschluss und schreiben Sie es in den Puffer, erhöhen Sie den Wert eines globalen Interrupt-Zählers usw.

Handlerketten unterbrechen

Wenn Sie einige Ihrer eigenen Aktionen zu den vom Standard-Interrupt-Handler ausgeführten Aktionen hinzufügen müssen, können Sie eine Interrupt-Kette organisieren.

Um eine Interrupt-Kette zu organisieren, müssen Sie die Adresse Ihres Handlers in die Vektortabelle schreiben und nicht vergessen, den vorherigen Inhalt der Tabelle zu speichern. Ihr Handler erhält die Kontrolle über den Interrupt, führt eine Aktion aus und übergibt die Kontrolle dann an den alten Handler.

Sie können es auch anders machen: Ihr Handler ruft den alten Handler als Unterroutine auf und führt ihn nach der Rückkehr vom alten Handler aus zusätzliche Aktionen. Mit anderen Worten: Sie können sowohl vor als auch nach dem Aufruf des alten Handlers eine zusätzliche Verarbeitung einfügen.

Die C-Übersetzerbibliothek verfügt über eine Funktion zum Organisieren einer Interrupt-Kette namens _chain_intr.

Um eine Funktion zu beschreiben, die als Interrupt-Handler fungiert, sollten Sie das Schlüsselwort interrupt verwenden.

Eine solche Funktion endet mit dem Interrupt-Return-Befehl IRET. Für ihn werden automatisch Befehle zum Speichern von Registern am Eingang und zum Wiederherstellen beim Verlassen des Interrupt-Handlers generiert. Ein Beispiel für die Verwendung des Schlüsselworts interrupt zum Definieren einer Interrupt-Verarbeitungsfunktion:

void interrupt far int_funct(...) ( // Interrupt-Handler-Körper)

Die Interrupt-Service-Funktion muss eine Funktion mit großer Reichweite sein, da die Interrupt-Vektortabelle vollständige Adressen im Format enthält<сегмент:смещение>.

Das Schlüsselwort interrupt wird auch zur Beschreibung von Variablen verwendet, die zum Speichern von Interrupt-Vektoren verwendet werden:

void (interrupt (far *oldvect)(...);

Um Ihren eigenen Interrupt-Handler festzulegen, verwenden Sie die Funktion _dos_setvec. Diese Funktion verfügt über zwei Parameter – die Interrupt-Nummer und einen Zeiger auf die neue Interrupt-Verarbeitungsfunktion.

Zum Beispiel:

_dos_setvect(0x16, my_key_intr);

In diesem Beispiel wird ein neuer Interrupt-Handler, my_key_intr, für Interrupt Nummer 16h installiert (ein Software-Interrupt zum Lesen von Daten von der Tastatur).

Wenn Sie die Adresse des alten Interrupt-Handlers anhand seiner Nummer ermitteln müssen, verwenden Sie am besten die Funktion _dos_getvect, die die Interrupt-Nummer als Parameter verwendet und einen dieser Nummer entsprechenden Zeiger auf den Handler zurückgibt.

Zum Beispiel:

old_vector = _dos_getvect(0x16);

Um eine Interrupt-Kette zu organisieren, verwenden Sie die Funktion _chain_intr. Diese Funktion verwendet die Adresse des alten Interrupt-Handlers als Parameter.

BEEPER-Programm

Das BEEPER-Programm (Listing 4.1) ist ein einfaches Beispiel, das die Verwendung aller drei oben aufgeführten Funktionen für die Arbeit mit Interrupts veranschaulicht.

Auflistung 4.1. Datei beeper\beeper.cpp

#enthalten #enthalten #enthalten void main(void); void interrupt far timer(...); void interrupt (far *oldvect)(...); // Variable zum Zählen von Timer-Interrupts, flüchtige lange Ticks; void main(void) ( // Zähler zurücksetzen ticks = 0L; // Merke dir die Adresse des alten Interrupt-Handlers oldvect = _dos_getvect (0x1c); // Setze einen neuen Interrupt-Handler _dos_setvect (0x1c, timer); printf("\ nDer Timer ist eingestellt. Drücken Sie eine beliebige „ “-Taste...\n“); getch(); // Stellen Sie den alten Interrupt-Handler wieder her _dos_setvect (0x1c,oldvect); ) void interrupt far timer(...) ( // Erhöhen der Timer-Interrupt-Zähler tickt++; / / Wenn der Zählerwert ein Vielfaches von 20 ist, // ein Signal an den Computerlautsprecher ausgeben if((ticks % 20) == 0) ( asm mov bx,0 asm mov ax, 0E07h asm int 10h ) // Rufen Sie den alten Interrupt-Handler auf _chain_intr (oldvect) ;

Dieses Programm bettet einen eigenen Timer-Interrupt-Handler ein, der etwa 18,2 Mal pro Sekunde aufgerufen wird. Der integrierte Interrupt-Handler zählt Timer-Interrupts und wenn der Wert des entsprechenden Zählers ein Vielfaches von 20 ist, gibt der Computerlautsprecher einen Piepton aus.

Am Ende der Arbeit neues Programm Der Timer-Interrupt-Handler ruft den alten Handler mithilfe der Funktion _chain_intr auf.

Nach der Installation eines neuen Timer-Interrupt-Handlers wartet das Hauptprogramm darauf, dass der Benutzer eine beliebige Taste drückt. Anschließend wird der alte Inhalt des Interrupt-Vektors wiederhergestellt.

4.4. Merkmale der Hardware-Interrupt-Verarbeitung

Hardware-Interrupts werden von Computergeräten generiert, normalerweise wenn sie Datenaustauschvorgänge abschließen oder wenn sich ihr Zustand ändert. Abhängig vom Gerätetyp kann der Interrupt-Handler bestimmte Funktionen ausführen. Wenn beispielsweise ein Timer unterbrochen wird, erhöht der entsprechende Handler den Inhalt eines Zählers im RAM. Anhand des Inhalts dieses Zählers können Programme die aktuelle Uhrzeit ermitteln.

Im Gegensatz zu Software-Interrupts, die von einem Programm oder Treiber geplant aufgerufen werden, erfolgen Hardware-Interrupts immer asynchron in Bezug auf laufende Programme. Außerdem können mehrere Unterbrechungen gleichzeitig auftreten!

Um sicherzustellen, dass das System bei der Entscheidung, welcher Interrupt zuerst bedient werden soll, nicht verwirrt wird, gibt es ein spezielles Prioritätsschema. Jedem Interrupt wird eine eigene Priorität zugewiesen. Wenn mehrere Interrupts gleichzeitig auftreten, gibt das System dem Interrupt mit der höchsten Priorität den Vorrang und verschiebt die Verarbeitung der verbleibenden Interrupts um eine Weile.

Das Prioritätssystem ist auf zwei Intel 8259 (oder ähnlichen) Chips implementiert. Jeder Chip ist ein Interrupt-Controller und bedient bis zu acht Prioritäten. Chips können kombiniert (kaskadiert) werden, um die Anzahl der Prioritätsstufen im System zu erhöhen.

Die Prioritätsstufen werden mit IRQ0 – IRQ15 abgekürzt.

Auf dem IBM PC/XT-Computer war nur ein Interrupt-Controller-Chip installiert. Die Prioritäten hingen linear von der Interrupt-Level-Nummer ab. Der Interrupt IRQ0 hatte die höchste Priorität, gefolgt von den Interrupts IRQ1, IRQ2, IRQ3 usw.

Der IRQ2-Interrupt auf IBM PC/XT-Computern war für zukünftige Systemerweiterungen reserviert. In IBM PC/AT-Computern wurde der IRQ2-Interrupt verwendet, um zwei 8259-Interrupt-Controller zu kaskadieren. Die zusätzlichen Prioritäts-Interrupt-Ebenen IRQ8 – IRQ15 sind in diesen Computern zwischen den IRQ1- und IRQ3-Interrupts priorisiert.

Hier ist eine Liste der Hardware-Interrupts, sortiert nach absteigender Priorität:

Nummer Beschreibung
8 IRQ0 – Intervall-Timer-Interrupt, tritt 18,2 Mal pro Sekunde auf
9 IRQ1 – Tastaturunterbrechung
A IRQ2 – wird zur Kaskadierung von Hardware-Interrupts verwendet
70 IRQ8 – Echtzeituhr-Interrupt
71 IRQ9 – Interrupt vom EGA-Controller
72 IRQ10 – reserviert
73 IRQ11 – reserviert
74 IRQ12 – reserviert
75 IRQ13 – Interrupt vom arithmetischen Coprozessor
76 IRQ14 – Interrupt vom Festplattencontroller
77 IRQ15 – reserviert
B IRQ3 – Unterbricht den asynchronen Port COM2
C IRQ4 – Unterbricht den asynchronen Port COM1
D IRQ5 – Interrupt vom Festplattencontroller (nur auf IBM PC/XT-Computern)
E IRQ6 – vom HDD-Controller generierter Interrupt
F IRQ7 – Druckerunterbrechung

Aus dieser Liste können Sie ersehen, dass die Intervall-Timer-Interrupts die höchste Priorität haben, gefolgt vom Tastatur-Interrupt. Der Drucker-Interrupt hat die niedrigste Priorität.

Um Prioritätsschemata verwalten zu können, müssen Sie es wissen Interne Organisation 8259 Interrupt-Controller.

Eingehende Interrupts werden im Interrupt Request Register IRR gespeichert. Jedes der acht Bits in diesem Register entspricht einem eigenen Interrupt.

Bevor eine Interrupt-Anfrage an den Prozessor gesendet wird, wird der Inhalt des 8-Bit-IMR-Interrupt-Maskenregisters überprüft. Wenn der Interrupt dieser Ebene nicht maskiert ist, wird eine Interrupt-Anfrage ausgegeben.

Aus Sicht der Interrupt-Controller-Programmierung sind die IMR-Interrupt-Maskenregister und das Interrupt-Steuerregister am interessantesten.

Auf IBM PC/XT-Computern hat das Interrupt-Maskenregister die Adresse 21h und das Interrupt-Steuerregister die Adresse 20h. Bei IBM PC/AT-Computern hat der erste 8259-Controller die gleichen Adressen wie bei IBM PC/XT. Das Interrupt-Maskenregister des zweiten Controllers hat die Adresse A1h, das Interrupt-Steuerregister die Adresse A0h.

Die Bits des Interrupt-Maskenregisters entsprechen IRQ-Nummern. Um einen Hardware-Interrupt auf einer beliebigen Ebene zu maskieren, müssen Sie das Maskenbyte in das Maskenregister schreiben. In diesem Byte sollten die Bits, die maskierbaren Interrupts entsprechen, auf 1 gesetzt werden. Um beispielsweise Interrupts von der Festplatte zu maskieren, muss die Binärzahl 01000000 auf Port 21h geschrieben werden.

Hier ist eine Programmzeile, die eine Unterbrechung von einer Diskette maskiert:

Ausgabe(0x21, 0x40);

Um Interrupts von der Festplatte „wiederzubeleben“, verwenden Sie die folgende Zeile (die alle Interrupts entlarvt):

Ausgabe(0x21, 0);

Bitte beachten Sie, dass wir im obigen Beispiel die Unterbrechung von der Festplatte maskiert haben, alle anderen Geräte funktionierten normal weiter. Wenn wir einen CLI-Maschinenbefehl ausgeben würden, würden alle Hardware-Interrupts deaktiviert. Dies würde beispielsweise dazu führen, dass die Tastatur gesperrt wird.

Noch ein Hinweis zur Hardware-Interrupt-Behandlung.

Wenn Sie den Standard-Hardware-Interrupt-Handler komplett ersetzen, vergessen Sie nicht, am Ende des Programms Byte 20h auf Portadresse 20h (A0h für den zweiten 8259-Controller) zu schreiben. Diese Schritte sind erforderlich, um das ISR Interrupt Service Register zu löschen. In diesem Fall ist die Bearbeitung von Interrupts mit einer niedrigeren Priorität als der gerade bearbeiteten erlaubt.

Wenn Sie den 1-Kanal-Interrupt verarbeiten, ist der obige Zusatz am Ende der Interrupt-Routine nicht erforderlich, da es sich bei diesem Interrupt um Software handelt und er vom Hardware-Timer-Interrupt-Handler aufgerufen wird.

Bevor wir mit dem Studium der Interrupts fertig sind, stellen wir uns die Frage: Ist es möglich, einen nicht maskierbaren Interrupt zu maskieren? Es stellt sich heraus, dass es möglich ist!

Wenn das Interrupt-Signal am nicht maskierbaren Interrupt-Eingang des Prozessors ankommt, kann natürlich nichts unternommen werden – die Unterbrechung wird unweigerlich auftreten. Der Computer verfügt jedoch über Schaltkreise, die den nicht maskierbaren Interrupt-Eingang des NMI-Prozessors blockieren.

Bei einem IBM PC/XT-Computer wird die nicht maskierbare Interrupt-Maskierung durch den Port mit der Adresse 0A0h gesteuert. Wenn Sie 0 hineinschreiben, wird der nicht maskierbare Interrupt deaktiviert, wenn 80h aktiviert ist.

Ebenso wird beim IBM PC/AT die nicht maskierbare Interrupt-Maskierung durch Bit 7 von Port 70h gesteuert. Durch Schreiben des 0ADh-Byte an Port 70h wird der nicht maskierbare Interrupt deaktiviert, und durch Schreiben des 2Dh-Byte wird der Interrupt aktiviert.

Beachten Sie, dass wir nicht maskierbare Unterbrechungen „innerhalb“ des Prozessors nicht deaktivieren. Dies ist per Definition unmöglich.

Vorlesung Nr. 12

Interrupt-System von 32-Bit-Mikroprozessoren ich80 X86.

Betrieb des Interrupt-Systems im Real-Modus

Fragen

1. Interrupt-Konzept

2. Klassifizierung unterbrechen

3. Interrupt-System.

· Hardware

· Systemsoftware unterbrechen

· Interrupt-Vektortabelle

4. Interrupt-Behandlung im Real-Modus

Unterbrechung bedeutet, den Hauptprozess der Datenverarbeitung vorübergehend anzuhalten, um geplante oder ungeplante Aktionen auszuführen, die durch den Betrieb von Hardware oder Software verursacht werden.

Diese. Hierbei handelt es sich um einen Prozess, der den Mikroprozessor vorübergehend auf die Ausführung eines anderen Programms umschaltet und dann zum unterbrochenen Programm zurückkehrt.

Durch Drücken einer Taste auf der Tastatur rufen wir sofort ein Programm auf, das die Taste erkennt und seinen Code in den Tastaturpuffer schreibt, aus dem er von einem anderen Programm gelesen wird. Diese. Für einige Zeit unterbricht der Mikroprozessor die Ausführung des aktuellen Programms und wechselt zum Interrupt-Verarbeitungsprogramm, dem sogenannten. Ö Interrupt-Handler. Nachdem der Interrupt-Handler seine Arbeit abgeschlossen hat, setzt das unterbrochene Programm die Ausführung an der Stelle fort, an der es angehalten wurde.

Die Adresse des Interrupt-Handler-Programms wird aus der Interrupt-Vektortabelle berechnet.

Der Interrupt-Mechanismus wird auf Hardwareebene unterstützt.

Klassifizierung unterbrechen

Abhängig von der Quelle werden Interrupts unterteilt in

· Hardware- entstehen als Reaktion des Mikroprozessors auf ein physikalisches Signal von einem Gerät (Tastatur, Systemuhr, Tastatur, Festplatte usw.) ist der Zeitpunkt des Auftretens dieser Interrupts asynchron, d.h. treten zu zufälligen Zeiten auf;

· Software- werden künstlich mit dem entsprechenden Befehl aus dem Programm aufgerufen ( int ), sind dazu bestimmt, einige Betriebssystemaktionen auszuführen, sind synchron;

· Ausnahmen- sind die Reaktion des Mikroprozessors auf eine nicht standardmäßige Situation, die während der Ausführung eines Programmbefehls im Mikroprozessor aufgetreten ist (Division durch Null, Unterbrechung durch Flag). TF (Spur)).

Allgemeine Klassifizierung von Interrupts

· extern- verursacht durch Ereignisse außerhalb des Mikroprozessors

(im Wesentlichen eine Gruppe von Hardware-Interrupts) Es gibt keine verschachtelten Interrupts!

· intern- während des Rechenvorgangs innerhalb des Mikroprozessors entstehen (im Wesentlichen handelt es sich hierbei um Ausnahmesituationen und Software-Interrupts).

Externe Interrupts entstehen durch ein Signal von einem externen Gerät.

Externe Interrupts werden unterteilt in entlarvt und getarnt.

Aufgrund der Tatsache, dass es unter den Eingangssignalen des Prozessors zwei spezielle externe Signale gibt, mit deren Hilfe Sie die Ausführung des aktuellen Programms unterbrechen und dadurch den Betrieb des Zentralprozessors umschalten können. Das sind die Signale NMI (kein Maskeninterrupt, nicht maskierbarer Interrupt) und INTR (Interrupt-Anforderung, Interrupt-Anforderung).

Maskierbare Interrupts werden vom Interrupt-Controller auf Anforderung bestimmter Peripheriegeräte generiert. Interrupt-Controller (hergestellt in Form eines speziellen Chips). i8259A) unterstützt acht Prioritätsstufen (Leitungen); Auf jeder Ebene ist ein Peripheriegerät „angehängt“. Maskierbare Interrupts werden oft als Hardware-Interrupts bezeichnet..

Bei PCs beginnend mit IBM PC AT, Basierend auf dem Mikroprozessor i80286 werden zwei Interrupt-Controller i8259A verwendet. Sie sind kaskadiert in Reihe geschaltet, wodurch sich die Anzahl der externen Interrupt-Quellen auf 15 (jeweils 8) erhöht.

bitte beachten Sie . Chip i Der 8259A ist programmierbar.

Nicht maskierbare Interrupts (Sie sagen, dass es eins ist, weil es dem Mikroprozessorausgang zugeführt wird NMI ) initiieren Quellen, die ein sofortiges Eingreifen des Mikroprozessors erfordern.

!

Im realen und geschützten Betriebsmodus des Mikroprozessors erfolgt die Interrupt-Verarbeitung mit grundsätzlich unterschiedlichen Methoden.

Interrupt-System. Unterbrechen Sie die Hardware und Software des Systems

Ein Interrupt-System ist eine Reihe von Software und Hardware, die den Interrupt-Mechanismus implementiert.

ZU Hardware Interrupt-Systeme umfassen:

· Mikroprozessor-Pins- Auf ihnen werden Signale erzeugt, die dem Mikroprozessor mitteilen, dass ein externes Gerät „darauf achten“ soll ( INTR) , entweder dass ein Ereignis eine sofortige Verarbeitung erfordert oder ein katastrophaler Fehler vorliegt(NMI)

INTR - Ausgabe für Eingang Interrupt-Anforderungssignal,

NMI - Ausgabe für Eingang nicht maskierbares Interrupt-Signal

INTA - Ausgabe für freier Tag Signal, das den Empfang eines Interrupt-Signals durch den Mikroprozessor bestätigt (dieses Signal wird an denselben Eingang des 8259A-Controller-Chips gesendet;

· programmierbarer Interrupt-Controller 8259A (zur Erfassung von Interrupt-Signalen von acht verschiedenen externen Geräten;es ist in Form einer Mikroschaltung hergestellt; Normalerweise verwenden sie zwei in Reihe geschaltete Mikroschaltungen, sodass die Anzahl der möglichen Quellen für externe Interrupts bis zu 15 plus einen nicht maskierbaren Interrupt beträgt. er ist es, der die Interrupt-Vektornummer generiert und seinen Datenbus ausgibt);

· externe Geräte (Timer, Tastatur, Magnetplatten usw.)

ZU Software Interrupt-Systeme Der Real-Modus umfasst:

· Interrupt-Vektortabelle .

Belegt das erste Kilobyte des OP (Adressen 00000). h-003FFh) .

Es enthält Adressen (Vektoren – „Vektoren“, weil zwei Werte zur Angabe der Adresse) von Interrupt-Handlern und besteht aus 256 (0..255) Elementen zu je 4 Bytes:

2 Bytes – neuer Wert für das Register IP

2 Bytes – neuer Wert für das Register CS.

Speicherort der Interrupt-Vektortabelle in Prozessoren i80286 und älter wird durch den Registerwert bestimmt IDTR.

Die Interrupt-Vektortabelle wird beim Systemstart initialisiert, kann aber grundsätzlich geändert und verschoben werden.

Jeder Vektor hat seine eigene Nummer und wird Interrupt-Nummer genannt.

· zwei Flaggenim Flaggenregister Flaggen/Flaggen:

IF (Interrupt-Flag) - Interrupt-Flag. Entwickelt, um Hardware-Interrupts zu maskieren (deaktivieren). Wenn WENN=1 , der Mikroprozessor verarbeitet externe Interrupts, wenn = 0, dann ignoriert er sie;

TF (Trace-Flag) - Trace-Flag. Wenn es = 1 ist, wechselt der Mikroprozessor in den Befehl-für-Befehl-Modus. In diesem Modus wird im Mikroprozessor ein interner Interrupt mit der Nummer 1 generiert;

· Anweisungen für die Mikroprozessormaschine: int, in(Überlauf-Interrupt), iret, cli, sti

Interrupt-Behandlung im Real-Modus

erfolgt in drei Schritten:

1) Beendigung des laufenden Programms;

Dies muss so geschehen, dass Sie anschließend zurückkehren und weiterarbeiten können. Dazu ist es notwendig, den Inhalt der Register zu speichern, da es sich um von Programmen gemeinsam genutzte Ressourcen handelt.

Register müssen gespeichert werden cs, ip, flags (CS:IP-Paar enthält die Adresse des Befehls, mit dessen Ausführung nach der Rückkehr begonnen werden soll, Flaggen - Zustand der Flags nach Ausführung der letzten Anweisung des unterbrochenen Programms).

!!! Diese Register werden automatisch vom Mikroprozessor gespeichert. Der Erhalt anderer Register muss vom Programmierer sichergestellt werden!!!

Der bequemste Ort zum Speichern von Registern ist der Stapel.

Nach dem Speichern der Register auf dem Stapel setzt der Mikroprozessor das Flag-Bit zurück WENN (also=0)(!!! In diesem Fall wird das Register auf den Stack geschrieben Flaggen mit noch installiert WENN !!!) Dies verhindert die Möglichkeit verschachtelter externer Interrupts und Schäden an den Registern des Quellprogramms aufgrund unkontrollierter Aktionen seitens des Programms – des verschachtelten Interrupt-Handlers. Nachdem die erforderlichen kontextspeichernden Aktionen abgeschlossen sind, kann der Hardware-Interrupt-Handler mit dem Befehl verschachtelte Interrupts aktivieren sti.

2) Übergang zur Ausführung und Ausführung des Interrupt-Dienstprogramms;

Hier wird die Quelle des Interrupts ermittelt und der entsprechende Interrupt-Handler aufgerufen.

Im Realmodus des Mikroprozessors sind 256 Quellen erlaubt – entsprechend der Anzahl der Elemente der Interrupt-Vektortabelle.

Elementstruktur:

· 2 Bytes – Offsetwert des Anfangs des Interrupt-Handler-Programms vom Anfang des Codesegments

· 2 Bytes – der Wert der Basisadresse des Segments, in dem sich das Handlerprogramm befindet.

So ermitteln Sie die Adresse, an der sich die Interrupt-Vektornummer befindet N?

Offset der Interrupt-Vektortabelle = N*4

Volle Tischgröße? 4*256=1024

Also in der zweiten Stufe der Mikroprozessor

1. Bestimmt anhand der Nummer der Interrupt-Quelle den Offset in der Interrupt-Vektortabelle

2. Platziert die ersten beiden Bytes in einem Register IP

3. Platziert die zweiten beiden Bytes in einem Register C.S.

4. Überträgt die Kontrolle an die Adresse CS:IP

(Es kann auch durch eine Anfrage von einer Quelle mit höherer Priorität unterbrochen werden. Alle Interrupt-Quellen haben Prioritäten.)

3) Geben Sie die Kontrolle an das unterbrochene Programm zurück.

Es ist notwendig, den Stapel wieder in den Zustand zu versetzen, in dem er sich unmittelbar nach der Übergabe der Kontrolle an diese Prozedur befand. Dazu muss der Programmierer die notwendigen Aktionen zum Wiederherstellen von Registern und Löschen des Stapels angeben. !! Dieser Abschnitt muss durch den Befehl vor einer möglichen Beschädigung des Registerinhalts (aufgrund eines Hardware-Interrupts) geschützt werden cli.

Die letzten Befehle im Interrupt-Handler sind sti, iret

sti - Hardware-Interrupts aktivieren (setzt das Flag WENN=1 , hat keine Operanden).

iret - Entfernen Sie drei Wörter nacheinander vom Stapel und platzieren Sie sie entsprechend in den Registern IP, CS, Flags.

Während der Computer ein aktuelles Programm innerhalb der Maschine und in der damit verbundenen externen Umgebung ausführt (z. B. in einem vom Computer gesteuerten technologischen Prozess), können Ereignisse auftreten, die eine sofortige Reaktion der Maschine erfordern.

Die Reaktion besteht darin, dass die Maschine die Verarbeitung des aktuellen Programms unterbricht und mit der Ausführung eines anderen Programms fortfährt, das speziell für dieses Ereignis entwickelt wurde. Nach Abschluss dieses Programms kehrt der Computer zur Ausführung des unterbrochenen Programms zurück.

Der entsprechende Vorgang wird als Programmunterbrechung bezeichnet. Grundsätzlich ist es wichtig, dass die Zeitpunkte des Eintretens von Ereignissen, die eine Programmunterbrechung erfordern, im Voraus unbekannt sind und daher bei der Programmierung nicht berücksichtigt werden können.

Jedes Ereignis, das eine Unterbrechung erfordert, wird von einem Signal begleitet, das den Computer benachrichtigt – Unterbrechungsanforderungen. Das durch eine Interrupt-Anforderung angeforderte Programm wird als Interrupt-Programm bezeichnet, im Gegensatz zu dem unterbrochenen Programm, das von der Maschine ausgeführt wurde, bevor die Anforderung erschien.

Die Fähigkeit, Programme zu unterbrechen, ist eine wichtige architektonische Eigenschaft eines Computers, die es ermöglicht, die Leistung des Prozessors effektiv zu nutzen, wenn mehrere Prozesse gleichzeitig parallel ablaufen und zu beliebigen Zeitpunkten Kontrolle und Wartung durch den Prozessor erfordern. Dies gilt zunächst für die Organisation des Parallelbetriebs von Prozessor und Peripheriegeräten der Maschine sowie für den Einsatz von Computern zur Echtzeitsteuerung technologischer Prozesse.

Damit ein Computer ohne großen Aufwand für den Programmierer Programmunterbrechungen mit hoher Geschwindigkeit umsetzen kann, muss die Maschine mit entsprechender Hard- und Software ausgestattet sein, deren Kombination als Programmunterbrechungssystem bezeichnet wird.

Die Hauptfunktionen des Interrupt-Systems sind:

    Speichern des Zustands des unterbrochenen Programms und Übergang zum unterbrechenden Programm

    Wiederherstellen des Zustands eines unterbrochenen Programms und Zurückkehren zu diesem Zustand.

Der Interrupt-Vektor ist der Vektor des „Anfangszustands des unterbrechenden Programms“. Der Interrupt-Vektor enthält alle notwendigen Informationen, um zum unterbrechenden Programm zu springen, einschließlich seiner Startadresse. Jede Interrupt-Anforderung (Nummer) verfügt über einen eigenen Interrupt-Vektor, der die Ausführung des entsprechenden Interrupt-Programms initiieren kann. Interrupt-Vektoren befinden sich in speziell zugewiesenen festen Speicherzellen – der Interrupt-Vektortabelle.

Den Hauptplatz in der Prozedur zum Übergang zu einem unterbrechenden Programm nimmt die Prozedur der Übertragung vom entsprechenden Register (den entsprechenden Registern) des Prozessors in den Speicher (insbesondere in den Stapel) ein, um den aktuellen Zustandsvektor des unterbrochenen Programms zu speichern ( damit Sie zu seiner Ausführung zurückkehren können) und Laden des Interrupt-Vektors des unterbrechenden Programms in das Register (die Register) des Prozessors, an den die Steuerung des Prozessors übertragen wird.

Klassifizierung unterbrechen

Interrupt-Anforderungen können innerhalb des Computers selbst und in dessen Umgebung auftreten Außenumgebung. Zu den ersten gehören beispielsweise Anfragen, wenn solche Ereignisse in einem Computer auftreten, wie etwa ein Fehler im Betrieb seiner Ausrüstung, ein Überlauf des Bitrasters, ein Versuch, durch 0 zu dividieren, ein Verlassen des für ein bestimmtes Programm festgelegten Speicherbereichs , eine Anforderung eines Peripheriegeräts für eine Eingabe-Ausgabe-Operation, der Abschluss einer Eingabe-/Ausgabeoperation durch ein Peripheriegerät oder das Auftreten einer besonderen Situation während dieser Operation usw. Obwohl einige dieser Ereignisse vom Programm selbst generiert werden, Die Zeitpunkte ihres Auftretens sind in der Regel nicht vorhersehbar. Anfragen in der externen Umgebung können von anderen Computern, von Notfall- und einigen anderen technologischen Prozesssensoren usw. ausgehen.

Die Intel 80x86-Mikroprozessorfamilie unterstützt 256 Prioritätsstufen von Interrupts, die durch drei Arten von Ereignissen ausgelöst werden:

    interne Hardware-Interrupts

    externe Hardware-Interrupts

    Software-Interrupts

Interne Hardware-Interrupts, manchmal auch Fehler genannt, werden durch bestimmte Ereignisse erzeugt, die während der Programmausführung auftreten, beispielsweise durch den Versuch, durch 0 zu dividieren. Die Zuweisung bestimmter Interrupt-Nummern zu solchen Ereignissen ist fest im Prozessor verankert und kann nicht geändert werden.

Externe Hardware-Interrupts initiiert durch periphere Controller oder Coprozessoren (z. B. 8087/80287). Interrupt-Quellen werden entweder mit dem nicht maskierbaren Interrupt-Pin (NMI) oder dem Interrupt-maskierbaren Pin (INTR) des Prozessors verbunden. Die NMI-Leitung ist in der Regel für Interrupts vorgesehen, die durch katastrophale Ereignisse wie Speicherparitätsfehler oder Stromausfall verursacht werden.

Software-Interrupts. Jedes Programm kann einen synchronen Software-Interrupt auslösen, indem es einen Befehl ausführt int. MS-DOS verwendet Interrupts von 20H bis 3FH, um mit seinen Modulen und Anwendungsprogrammen zu interagieren (z. B. wird durch Ausführen des Befehls auf den MS-DOS-Funktionsmanager zugegriffen ichnt 21H). Im ROM gespeicherte BIOS-Programme und IBM PC-Anwendungsprogramme verwenden unterschiedliche Interrupts mit höheren oder niedrigeren Nummern. Diese Verteilung der Interrupt-Nummern ist bedingt und in keiner Weise in der Hardware festgelegt.

Interrupt-Vektortabelle

Um die Adresse des Interrupt-Handlers mit der Interrupt-Nummer zu verknüpfen, wird eine Tabelle von Interrupt-Vektoren verwendet, die das erste Kilobyte RAM belegt. Diese Tabelle liegt im Adressbereich von 0000:0000 bis 0000:03FFh und besteht aus 256 Elementen – Fernadressen von Interrupt-Handlern.

Die Einträge in der Interrupt-Vektortabelle werden Interrupt-Vektoren genannt. Das erste Wort des Tabellenelements enthält die Offset-Komponente und das zweite Wort enthält die Segmentkomponente der Interrupt-Handler-Adresse.

Interrupt-Vektor Nummer 0 befindet sich an der Adresse 0000:0000, Nummer 1 an Adresse 0000:0004 usw. Im Allgemeinen wird die Adresse des Interrupt-Vektors durch Multiplizieren der Interrupt-Nummer mit 4 ermittelt.

Die Tabelleninitialisierung wird teilweise durch das BIOS-Basis-Ein-/Ausgabesystem nach dem Hardwaretest und vor Beginn des Betriebssystemladevorgangs und teilweise beim Laden von MS-DOS durchgeführt. Das MS-DOS-Betriebssystem kann einige vom BIOS festgelegte Interrupt-Vektoren ändern.

Interrupt-Vektortabelle

Nummer

Beschreibung

Divisionsfehler. Wird automatisch aufgerufen, nachdem DIV- oder IDIV-Befehle ausgeführt wurden, wenn die Division zu einem Überlauf führt (z. B. Division durch 0). Normalerweise zeigt MS-DOS bei der Verarbeitung dieses Interrupts eine Fehlermeldung an und stoppt die Programmausführung. In diesem Fall verweist die Rücksprungadresse beim i8086-Prozessor auf den Befehl, der dem Divisionsbefehl folgt, und beim i80286-Prozessor und späteren Modellen auf das erste Byte des Befehls, der den Interrupt verursacht hat

Schrittbetrieb unterbrechen. Wird nach der Ausführung jedes Maschinenbefehls erzeugt, wenn das Schritt-für-Schritt-Trace-Bit TF im Flags-Wort gesetzt ist. Wird zum Debuggen von Programmen verwendet. Dieser Interrupt wird nicht generiert, nachdem Daten mithilfe der MOV- und POP-Anweisungen an Segmentregister gesendet wurden.

Nicht maskierbarer Hardware-Interrupt. Dieser Interrupt kann auf verschiedenen Maschinen unterschiedlich verwendet werden. Typischerweise wird es generiert, wenn ein Paritätsfehler im RAM vorliegt und wenn ein Interrupt vom Coprozessor angefordert wird

Unterbrechung für die Nachverfolgung. Wird beim Ausführen eines Ein-Byte-Maschinenbefehls mit Code CCh generiert und wird häufig von Debuggern zum Festlegen eines Haltepunkts verwendet

Überlauf. Wird vom INTO-Maschinenbefehl generiert, wenn das Überlaufflag OF gesetzt ist. Wenn das Flag nicht gesetzt ist, wird die INTO-Anweisung als NOP ausgeführt. Dieser Interrupt wird zur Fehlerbehandlung bei der Ausführung arithmetischer Operationen verwendet

Drucken Sie eine Bildschirmkopie. Wird generiert, wenn der Benutzer eine Taste gedrückt hat In MS-DOS-Programmen wird es normalerweise zum Drucken eines Bildschirmbilds verwendet. Für den i80286-Prozessor und höhere Modelle wird es beim Ausführen des BOUND-Maschinenbefehls generiert, wenn der überprüfte Wert außerhalb des angegebenen Bereichs liegt

Undefinierter Opcode oder Befehlslänge größer als 10 Byte

Sonderfall des Fehlens eines arithmetischen Coprozessors

IRQ0 – Intervall-Timer-Interrupt, tritt 18,2 Mal pro Sekunde auf

IRQ1 – Tastaturunterbrechung. Wird generiert, wenn der Benutzer Tasten drückt und loslässt. Wird zum Lesen von Daten von der Tastatur verwendet

IRQ2 – wird zur Kaskadierung von Hardware-Interrupts verwendet

IRQ3 – Unterbrechung des asynchronen Ports COM2

IRQ4 – Unterbrechung des asynchronen Ports COM1

IRQ5 – Interrupt vom Festplattencontroller (nur für IBM PC/XT-Computer)

IRQ6 – vom HDD-Controller generierter Interrupt nach Abschluss des E/A-Vorgangs

IRQ7 – Interrupt vom Paralleladapter. Wird generiert, wenn der an den Adapter angeschlossene Drucker bereit ist, einen weiteren Vorgang auszuführen. Wird normalerweise nicht verwendet

Wartung des Videoadapters

Definieren der Konfiguration von Geräten im System

Bestimmen der RAM-Größe

Wartung des Festplattensystems

Arbeiten mit einem asynchronen seriellen Adapter

Erweiterter Service

Tastaturwartung

Druckerwartung

Ausführen von BASIC im ROM, falls verfügbar

Wachdienst

Interrupt-Handler, der auftritt, wenn der Benutzer eine Tastenkombination drückt

Software-Interrupt, der vom Hardware-Timer-Interrupt-Handler 18,2 Mal pro Sekunde aufgerufen wird

Videotabellenadresse für Videoadapter-Controller 6845

Zeiger auf die Diskettenparametertabelle

Zeiger auf eine Grafiktabelle für Zeichen mit den ASCII-Codes 128-255

Wird von MS-DOS verwendet oder ist für MS-DOS reserviert

Für Benutzerprogramme reservierte Interrupts

Nicht benutzt

IRQ8 – Echtzeituhr-Interrupt

IRQ9 – Interrupt vom EGA-Controller

IRQ10 – reserviert

IRQ11 – reserviert

IRQ12 – reserviert

IRQ13 – Interrupt vom arithmetischen Coprozessor

IRQ14 – Interrupt vom Festplattencontroller

IRQ15 – reserviert

Nicht benutzt

Reserviert für BASIC

Wird vom BASIC-Interpreter verwendet

Nicht benutzt

Als IRQ0 – IRQ15 bezeichnete Interrupts sind externe Hardware.

Veröffentlichungen zum Thema