Hochsprachenentwicklung für Intel-iAPX-86:

Pearl-86 macht Mikro zum Echtzeit-Rechner

17.05.1985

MÜNCHEN - Mikros dringen im Zuge der Dezentralisierung immer stärker in den Bereich der zeitkritischen Anwendungsgebiete. In diesem Bereich wird auf verschiedenen Rechneranlagen die Echtzeitprogrammiersprache "Pearl", eine deutsche Entwicklung, eingesetzt. Dr. P. Heine vom Fraunhoferinstitut aus Karlsruhe beschreibt in seinem Beitrag "Pearl-86", eine Sprachversion, die auf dem Intel-Chip iAPX-86 Iäuft.

Pearl-86 ist eine Implementierung der höheren Echtzeitsprache Pearl auf Intel iAPX-86 basierenden Mikrocomputersystemen durch das Institut für Daten- und Informationsverarbeitung (IITB) der Fraunhofergesellschaft, Karlsruhe und das Softwarehaus W. Werum, Lüneburg. Das Softwareprodukt, bestehend aus einem Compiler und einem Satz von Laufzeitroutinen, baut auf Intel-Standardsoftware auf. Es ist unter dem Intel-Betriebssystem RMX-86 (und künftig RMX-286) ablauffähig und damit auch unmittelbar auf der iAPX-86-basierenden Hardware der Intel 310/330er Systeme.

Als höhere Echtzeitsprache ist diese Entwicklung besonders geeignet für das Programmieren technischer Prozesse, das heißt für Anwendungen die von äußeren oder zeitlich abhängigen Ereignissen gesteuert werden und deren Aufgabe es ist, die Prozeßperipherie eines Rechners zu steuern und zu überwachen. Eine dafür geeignete Sprache muß neben Sprachmitteln, die es erlauben, äußere Ereignisse einzuplanen, über eine interne Uhr verfügen, um auch zeitlich gesteuerte Ereignisse berücksichtigen zu können. Ferner muß sie die Möglichkeit des (quasi-)parallelen Ablaufs einzelner Teile (Tasks) des Gesamtprogramms bieten sowie explizite Sprachmittel, um diese untreinander zu synchronisieren. Die Möglichkeit, ein Programm bei gleichbleibender Funktionalität leicht an eine geänderte Peripherie anpassen zu können, ist eine weitere Forderung an eine Echtzeitsprache, ebenso wie die Forderung nach reichhaltigen Möglichkeiten der Standard-Ein-/-Ausgabe zur Dialogführung und dem Speichern und Protokollieren der Prozeßdaten. Anwendungsbeispiele für eine besonders geeignete Programmierung in Pearl-86 sind generell Aufgaben der Fabrikautomation, der Laborautomation oder der rechnergesteuerten Regelung.

Um solchen Anforderungen gerecht zu werden, ist ein Pearl-86-Programm modular aus Übersetzungseinheiten (Modulen) aufgebaut, die aus einem System- und/oder Problemteil bestehen. Alle Hardware-abhängigen Anteile befinden sich im Systemteil. Dieser enthält die physikalischen Namen aller Standard- und Nicht-Standardgeräte. Der Problemteil beinhaltet nur logische Name. Er enthält ferner die Programmenweisungen innerhalb von Prozeduren oder Tasks. Daten können auf jeder Hierarchiestufe deklariert werden - mit einem Gültigkeitsbereich lokal zu einem Block, einer Prozedur oder Task oder global zu einem oder mehreren Moduln.

Variable für exklusiven und geteilten Zugriff

Ein quasi paralleler Ablauf ist durch das Konstrukt von prioritätsgesteuerten Tasks gegeben. Eine reiche Anzahl von Funktionen (zum Aktivieren, Suspendieren, Fortsetzen, Ausplanen, Beenden) von Tasks erlaubt unmittelbare Einplanungen (zum Beispiel durch SUSPEND "task") oder zeitlich verzögerte, einmal oder zyklisch (zum Beispiel AFTER "Zeit" Activate "task" oder ALL "tin(..)" CONTINUE "task") oder ereignisgesteuerte Einplanungen (zum Beispiel WHEN "interrupt" ACTIVATE "task").

Zur Synchronisation bietet die neue Sprachversion SEMAPHOR- und BOLT-Variablen für einen exklusiven wie auch geteilten Zugriff zu gemeinsam benutzten Daten.

Die Standard-Ein-/-Ausgabe erfolgt nach einem geräteunabhängigen Dation-Konzept, wobei Dations verallgemeinerte Geräte sind, die physikalisch vorhandene oder logische Ein-/-Ausgabe-Einheiten repräsentieren. Als Beispiel kann ein Datensatz in gleicher Weise eine Dation sein wie eine Platte oder ein Bildschirm.

Pearl-86 verfügt über eine große Anzahl vordefinierter Datentypen. Diese unterstützen wesentlich ein fehlerfreies Programmieren.

Wer die Szene der Echtzeitprogrammierung kennt, der hat sicher schon von Pearl gelesen und der kennt auch die oben aufgeführten Funktionen von den meisten neueren Echtzeitbetriebssystemen. Dies provoziert natürlich eine Reihe weiterer Fragen wie zum Beispiel: Welche Vorteile bietet eine höhere Echtzeitsprache, wenn die Funktionen bereits in den existierenden Betriebssystemen vorhanden sind? Und der, der weiß, wie hoch der Aufwand für eine Pearl-Implementierung ist, wird sich vielleicht fragen: Pearl-86 - rentiert sich die Investition?

Portabilität von Vorteil

Zunächst zur Frage, was eine höhere Echtzeitsprache an Vorteilen bietet gegenüber dem ausschließlichen Vorhandensein von Echtzeitfunktionen in einem Betriebssystem. Die Antwort ist: drastisch erhöhte Sicherheit, Einfachheit, Portabilität und dadurch unmittelbar Zeit und Kostenersparnis.

Denn Fehlprogrammierung in einer höheren Sprache ist weitgehend bereits durch den Compiler abprüfbar. Dies ist nicht möglich, wenn die Funktionen nur als Parameter eines Systemprozeduraufrufes auftreten. Als Beispiel mag die Pearl-86-Anweisung SUSPEND TESTDRUCK dienen, die eine Anweisung für den Übergang der Task TESTDRUCK in den Zustand "suspendiert" ist. Diese kann durch den Compiler auf Konsistenz überprüft werden. Das ist jedoch nicht möglich, wenn die Anweisung etwa durch einen Betriebssystemaufruf SVC(3,0) gegeben ist, wobei 3 für "Suspendieren" und 0 für "eigene Task" (die Task TESTDRUCK) steht. Wie oben bereits erwähnt, verfügt die Sprache über eine große Anzahl vordefinierter Datentypen, was ein hohes Maß an Sicherheit durch Typenprüfung bietet.

Eine weitere drastische Reduktion der Fehlermöglichkeiten ist bei einer höheren Sprache durch die Kompaktheit oder Mächtigkeit ihrer Anweisungen gegeben. Denn, wenn man anstatt einer Anweisung in einer auf die Problematik der zu programmierenden Aufgabe zugeschnittenen Sprache ein Vielfaches an Anweisungen in einer niedrigeren, problemunangepaßten Sprache benötigt, dann erhöht sich dadurch natürlich die Wahrscheinlichkeit, Fehler zu machen.

Logische Fehler reduzieren

Und als letzten wesentlichen Grund für die drastisch erhöhte Sicherheit der Programmierung von Echtzeitanwendungen durch eine höhere Echtzeitsprache möchte ich die wesentlich bessere Lesbarkeit anführen. Sie wird zu einer starken Reduktion von logischen Fehlern beitragen - der Klasse der schwerwiegendsten Fehler überhaupt.

Zur "Portabilität" ist zu sagen, daß eine höhere Sprache natürlich in hohem Grad rechnerunabhängig ist. Allerdings ist in der Praxis eine derart globale Übertragbarkeit nur dann gegeben, wenn für die entsprechenden Rechner Sprachimplementierungen vorhanden sind. Eine weitere Art der Portabilität - nämlich die innerhalb einer Produktreihe eines Herstellers - wird im folgenden bei der Beschreibung der Art und Weise der Implementierung von Pearl-86 näher erläutert werden.

Da jede Sprachimplementierung auf einem neuen Prozessor, unter Ausnutzung seiner speziellen Vorteile, einen erheblichen Aufwand erfordert, war bei der Implementierung von Pearl-86 eine wichtige Frage, wie sie für den Anwender wirtschaftlich gemacht werden kann. Als Antwort darauf baut die Implementierung der Echtzeitsprache soweit wie möglich auf bestehende Intel Standardsoftware auf; dies gilt sowohl für den Compiler, wie auch für das Laufzeitsystem. Dahinter steht die Idee, daß durch ein solches Vorgehen eine einmalige Implementierung auch gültig sein soll für alle künftigen Prozessorentwicklungen derselben Produktreihe. Dabei wird vorausgesetzt, daß für jeden neuen Prozessor auch die Lieferung kompatibler Software garantiert ist. Eine weitere Grundvoraussetzung für eine Sprachimplementierung, die nicht unmittelbar auf der vorhandenen Hardware, sondern auf den vom Hersteller mitgelieferten Softwareprodukt basiert ist, daß diese Standardsoftware auch ausreichend viele nutzbare Funktionen bietet. Im Falle der Pearl-86-Implementierung für die iAPX-86er Familie ist dies gegeben: Intel bietet für diese Prozessorfamilie neben einer Reihe von Dienstprogrammen das RMX-86-Betriebssystem an (angekündigt RMX-286), mit einer dazugehörigen Sprachfamilie (Pascal-86, ASM-86). Weiterhin bietet das RMX-86 Betriebssystem eine große Anzahl von Funktionen, auf welche Pearl-86-Anweisungen leicht abgebildet werden können. Dies gilt für die Standard-Ein-/-Ausgabe, aber auch für Task- und Synchronisations-Anweisungen. Betreffend die Compiler-lmplementierung wurde ebenfalls der Gedanke verfolgt, die Sprache nicht unmittelbar auf den Prozessor abzubilden (das heißt, Maschinensprache für den iAPX-86, iAPX-286 etc. zu erzeugen), sondern Pearl-86 in das Intel PASCAL-86 abzubilden. Dies ist so zu verstehen, daß aufgrund der ähnlichen blockorientierten Struktur der beiden Hochsprachen im wesentlichen die statische Struktur der einen Hochsprache in die der anderen abgebildet wird. Jedoch wird die Dynamik der Pearl-86 Sprache (soweit sie nicht in PASCAL-86 vorhanden ist, wie zum Beispiel durch alle echtzeit-, task-, synchronisation-spezifischen Anweisungen) in RMX-86-Betriebssystem- oder Laufzeitroutinen-Aufrufe abgebildet.

Zusammengefaßt baut das Ablaufsystem dieser Echtzeitsprache auf dem Intel-RMX-86-Betriebssystem auf. Der Compiler bildet Pearl-86-Programme in PASCAL-86-Programme (mit RMX-86 Aufrufen) ab, also in eine Art "Realzeit-PASCAL-86".

Welche Vorteile bietet nun diese Art der Implementierung?

- Sie ist portabel auf alle Weiterentwicklungen der iAPX-86er Serie (iAPX-286, iAPX-386)

- Da ein Pearl-86-Programm auf ein Pascal-86-Programm mit RMX-86 Aufrufen abgebildet wird, kann die Sprache ,als ein Baustein in der RMX-86-Sprachfamilie angesehen werden. Somit können zu einem solchen Programm Benutzerroutinen dazugebunden werden, die in irgendeiner der Sprachen der RMX-86-Sprachfamilie geschrieben sind. Weiterhin können alle Standard-RMX-86-Dienstprogramme (wie zum Beispiel Linker, Locator) benutzt werden.

-Im Rahmen des RMX-86 lauft ein Pearl-86 als ein einziger RMX-86 Job ab. Er benötigt als Minimum nur eine kleine Untermenge an RMX-86 Betriebssystemfunktionen (im wesentlichen RMX-86 NUCLEUS und BASIC-I/O). Dies schränkt jedoch in keiner Weise die zusätzliche Benutzung aller noch verbleibenden Funktionen ein. So kann zum Beispiel eine für Pearl-86 generierte RMX-86-Konfiguration neben diesem Benutzerjob noch die RMX-86 "Human Interface" -Benutzerschnittstelle oder den RMX-86 Debugger und weitere Jobs enthalten. Auch können prinzipiell sämtliche zur Verfügung gestellten Treiber mitbenutzt werden.

Aus dem Vorangegangenen läßt sich nun auch die Frage beantworten, ob sich die Investition für die Anschaffung einer Pearl-Implementierung lohnt. Generell kann der Vorteil der Programmierung von Prozeßautomationsaufgaben in einer an diese Problematik angepaßten Hochsprache wohl kaum angezweifelt werden. Weiterhin ist Pearl zumindest eine der bedeutendsten Vertreterinnen dieser Sprachgattung. Dabei ist allerdings die Leistungsfähigkeit der Implementierung von großer Wichtigkeit. Dies gilt insbesondere für eine Echtzeitsprache.

Aber auch immer wichtiger werdend ist die Forderung, daß eine Sprache in eine gute Softwareengineering-Umgebung eingebunden ist. Dabei kann die, Forderung, daß für spezielle Anwendungen gewisse Spitzenleistungen gewünscht sind, sogar zweitrangig werden. Auch ist ein Purismus, der die exklusive Anwendung der einen oder anderen Sprache fordert, nicht unbedingt mehr angebracht.

Deshalb sollte eine solche Implementierung, eingegliedert in die gesamte Softwareumgebung, zum Beispiel auch erlauben, Programmteile mit einzubinden, die in anderen Sprachen geschrieben sind. Denn niemand wird derzeit ernsthaft behaupten wollen, daß irgendeine Sprache die letzte ihrer Gattung sein wird.

Wesentlich sind aber Fragen nach Kontinuität, nach Wartung, nach Portabilität auf künftige Entwicklungen. Aber auch hier sollte der Rahmen nicht allzu groß gespannt werden. Es ist kein Grund, nicht in eine gute und in die Zukunft reichende Sprachimplementierung zu investieren, weil sie derzeit nicht von allen Herstellern unterstützt wird.