Dockers DEV Site


Updates · Faq · Home 

6 Komplexbeispiel - Multitasking

In diesem Kapitel wird ein Beispielprogramm für die Realisierung von Mutlitasking in Assembler entwickelt. Dabei soll echtes, "pre-emptives" Multitasking verwendet werden, um 4 unabhängig voneinander laufende Tasks zu verwalten. Zu einem Task gehört in diesem Beispiel ein Code-, ein Daten-, ein Stack- sowie ein Taskstate-Segment.

6.1 Multitasking - Wie ?

Obwohl die Intel Prozessoren der 80x86-Reihe (ab dem 80286) bereits über die Grundlagen verfügen, Multitasking zu realisieren, muß die eigentliche Logik der Task-Umschaltung von einem Verwaltungsprogramm übernommen werden. Dabei wird der Programmierer insofern unterstützt, daß er sich nicht um die Sicherung bzw. die Wiederherstellung des Prozessorzustandes kümmern muß, denn dafür existiert bereits das TS-Segment (Vgl. Punkt 3.2 Multitasking). Multitasking in der Form für jeden Task festlegen zu können, wann und wie lange er ausgeführt wird, ist jedoch direkt nicht möglich. Denkbar wäre z.B. innerhalb des TSS eine (Prozessorzeit-) Prioritätstufe für den Task und eine minimale Prozessorzeit angeben zu können und das eigentliche Multitasking (also auch die Umschaltung zwischen den Tasks) dem Prozessor zu überlassen. Diese Möglichkeit wird jedoch nicht vom Prozessor unterstützt!

Der erste Schritt muß es deshalb sein, eine Möglichkeit zu finden, eine periodische Taskumschaltung zu erreichen. Mit anderen Worten: es muß eine Routine existieren, die zum einen periodisch aufgerufen wird und zum anderen die Möglichkeit besitzt, eine Taskumschaltung durchzuführen.

Um einen Programmteil periodisch aufzurufen, wird hier der Timer-Interrupt verwendet. Hardware-Interrupt 0 wird von einem Timer-Chip (PIT - Programmable Interval Timer) über den Interrupt-Controller im Standardfall 18,2 mal in der Sekunde aktiviert. Das heißt, der Eintrag in der IDT, der mit dem Hardware-Interrupt 0 verbunden ist, wird 18,2 mal in der Sekunde aktiv. Welcher Eintrag der IDT genau und wie die Frequenz des Timers eingestellt wird (18,2 mal pro Sekunde ist zu langsam) wird weiter unten erläutert.

Zweckmäßig wird der entsprechende Eintrag der IDT als Task-Gate angelegt, um so einen Taskwechsel zur Interrupt-Routine zu erreichen. Diese Routine (bzw. dieser Task, im folgenden auch als Task-Handler bezeichnet) muß nun dafür sorgen, daß der Taskwechsel zwischen mehreren Tasks realisiert wird. Wenn Interrupt 0 aktiviert wird, wird der momentan aktive Task für die Zeit des Interrupt-Tasks unterbrochen und danach wieder fortgesetzt.

Der Task-Handler muß bei jeder Aktivierung zum nächsten Task umschalten. Dabei kann davon Gebrauch gemacht werden, daß der Task-Handler selbst als Task ausgeführt wird. Gibt er die Task-Ausführung mit JMP FAR weiter, wird der aktuelle Prozessorzustand im Task-Handler-TSS gespeichert, wobei CS:EIP auf den Befehl nach dem JMP FAR zeigen. Wird der Task-Handler ein zweites Mal ausgeführt, zeigt CS:EIP schon auf den nächsten Befehl (der theoretisch den zweiten Task aufrufen kann) und so weiter. Abbildung 6.1 illustriert die prinzipielle Task-Umschaltung zwischen zwei Tasks.

Task-Wechsel
Abb. 6.1: Taskwechsel im Beispielprogramm

Abb. 6.2 zeigt den Zustandsgraph der im Beispielprogramm durchgeführten Taskwechsel anhand von 3 Tasks. Das Beispielprogramm verwendet insgesamt 5.

Taskwechsel
Abb. 6.2: Taskwechsel im Beispielprogramm

Dabei bedeuten:

Index
weiter >>
<< zurück ||

Last change 27/11/2022 by Docker Rocker.
This page uses no cookies, no tracking - just HTML.
Author: "Docker Rocker" ~ 2022 · [Public Git]