![]() |
PEARLProcess and Experiment Automation Realtime Language |
|
| Home Einführung Literatur Ausbildung FAQ User-Group | ||
InhaltGrundlegende Datentypen und Sprachstrukturen Bessere Hardwareunabhängigkeit Einplanung auf Ereignisse und Zeitpunkte |
Die Echtzeit- und Multitasking-Programmiersprache PEARL
Der Name PEARL steht für Process and Experiment Automation Realtime Language und darf nicht mit Perl, der Practical Extraction and Report Language, verwechselt werden. PEARL ist eine höhere Programmiersprache, die eine komfortable, sichere und weitgehend rechnerunabhängige Programmierung von Multitasking- und Echtzeit-Aufgaben erlaubt, und wurde seit 1977 in verschiedenen Entwicklungsstufen genormt, zuletzt 1998 als PEARL-90 (DIN 66253-2 1998, Berlin, Beuth-Verlag, 1998). Wichtiger Grundsatz bei der Entwicklung von PEARL war, neben einer möglichst leichten Abbildbarkeit der prozeßrechentechnischen Probleme, die einfache Erlernbarkeit für den Programmierer. Jeder, der schon eine prozedurale Programmiersprache kennt, wird sich in sehr kurzer Zeit mit PEARL anfreunden können. Alle grundlegenden Datentypen und Sprachstrukturen anderer prozeduraler Programmiersprachen sind in PEARL vorhanden (<). PEARL bietet darüber hinaus komfortable Sprachelemente zur Bearbeitung von Multitasking- und Echtzeitaufgaben (<). Grundlegende Datentypen und SprachstrukturenDatentypen:
Blockstruktur, Gültigkeit von Objekten:
Kontrollstrukturen:
Genaue Informationen über den Aufbau von PEARL sind in
enthalten. Bessere HardwareunabhängigkeitUm eine Entkopplung von hardwareabhängigen Komponenten, wie z.B. Ein-/ und Ausgabeschnittstellen, zu dem hardwareunabhängigen Programm zu erreichen, wird ein PEARL-Modul in zwei Sektionen unterteilt:
Multitasking-AnweisungenDem Betriebssystem bekannte Tasks können aus einem PEARL-Programm beliebig in ihrem Zustand verändert werden.
Einplanung auf Ereignisse und ZeitpunkteDie Aktivierung und die Fortsetzung von Tasks läßt sich auch an externe Erignisse oder Zeitpunkte bedingt ausführen. Einplanungen zu einer festen Uhrzeit, aber auch Einplanungen beim Auftreten äußerer Ereignisse (Interrupts), sind möglich.
Tasksynchronisation zur Verhinderung von Inkonsistenzen
Eine Synchronisation von Tasks ist immer dann notwendig, wenn diese Daten gemeinsam nutzen. Die drei folgenden Beispiele zeigen, wie sich mit Hilfe von Semaphor-(<) und Boltvariablen(<) Tasks synchronisieren lassen. Beabsichtigt eine Task A den Zugriff auf einen Datensatz, der gerade von einer TASK B bearbeitet wird, so blockiert das Betriebssystem die Task A solange, bis B die Daten freigibt. Bei Semaphoren erlaubt PEARL an Stelle einer Blockade auch das Testen mit Eintritt bei Freiheit (Schlüsselwort
Kritische PfadeKritische Pfade entstehen, wenn 2 Tasks gleichzeitig auf gemeinsame Objekte zugreifen wollen. Mit Hilfe von Semaphor-Variablen(<) kann ein begonnener Zugriff ungehindert beendet werden, ohne von anderen Tasks unterbrochen zu werden, die ebenfalls zugreifen wollen.
PROBLEM;
DCL A CHAR(255); ! String: 255 Bytes
DCL SEMVAR SEMA PRESET(1); ! Init: Zugriff erlaubt
DCL FAILED FIXED INIT(0);
T1: TASK;
DCL B1 CHAR(255);
REQUEST SEMVAR; A=B1; RELEASE SEMVAR;
END;
T2: TASK;
DCL B2 CHAR(255);
REQUEST SEMVAR; A=B2; RELEASE SEMVAR;
END;
TEST: TASK;
IF TRY SEMVAR THEN
RELEASE SEMVAR; !Semaphor wieder freigeben
ELSE
FAILED=FAILED+1;
FIN;
! Selbstaktivierung nach 10 Sekunden
AFTER 10 SEC ACTIVATE TEST;
END;
Producer-Consumer-SchemataProduziert eine Task A Daten, die zur Weiterverarbeitung durch eine oder mehrere andere Tasks vorgesehen sind, so spricht man von einem Producer-Consumer-Schema. Hier ein Beispiel eines Ringspeichers mit 1024 Zeichen, von denen die lesende Task immer 2 gleichzeitig braucht.
PROBLEM; DCL PLATZDA SEMA PRESET(1024); ! Init: 1024 frei DCL ZEICHENDA SEMA PRESET(0); ! Init: Am Anfang leer HOLDATEN: TASK; REQUEST ZEICHENDA; REQUEST ZEICHENDA; HOLE_ZWEI_ZEICHEN_AUS_DEM_RINGPUFFER; RELEASE PLATZDA; RELEASE PLATZDA; END; SCHREIBDATEN: TASK; REQUEST PLATZDA; SCHREIB_EIN_ZEICHEN_IN_RINGPUFFER; RELEASE ZEICHENDA; END; Producer-Consumer-Schemata entstehen auch bei der Meßwerterfassung und der Automatisierung von Fertigungsprozessen.
Datenbanken
Möchte der Programmierer erlauben, daß mehrere Tasks gleichzeitig einen Datensatz lesen dürfen (im Beispiel die Tasks
PROBLEM; DCL A CHAR(255); ! String: 255 Bytes DCL BOLTVAR BOLT; ! Default: frei LESER1: TASK; DCL L1 CHAR(255); ! ENTER erlaubt, dass alle weiteren Tasks mit ENTER ! ebenfalls weiterlaufen koennen ENTER BOLTVAR; L1=A; LEAVE BOLTVAR; END; LESER2: TASK; DCL L2 CHAR(255); ENTER BOLTVAR; L2=A; LEAVE BOLTVAR; END; SCHREIBER1: TASK; DCL S1 CHAR(255); ! Nach einem RESERVE laeuft eine Task nur weiter, ! wenn kein anderer Leser oder Schreiber einen ! ENTER/RESERVE durchgefuehrt hat. RESERVE BOLTVAR; A=S1; FREE BOLTVAR; END; SCHREIBER2: TASK; DCL S2 CHAR(255); RESERVE BOLTVAR; A=S2; FREE BOLTVAR; END; Ein- und Ausgabe
PEARL sieht für die verschiedenen Ein- und Ausgabeformen jeweils eigene Schlüsselworte vor. In den folgenden Beispielen steht eine
Die Größenangaben in einzelnen Formatanweisungen können neben Konstanten auch durch Variablen und Funktionsaufrufe festgelegt werden und müssen nicht schon zur Compilezeit bekannnt sein. Spezielle Datentypen
|
23.03.2010 Thomas Probol, Stefan Eilers, Torsten Lilge (e-mail) Impressum