Fragen aus ehemaligen Klausuren

Der nachfolgende Text ist eine Zusammenstellung von Fragen zur Prozeßdatenverarbeitung aus mehreren zurückliegenden Klausuren. Zur Orientierung sind die Punktzahlen angegeben. Klausuren dauern üblicherweise vier Stunden und es sind maximal 100 Punkte erreichbar.


Grundlagen der Prozeßdatenverarbeitung

a) (1 Punkt)

Nennen Sie die Arten der Kopplung eines Prozeßrechners mit einem technischen Prozeß.

b) (1 Punkt)

Welche Arten der Strukturierung von Echtzeitprogrammen kennen Sie?

c) (2 Punkte)

Was verstehen Sie unter dem Begriff echtzeitfähig? Nennen Sie eine Technik zur zeitlichen Einplanung, die in ADA realisiert ist.

d) (2 Punkte)

Was versteht man unter einer zeitgerechten Zuteilung? Wann heißt ein Zuteilungsalgorithmus optimal?

e) (2 Punkte)

Welche Aufgabe hat das Interruptvektorregister eines externen Bausteins?

f) (2 Punkte)

Beschreiben Sie die Sprachmittel von Ada zur Ausnahmebehandlung.

g) (2 Punkte)

Ist die Programmiersprache Ada für Echtzeitanwendungen geeignet? Nennen Sie mindestens drei Argumente für Ihre Einordnung.

h) (2 Punkte)

Beschreiben Sie den Fehlerbehandlungsmechanismus in Ada. Was passiert, wenn für eine Situation keine Fehlerbehandlung vorgesehen wurde?

i) (3 Punkte)

Worin unterscheiden sich Ausnahmen und Unterbrechungen? Wie können Sie jeweils ausgelöst werden?

j) (2 Punkte)

Weshalb lassen sich in Ada Spezifikation und Implementierung eines Paketes getrennt entwerfen und übersetzen?

k) (3 Punkte)

In einer Rohrpostanlage sei ein Lichtschrankensensor zur Erfassung passierender Transportbehälter installiert. Die Behälter haben eine maximale Geschwindigkeit von 10 m/s und sind 30 cm lang. Der Abstand zwischen zwei Behältern sei größer als die Behälterlänge. Wie oft muß der Sensor vom Zentralrechner mindestens abgefragt werden, um keinen Transportbehälter zu verpassen?

l) (2 Punkte)

Was bewirkt in Ada die Vereinbarung eines privaten Typs? Was ist der Unterschied zwischen der Vereinbarung private und limited private?

m) (2 Punkte)

An wen wird eine Ausnahme fortgepflanzt, wenn diese während eines Rendezvous ausgelöst wird und innerhalb des Rendezvous keine Ausnahmebehandlungsroutine existiert?

n) (2 Punkte)

Ein analoges Sprachsignal soll abgetastet und digital übertragen werden. Die höchste Frequenz des Signals sei 4000 Hz. Das Signal wird in 256 Quantisierungsintervalle unterteilt. Welche Abtastfrequenz ist notwendig unter Berücksichtigung des Abtasttheorems von Shannon? Welches ist die resultierende Bitrate?

o) (2 Punkte)

Die Firma HardRealTime möchte einen technischen Prozeß mit harten Echtzeitanforderungen durch einen Prozeßrechner steuern. Die Beratungsfirma PushySalesmen rät zu einem Rechner mit dem Prozessor vom Typ CannotDivide, weil er 100 MIPS (million instructions per second) "schafft" und damit "echtzeitfähig" sei. Was ist an dieser Aussage zu kritisieren?

 


Aufgabe 1: Programmierung von Prozeßperipherie (25 Punkte)

Entwerfen Sie mit den folgenden Vorgaben ein ADA-Steuerprogramm für die Überwachung eines Autorades auf Blockierung oder Schlupf.

Folgende Peripheriebausteine stehen zur Verfügung:

  1. Im Auto ist ein Geschwindigkeitsmesser vorhanden, welcher die tatsächliche aktuelle Geschwindigkeit gegenüber dem Untergrund unabhängig von den Rädern mißt. Das Leseregister ist ein Byte groß, an Adresse 8#500# im Speicher eingeblendet, und enthält die ganzzahlige Geschwindigkeit in km/h.
  2. Am zu überwachenden Rad befindet sich ein Sensor, der nach jeder vollen Umdrehung des Rades einen Interrupt auslöst. Der entsprechende Unterbrechungsvektor hat den Wert 8#400#.
  3. Weiterhin kann ein Timer-Baustein mit der Grundfrequenz 10 kHz eingesetzt werden. Der Baustein zählt von einem gegebenen Wert an rückwärts und löst bei Nulldurchgang einen Interrupt mit dem Unterbrechungsvektor 8#410# aus. An Adresse 8#600# kann der aktuelle Zählerstand als 16bit-Wert gelesen bzw. neu gesetzt werden. Auf Adresse 8#610# befindet sich das Steuerregister (ein Byte) des Zählers. Das Setzen von Bit 0 auf 1 aktiviert den Zählablauf, Rücksetzen des Bits stoppt das Zählen. Nach einem Nulldurchgang stoppt der Zähler automatisch.

Das zu entwerfende Steuerprogramm soll in einer task RAD_EINS das Rad mit einem Durchmesser von 60 cm überwachen und dabei folgende Funktionen erfüllen:

  1. Unterschreitet die Radgeschwindigkeit die tatsächliche Autogeschwindigkeit um 20 Prozent oder mehr, droht eine Blockierung des Rades und der Eintrittspunkt AKTIVIERT einer fiktiven task ABS muß aufgerufen werden. Liegt der kritische Fall nicht mehr vor, muß ABS.DEAKTIVIERT aufgerufen werden.
  2. Überschreitet die Radgeschwindigkeit die tatsächliche Autogeschwindigkeit um 10 Prozent oder mehr, droht das Durchdrehen des Rades und der Eintrittspunkt AKTIVIERT einer fiktiven task ASR muß aufgerufen werden. Liegt der kritische Fall nicht mehr vor, muß ASR.DEAKTIVIERT aufgerufen werden.

a) (2 Punkte)

Definieren Sie einen Datentyp für das Auslesen des Geschwindigkeitsmessers. Die Zuweisung von Werten außerhalb des Bereichs 0..200 soll nicht zulässig sein. Erzeugen Sie eine entsprechende Variable, über die die Geschwindigkeit ausgelesen werden kann.

b) (3 Punkte)

Entwerfen Sie Datentypen und Variablen für den Zugriff auf die zwei Schnittstellenregister des Timer-Bausteins. Verwenden Sie diese Datentypen in den folgenden Teilaufgaben.

c) (2 Punkte)

Entwerfen Sie die Spezifikation der task RAD_EINS innerhalb eines Pakets RADKONTROLLE. Sorgen Sie dafür, daß den Interrupts der Peripheriegeräte entsprechende Eintrittspunkte zugeordnet werden.

d) (4 Punkte)

Berechnen Sie die kritischen Werte der Anzahl der Zählimpulse des Timer-Bausteins zwischen zwei Meldungen des Radumdrehungssensors, ab denen Blockierung bzw. Schlupf für eine gegebene Autogeschwindigkeit vAuto gemeldet werden muß. Der Rechenweg muß erkennbar sein.

e) (9 Punkte)

Geben Sie nun die Implementation des Pakets RADKONTROLLE mit der task RAD_EINS an. Die in den vorangegangenen Teilaufgaben spezifizierten Typen und Variablen müssen nicht noch einmal angegeben werden. Sicherheitshalber soll an eine übergeordnete task MAIN nach dem erfolgreichen Ausführen (Initialisieren) des Pakets RADKONTROLLE die Nachricht RAD_OKgesendet werden. Dies soll nicht aus der task RAD_EINS heraus erfolgen!

f) (2 Punkte)

Beschreiben Sie kurz, wie Sie Ihr bisheriges Programm softwaretechnisch elegant erweitern würden, wenn identische Überwachunsprozesse für alle vier Räder zu implementieren sind!

g) (3 Punkte)

Nehmen Sie an, der Autohersteller fordert von Ihnen als Zulieferer des Radüberwachungssystems, daß das Blockieren eines Rades aus Sicherheitsgründen spätestens nach einer Zehntelsekunde an das ABS-System gemeldet wird. Was müßten Sie für eine solche Zusicherung untersuchen?


Aufgabe 2: Prozeßsynchronisation (10 Punkte)

Für einen Internet-Buchhandel sollen die Steuerprogramme von Händler und Kunde entworfen werden.

Das Kundenprogramm soll ein Buch (spezifiziert durch den Namen) bis zu einem gegebenen maximalen Preis erwerben und nimmt dazu Kontakt mit dem Händlerprogramm auf. Das Händlerprogramm gibt Auskunft über Vorhandensein und Preis des Buchs. Nach einer positiven Auskunft hält das Händlerprogramm das Buch für 10 Minuten reserviert. Ist das Buch vorhanden und entspricht den Preisvorstellungen des Kunden, veranlaßt das Kundenprogramm die Bezahlung bei einem Online-Bankprogramm. Danach wird dem Händlerprogramm signalisiert, daß das Buch erworben werden soll. Das Händlerprogramm überprüft nun den Geldeingang bzw. leitet das Geld bei der Bank auf das Händlerkonto. Ist alles in Ordnung, wird das Buch versandt.

Entwerfen Sie die Konzeption für eine Steuerung dieses Ablaufes mit Prozessen in Ada. Kunde, Händler und Bank sollen jeweils durch einen Prozeß vertreten werden.

a) (2 Punkte)

Zeichnen Sie eine Skizze der Prozesse und ihrer Kommunikationsbeziehungen.

b) (6 Punkte)

Geben Sie die Implementierung des Kunden- und des Händlerprozesses an. Es genügt die Darstellung der Interaktionen zwischen den Prozessen in Ada und der wesentlichen Aktionen innerhalb der Prozesse. Von weiteren Einzelheiten wie Typen- und Variablendeklarationen wird abstrahiert.

c) (2 Punkte)

Kann es in dem von Ihnen entworfenen Ada-Programm zu Verklemmungen kommen? Geben Sie mindestens zwei Möglichkeiten an, wie Sie Verklemmungen erkennen und beseitigen könnten.


Aufgabe 3: Programmierung von Prozeßperipherie (20 Punkte)

Gegeben sei ein Tankbehälter. Der Behälter habe einen Abfluß und einen Zufluß, die je über ein Ventil gesteuert werden. Eine Füllstandsüberwachung liefere an einer parallelen Schnittstelle ganzzahlige Werte zwischen 0 und 100 für den Füllstand in Prozent, die Schnittstelle ist 16 Bit breit, die Bits 0…7 werden für die Zahlendarstellung benutzt (Bit 0 ist LSB), Bit 8 wird auf 0 gesetzt, wenn die Füllstandswerte gültig sind. Zusätzlich zur analogen Füllstandsüberwachung sind zwei Meßeinrichtungen für Extremwerte installiert, die Interrupts bei Erreichen des Grenzwertes auslösen.

Entwerfen Sie für diese Anlage ein Steuerprogramm in Ada. Darin wird keine Füllstandsregelung vorgenommen. Das Programm soll folgende Anforderungen erfüllen:

Hinweis 1: Benutzten Sie zur Behandlung der Extremwertmeldungen Unterbrechungsbehandlung in Standard-Ada. Die Unterbrechungsvektoren seien hexadezimal 200 für den Überlauf und hexadezimal 300 für die Leermeldung.

Hinweis 2: Das Schnittstellenregister läßt sich unmittelbar an seiner Adresse oktal 777700 auslesen.

a) (4 Punkte)

Entwerfen Sie zunächst ein Task-Konzept für das Steuerprogramm indem Sie Prozeßspezifikationen, Eintrittspunkte der Tasks und Aufrufe spezifizieren. Stellen Sie den Zusammenhang zwischen den Tasks übersichtlich dar! (Mindestanforderung: je eine Task zum Auslesen der Füllstände und zur Bedienung der Ventile)

Lösungsvorschlag:
task MESSEN is
  entry FUELLSTAND(WERT: out WERT_T);
end MESSEN;
task STELLEN is
entry VENTILE(ZV1, ZV2: ZV_T);
entry VOLL;
 for VOLL use at 16#200#;
entry LEER;
for LEER use at16#300#;
end STELLEN;

b) (2 Punkte)

Spezifizieren Sie einen Variablentyp für die Füllstandswerte. Die Typdeklaration soll sicherstellen, daß nur gültige Werte zugewiesen erden können.
Wie können Sie sicherstellen, daß auf Werte außerhalb des gültigen Bereiches (verursacht beispielsweise durch einen Fehler in der Meßeinrichtung) angemessen reagiert wird?

Lösungsvorschlag:
subtype WERT_T is INTEGER range 0..100;
for WERT_T'SIZE use 8;
exception
 when CONSTRAINT_ERROR => -- Fehlerbehandlung


c) (7 Punkte)

Schreiben Sie den Prozeß zum Auslesen der Füllstandswerte aus der parallelen Schnittstelle.

Lösungsvorschlag:

task body MESSEN is

-- Typdeklarationen
type BIT_T is (OFF, ON);
for BIT_T use (OFF => 0; ON => 1);
for BIT_T'SIZE use 1;

type LEER_T is array(1..7) of BIT_T;
for LEER_T'SIZE use 7;

type REGISTER_T is record
WERT : WERT_T;
GUELTIG : BIT_T;
LEER : LEER_T;
end record;

for REGISTER_T use record
WERT at 0 range 0..7;
GUELTIG at 0 range 8..8;
LEER at 0 range 9..15;;
end record;
for REGISTER_T´SIZE use 16;
pragma PACK(REGISTER_T);

-- Variablendeklarationen
REGISTER: REGISTER_T;
pragma VOLATILE(REGISTER);
for REGISTER use at 8#777700#;
TMP_REG: REGISTER_T;
pragma VOLATILE(REGISTER);
TMP_WERT: WERT_T

begin
loop
select
accept FUELLSTAND(WERT: out WERT_T) do
WERT := TMP_WERT;
end FUELLSTAND;
else
-- hier polling, ginge auch eleganter
TMP_REG:=REGISTER;
if TMP_REG.GUELTIG=OFF then
TMP_WERT:=TMP_REG.WERT;
end if;
end select;
end loop;
exception
when CONSTRAINT_ERROR => Fehlerbehandlung;
end MESSEN;

d) (7 Punkte)

Schreiben Sie den Prozeß zum Öffnen und Schließen der Ventile. Berücksichtigen Sie die Extremwertmeldungen und die Ausnahme, die mit ihnen ausgelöst wird.

Lösungsvorschlag:

task body STELLEN is

ZV_T: (AUF, ZU);
WERT: WERT_T;
UEBERLAUF, UNTERLAUF: exception;

begin
loop
select
accept VENTILE(ZV1, ZV2: ZV_T) do
-- Ventile entsprechend betätigen
end VENTILE;
or
accept VOLL do
-- Zulaufventil schließen
raise UEBERLAUF;
end VOLL;
or
accept LEER do
-- Ablaufventil schließen
raise UNTERLAUF;
end LEER;
else
MESSEN.FUELLSTAND(WERT);
if WERT < 2 then
-- Ablaufventil schließen
raise UNTERLAUF;
elsif WERT > 98 then
-- Zulaufventil schließen
raise UEBERLAUF;
end if;
end select;
end loop;
end STELLEN;



Aufgabe 4: Prozeßsynchronisation (15 Punkte)

Gegeben Sei eine "diebstahlsichere" Tankstelle, in der nach folgenden Regeln bedient wird:

Entwerfen Sie die Konzeption für eine Nachbildung dieses Ablaufes mit Prozessen in Ada. Kunden, Tankwart und Zapfsäule sollen jeweils durch einen Prozeß modelliert werden.

a) (3 Punkte)

Geben Sie zuerst die Spezifikationen der Prozesse an.

Lösungsvorschlag:
task KUNDE is
end KUNDE;

task TANKWART is
entry BEZAHLEN(BETRAG: GELD_T);
entry BENZIN(MENGE: LITER_T);
entry RESTGELD(BETRAG: out GELD_T);
end TANKWART;

task ZAPFSAEULE is
entry BERECHTIGUNG(MENGE: LITER_T);
entry PUMPE;
end ZAPFSAEULE

b) (6 Punkte)

Geben Sie die Implementierungen der Prozesse an. Es genügt die Darstellung der Interaktionen zwischen den Prozessen in Ada, von allen weiteren Einzelheiten wird abstrahiert.


Lösungsvorschlag:
task body KUNDE is
ZAHLEN, REST: GELD_T;

begin
loop
-- Geld zusammenkratzen
TANKWART.BEZAHLEN(ZAHLEN);
ZAPFSAEULE.PUMPE;
TANKWART.RESTGELD(REST);
end loop;
end KUNDE;

task body TANKWART is

ZAHLEN, REST: GELD_T;
MAXMENGE, ISTMENGE: LITER_T;

begin
loop

accept BEZAHLEN(BETRAG: GELD_T) do
ZAHLEN:=BETRAG;
end BEZAHLEN;

-- maximale Benzinmenge berechnen
ZAPFSAEULE.BERECHTIGUNG(MAXMENGE);
accept BENZIN(MENGE: LITER_T) do
ISTMENGE:=MENGE;
end BENZIN;

-- Restgeld berechnen
accept RESTGELD(BETRAG: out GELD_T) do
BETRAG:=REST;
end RESTGELD;
end loop;
end TANKWART;

task ZAPFSAEULE is

MAXMENGE, ISTMENGE: LITER_T;

begin
loop
accept BERECHTIGUNG(MENGE: LITER_T) do
MAXMENGE:=MENGE;
end BERECHTIGUNG;
accept PUMPE do
-- Tanken bis voll oder MAXMENGE erreicht
end PUMPE;
TANKWART.BENZIN(ISTMENGE);
end loop;
end ZAPFSAEULE;

c) (4 Punkte)

Kann es in dem von Ihnen entworfenen Ada-Programm zu Verklemmungen kommen? Geben Sie mindestens zwei Möglichkeiten an, wie Sie Verklemmungen erkennen und beseitigen könnten. Schätzen Sie den Aufwand für diese Maßnahemn ab.

d) (2 Punkte)

Erklären sie kurz, wie Ihr Programm modifiziert werden muß, um mehrere Kunden berücksichtigen zu können. Wie können Sie erreichen, daß Kunden bevorzugt bedient werden, die das Restgeld ausbezahlt bekommen?


Aufgabe 5: Peripherieanbindung, Echtzeitabhängigkeit (20 Punkte)

In einem Flugzeug wird das Erfassen und Anzeigen von Beschleunigungsdaten betrachtet: ein Sensor liefert mit hoher Frequenz Meßwerte, diese Werte werden einerseits weiterverarbeitet und andererseits im Cockpit angezeigt. Die Anzeige kann wegen der Trägheit des menschlichen Auges mit einer niedrigeren Frequenz erfolgen.

Die Steuerung soll mit zwei Ada-Prozessen durchgeführt werden:

-task EINLESEN

-task ANZEIGEN

Der Prozeß EINLESEN liest die Werte über eine parallele Schnittstelle durch Hardware-Unterbrechungen gesteuert ein. EINLESEN stellt den jeweils aktuellsten Wert anderen Prozessen zur Verfügung. Der Prozeß ANZEIGEN gibt zyklisch alle 50 ms den aktuellsten Wert aus.

Das Datenregister der parallelen Schnittstelle befindet sich an der Adresse hexadezimal FFF58000 plus einem Offset von hexadezimal A1. Die Bits 0..11 des Registers werden für die Zahlendarstellung des Meßwertes benutzt (Bit 0 ist LSB). Der Unterbrechungsvektor befindet sich an der Adresse oktal 500. Die Unterbrechung wird ausgelöst, wenn ein gültiger Datenwert vorliegt.

In beiden Prozessen wird die Einhaltung von Zeitschranken überprüft: der Prozeß EINLESEN soll eine Ausnahme auslösen, falls nach einer längeren Periode als 10 ms kein neuer Meßwert vom Sensor übermittelt wurde und der Prozeß ANZEIGEN soll eine Ausnahme auslösen, falls zwischen zwei Ausgaben mehr als 150 ms liegen.

Hinweise: Weitere Prozesse zur Zeitüberwachung sind nicht notwendig. Für den Prozeß ANZEIGEN reicht es aus, wenn die Überprüfung der Zeitbedingung jeweils nach der Ausgabe erfolgt.

a) (1 Punkt)

Stellen Sie die Prozeßstruktur mit den Eintrittspunkten und Kommunikationsbeziehungen grafisch dar.

b) (3 Punkte)

Geben Sie die Prozeßspezifikationen an. (Hinweis: Typen und Variablen zum Einlesen des Datenwertes sollen erst im nächsten Aufgabenteil angegeben werden.)


Lösungsvorschlag:
task EINLESEN is
entry BESCHL(WERT: out WERT_T);
entry NEU;
for NEU use at 8#500#;
end EINLESEN;

task ANZEIGEN is
end ANZEIGEN;

c) (4 Punkte)

Zum Einlesen des Meßwertes sollen die hardwarenahen Sprachkonzepte von Ada eingesetzt werden. Geben Sie die notwendigen Typ- und Variablenvereinbarungen an.

d) (6 Punkte)

Geben Sie den Prozeßrumpf von EINLESEN an. Berücksichtigen Sie die Zeitüberwachung und das Auslösen einer Ausnahme bei Zeitüberschreitungen. (Hinweis: Die Zeit zum Ausführen des Programms und zum Einlesen der Meßwerte sowie mögliche Prozeßwechsel sollen bei der Zeitüberwachung beachtet werden.)


Lösungsvorschlag:
with CALENDAR; use CALENDAR;
task body EINLESEN is

MESSZEIT: TIME;
MESSUNG_TIMEOUT: exception;

begin
loop
select
accept BESCHL(WERT: out WERT_T) do
WERT := TMP_REG.WERT;
end BESCHL;
or
accept NEU do
TMP_REG:=REGISTER;
MESSZEIT:=CLOCK;
end NEU;
or
delay 0.01-(CLOCK-MESSZEIT);
raise MESSUNG_TIMEOUT;
MESSZEIT:=CLOCK
end select;
end loop;

exception
when MESSUNG_TIMEOUT => Fehlerbehandlung
end EINLESEN;

e) (6 Punkte)

Geben Sie den Prozeßrumpf von ANZEIGEN an. Berücksichtigen Sie die Zeitüberwachung und das Auslösen einer Ausnahme bei Zeitüberschreitungen. (Hinweis: Die Zeit zum Ausführen des Programms und zum Einlesen der Meßwerte sowie mögliche Prozeßwechsel sollen bei der Zeitüberwachung beachtet werden.)

Lösungsvorschlag:
with CALENDAR; use CALENDAR;
task body ANZEIGEN is

WERT: WERT_T;
MAX_ZEITPUNKT: TIME:= CLOCK+0.05;
ANZEIGE_TIMEOUT exception;

begin
loop
EINLESEN.BESCHL(WERT)
-- Anzeigen des Wertes
if CLOCK>MAX_ZEITPUNKT+0.1 then
raise ANZEIGE_TIMEOUT;
end if;
delay MAX_ZEITPUNKT-CLOCK;
MAX_ZEITPUNKT:=MAX_ZEITPUNKT+0.05
end loop;

exception
when ANZEIGE_TIMEOUT => Fehlerbehandlung
end STELLEN;



Aufgabe 6: Prozeßsynchronisation (20 Punkte)

Das Abfertigen von Zügen in einem Berliner U-Bahnhof soll durch ein Ada-Programm nachgebildet werden. Betrachtet wird das Ein- und Ausfahren der Züge, der mit "preußischer Liebenswürdigkeit" agierende Abfertiger und die Fahrgäste. Die folgenden Abstimmungen sind zwischen Zug, Abfertiger und Fahrgästen nötig:

Das Programm soll aus den folgenden 3 Ada-Prozessen bestehen:

a) (2 Punkte)

Entwerfen Sie die Prozeßstruktur und stellen Sie diese grafisch dar. Die Grafik soll die Eintrittspunkte und Kommunikationsbeziehungen enthalten.

b) (3 Punkte)

Geben Sie die Prozeßspezifikationen an.


Lösungsvorschlag:
task ZUG is
entry AUSFAHREN;
entry NOTBREMSE;
end ZUG;

task ABFERTIGER is
entry ANMELDUNG;
entry EINGEFAHREN;
end ABFERTIGER;

task FAHRGAESTE is
entry VORSICHT;
entry EINSTEIGEN;
entry ZURUECKBLEIBEN;
end FAHRGAESTE;

c) (3 Punkte)

Geben Sie den Prozeßrumpf von ZUG an.

Lösungsvorschlag:
task body ZUG is

begin
loop
ABFERTIGER.ANMELDUNG;
-- Einfahren
ABFERTIGER.EINGEFAHREN;
-- Tuer oeffnen
FAHRGAESTE.EINSTEIGEN;
select
accept NOTBREMSE do
-- auf Situation reagieren
end NOTBREMSE;
else
accept AUSFAHREN do
end AUSFAHREN;
-- TschTschTsch...
end select;
end loop;
end ZUG;

d) (4 Punkte)

Geben Sie den Prozeßrumpf von ABFERTIGEN an.


Lösungsvorschlag:
task body ABFERTIGER is

begin
loop
accept ANMELDUNG do
end ANMELDUNG;
FAHRGAESTE.VORSICHT;
accept EINGEFAHREN do
end EINGEFAHREN;
FAHRGAESTE.ZURUECKBLEIBEN;
ZUG.AUSFAHREN;
end loop;
end ABFERTIGER;

e) (4 Punkte)

Geben Sie den Prozeßrumpf von FAHRGAESTE an.


Lösungsvorschlag:
task body FAHRGAESTE is

begin
loop
accept VORSICHT do
-- Ansage: "Vorsicht ..."
end VORSICHT;
accept EINSTEIGEN do
-- in den Zug einsteigen
end EINSTEIGEN;
accept ZURUECKBLEIBEN do
-- Ansage: "Zurueckbleiben!"
end ZURUECKBLEIBEN;
if -- Gefahrensituation then
ZUG.NOTBREMSE;
end if;
end loop;
end FAHRGAESTE;

f) (3 Punkte)

Falls sich nach der Ansage "Zurückbleiben" und vor der Abfahrt des Zuges eine Gefahrensituation ergibt, kann die Abfahrt von den Fahrgästen verhindert werden. Dazu wird die Notbremse gezogen. Wie muß Ihre Implementierung verändert werden, um dieses nachzubilden?

g) (1 Punkt)

Kann es nach der Änderung in f) zu Verklemmungen zu kommen? Begründung?