|
|
 |
 |
Aufgabe 2: Interruptbehandlung für OO-Stubs
Lernziel
- Behandlung asynchroner Ereignisse
- Problematik und Schutz kritischer Abschnitte
Aufgabenbeschreibung
Es soll eine einfache Interruptbehandlung für die Unterbrechungen
durch die Tastatur vorgesehen werden.
Hierzu müssen die Klassen
PIC,
Plugbox,
Gate,
Panic,
Keyboard sowie die Funktion
guardian implementiert
werden. Die Klasse
CPU,
ist in der Vorgabe enthalten.
Um die entsprechenden Geräte überall in OO-Stubs nutzen zu
können, sollen von den Klassen CPU, Plugbox, PIC und
Keyboard globale Objekte cpu, plugbox,
pic und keyboard
angelegt werden.
Implementierungshinweise
Teil a
Im ersten Schritt sollte die Klasse PIC
implementiert werden. Mit ihrer Hilfe und mit Hilfe der Klasse CPU können Unterbrechungen von der
Tastatur zugelassen werden (während des Boot-Vorgangs wurden bei
der CPU und beim PIC alle Unterbrechungen ausmaskiert). Wenn dies
funktioniert, müsste automatisch bei jedem Drücken und
Loslossen einer Taste die Funktion
guardian
aktiviert werden, da die Interruptvektortabelle im Startup-Code
entsprechend initialisiert wurde. Mit einer Ausgabe in guardian() kann
Teil a leicht getestet werden - zumindestens einige Male. Wenn die Zeichen nicht vom Tastaturcontroller abgeholt werden, läuft der Tastaturpuffer irgendwann voll. Sobald der Puffer voll ist, sendet der Tastaturcontroller jedoch keine Interrupts mehr. Deshalb kann es durchaus passieren, dass ihr zunächst nur für ein oder zwei Tastendrücke Interrupts bekommt. Denkt außerdem auch an das ACK Signal für
den PIC.
Tipps:
- Während der Behandlung einer Unterbrechung braucht ihr euch um
unerwünschte Interrupts nicht zu sorgen. Der Prozessor schaltet
diese nämlich automatisch aus, wenn er mit der Behandlung beginnt
und lässt sie erst wieder zu, wenn die
Unterbrechungsbehandlung mit der Assembleranweisung
iret
beendet wird. Das entspricht der letzten schließenden Klammer
der guardian() Implementierung.
-
Eure Interruptverarbeitung kann natürlich nur funktionieren, wenn OOSTUBS auch läuft. Sobald OOSTUBS die
main() -Funktion verlässt, ist das Verhalten bei Auftreten eines Interrupts undefiniert. Ein Betriebssystem sollte halt nicht plötzlich enden :-)
Teil b
Im zweiten Schritt wird eine Infrastruktur geschaffen, um die
Unterbrechungsbehandlung an ein zugeordnetes Gerätetreiberobjekt
weiterzuleiten. Zur Verwaltung von Treiberobjekten dient die Klasse Plugbox, die für jeden
möglichen Interrupt einen Zeiger auf ein Gate Objekt bereithält. Gate ist eine
abstrakte Klasse, die die Schnittstelle aller Interrupt-behandelnden
Treiber beschreibt. Initial werden alle Zeiger der Plugbox so
gesetzt, dass sie auf ein globales Panic Objekt verweisen.
Teil c
Hier soll die Klasse Keyboard implementiert werden. Sie
stellt den eigentlichen Tastaturtreiber dar. Die Unterbrechungen, die die
Tastatur auslöst, müssen abgefangen und interpretiert werden. Als
Ergebnis soll nach jedem Tastendruck das entsprechende Zeichen an
einer festen Position auf dem Bildschirm dargestellt werden. Die
Tastenkombination "Ctrl-Alt-Delete" soll ein Reboot auslösen.
Teil d
Schreibt ein Testprogramm in Application::action(), das von main() aus
aufgerufenn wird. Dieses soll in einer Endlosschleife an einer festen
Position Ausgaben machen. Es sollte nun möglich sein, durch das
Drücken von Tasten die Ausgabe "durcheinander" bringen zu
können. Überlegt euch, was dabei passiert, und vermeidet das
Problem mit Hilfe der Funktionen der Klasse CPU.
Vorgaben
Die Implementierung der Klasse
CPU
haben wir bereits für euch übernommen.
Für die eigentliche Tastaturabfrage könnt die eure Klasse
Keyboard_Controller aus Aufgabe 1
wiederverwenden.
Hilfestellung
|
 |
 |
|