Sichere Software

Stabile Embedded-Systeme mit der Programmiersprache Ada

26.05.12 | Autor / Redakteur: Johannes Kanig * / Hendrik Härter

Umweltsattelit: Die Steuerungssoftware muss sich besonderen Anforderungen stellen. Mit der Programmiersprache Ada lässt sich sicherheits- und missionskritische Software entwickeln. (Im Bild der Umwelt-satellit ENVISAT)
Umweltsattelit: Die Steuerungssoftware muss sich besonderen Anforderungen stellen. Mit der Programmiersprache Ada lässt sich sicherheits- und missionskritische Software entwickeln. (Im Bild der Umwelt-satellit ENVISAT) (Foto: DLR)

Mit der Programmiersprache Ada lässt sich sicherheits- und missionskritische Software entwickeln, wovon Embedded-Systeme profitieren sollen. Wir stellen Ihnen die Programmierumgebung vor.

Was haben ARGOS, ein Satellitenprogramm zur Sammlung von Umweltdaten, und das Trägheitsnavigationssystem des Airbus 350 XWB miteinander gemeinsam? Beide stellen besondere Anforderungen an ihre Steuerungssoftware, die sehr sicher und in Echtzeit reagieren muss, und deren eventuelle Fehler viel Geld oder sogar Menschenleben kosten können. In beiden Fällen ist die Software missionskritisch, wenn beispielsweise durch einen Fehler der Satellit verloren gehen kann oder sicherheitskritisch, wenn durch einen Fehler die Passagiere des Airbus in Gefahr geraten. Beide Systeme haben noch etwas gemeinsam: sie sind in Ada geschrieben.

Ergänzendes zum Thema
Adacore: Software-lösungen für Ada

Ein Trägheitsnavigationssystem stellt hohe Anforderungen an seine Embedded-Applikationen, die sehr Hardwarenah laufen. Dabei wird auf Sicherheit größter Wert gelegt. Die Anwendung darf unter keinen Umständen abstürzen und sollte ihre Funktion erfüllen sowie maximale Reaktionszeiten strikt einhalten. Für sicherheitskritische Anwendungen werden in der Regel vor dem eigentlichen Entwicklungsprozess genaue High-Integrity-Anforderungen aufgeschrieben, denen der Programmcode dann entsprechen muss. Natürlich ist es für den Programmierer einfacher, wenn die Sprache direkt Konstruktionen anbietet, die bestimmten Arten von Anforderungen entsprechen.

Lesbarer Code vermeidet Fehler beim programmieren

Die Entwickler der Programmiersprache Ada haben stets besonderen Wert auf Lesbarkeit und Wartbarkeit gelegt. Das äußert sich unter anderem in syntaktischen Unterschieden mit Sprachen wie C oder Java. Zum Beispiel verzichtet Ada völlig auf geschweifte Klammern, und nutzt stattdessen leicht lesbare Schlüsselwörter, um Blöcke zu kennzeichnen. So werden if-Blöcke mit einem "end if", und Schleifen mit einem "end loop" abgeschlossen. Im Allgemeinen vermeidet Ada Symbole, wo Schlüsselwörter Sinn ergeben. So wird auch der in C übliche Stern zur Bezeichnung von Zeigern durch das Schlüsselwort "access" ersetzt. Ada beachtet Groß- und Kleinschreibung nicht, um Verwechslung von zu ähnlichen Bezeichnern zu vermeiden. Und schließlich vermeidet Ada die in Java und C verbreitete Praxis, oktale Zahlen mit einer führenden Null darzustellen.

Neben diesen syntaktischen Unterschieden gibt es auch viele semantische Hilfen, um lesbare und besser wartbare Programme zu schreiben. So wird die Relation zwischen einer Funktion und ihren Parametern durch Schlüsselwörter wie "in" (nur lesen), "out" (nur schreiben) oder "in out" (beides) dokumentiert. Ada ist im Gegensatz zu C eine stark getypte Sprache: Typkonversionen, die zu Laufzeitfehlern führen können, müssten explizit geschrieben werden. Ada erlaubt im Gegensatz zu manchen anderen Sprachen die Einführung von benutzerdefinierten Integertypen, die Absichten des Programmierers dokumentieren ("Diese Variable enthält Zahlen zwischen 1 und 100") und die korrekte Ausführung mit Laufzeitüberprüfungen sicherstellen. Diese semantischen Eigenschaften erleichtern den direkten Vergleich des Programmcodes mit den an ihn gestellten Anforderungen.

Besonderheiten bei der Embedded-Programmierung

Bei Echtzeitanwendungen handelt es sich meist um parallele Anwendungen, denn in der Regel werden mehrere Berechnungen gleichzeitig durchgeführt und neue Ereignisse verarbeitet. In diesem Kontext ist es besonders wichtig, dass Reaktionszeiten der Software auf Ereignisse garantiert werden können. Hier ist es nützlich, dass Ada einfache Sprachfeatures zur Beschreibung von parallelen Prozessen bereitstellt. Es ist entscheidend, dass Ada keinen Garbage Collector benötigt, der den Programmablauf verzögern könnte. Ein manueller Umgang mit Threads ist also nicht nötig. Unvorhersehbare Latenzzeiten, die bei sicherheitskritischen Anwendungen unakzeptabel sind, werden ausgeschlossen. Ein weiteres Argument für den Einsatz von Ada im Embedded-Bereich ist seine Fähigkeit zur Low-Level-Programmierung. Damit kann beispielsweise die genaue Auslegung einer Datenstruktur im Speicher festgelegt werden. Als gefährlich erachtete Low-Level-Features wie zum Beispiel das Auslesen beliebiger Speicherbereiche oder auch die in C beliebte Pointerarithmetik sind in Ada nur unter Umgehung des Typsystems möglich.

Ada – Die Programmiersprache ohne Überraschungen

Ada wird oft als Sprache "ohne Überraschungen" bezeichnet. Mechanismen zur Programmstrukturierung, wie es sie in Ada gibt, also ein Objektsystem oder ein Paketsystem, sind sehr hilfreich, wenn es darum geht, umfangreiche Programme zu schreiben. Der Ada-Standard sieht sogenannte Pragma-Restriktionen vor, mit denen festgelegt werden kann, ob Features der Sprache ausgeschlossen werden sollen. Damit lassen sich interne Coding-Standards überprüfen. Dieses Feature kann man mit dem Standard MISRA-C/C++ vergleichen, der versucht, eine "sichere" Teilmenge von C beziehungsweise C++ zu definieren. Ada bietet den Vorteil, dass viele Konstrukte, von denen MISRA abrät, gar nicht geschrieben werden können und dank des starken Typsystems mehr Überprüfungen möglich sind.

Die Programmiersprache Ada gibt es seit dem Beginn der achtziger Jahre. Die damalige Version Ada 83 enthielt bereits eine gute Basis für die strukturierte und modulare Programmierung, wie ein Paketsystem, das die Kapselung von Daten und Algorithmen ermöglicht. Seitdem hat sich Ada kontinuierlich weiterentwickelt. So erschien 1995 der Ada-95-Standard, der die Sprache um ein Objektsystem erweiterte. Der nächste Standard Ada 2005 brachte Verbesserungen im Umgang mit Zeigern, die als konstant oder auch als "not null" deklariert werden können. Das stellt vor allem eine umfangreiche Erweiterung der Standardbibliothek dar, die nun auch Container enthält. Das Objektsystem wurde um das Interface-Konzept erweitert, so dass nun auch Mehrfachvererbung möglich ist.

Was ist neu im Standard 2012?

Der nächste Standard ist für 2012 vorgesehen. Darin sind die aus der Programmiersprache Eiffel bekannten Verträge (contracts) vorgesehen, die jeder Funktion zwei Boolesche Ausdrücke hinzufügen können, die vor oder nach Ausführung der Funktion wahr sein sollen. Diese Ausdrücke sind im Idealfall direkt von den Anforderungen an die Software abgeleitet. Sie können als formale Dokumentation, als zusätzliche Überprüfungen zur Laufzeit oder als Ausgangspunkt für statische Analysen dienen. Eine weitere Neuerung ermöglicht die Definition von Typen mit so genannten Invarianten. Damit sind Boolesche Ausdrücke gemeint, die für Werte dieses Typs immer wahr sind. Schließlich gibt es viele andere Weiterentwicklungen wie eine Python-ähnliche Syntax zur Iteration über Container, und Verbesserungen im plattformübergreifenden Umgang mit nebenläufigen Prozessen und Multiprozessoren.

* Johannes Kanig ist Senior Software Engineer bei AdaCore.

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Spamschutz 

Bitte geben Sie das Ergebnis der Rechenaufgabe (Addition) ein:
Kommentar abschicken

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 33431680) | Fotos: DLR

Softwareengineering-Report abonieren

4 mal jährlich: Die kostenlose Pflichtlektüre für Embedded­-Software- und Systems-Entwickler, von Analyse bis Wartung und Betrieb

* Ich bin mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung und AGB einverstanden.
Spamschutz:
Bitte geben Sie das Ergebnis der Rechenaufgabe (Addition) ein.
Heftarchiv
ELEKTRONIKPRAXIS 16/2014

ELEKTRONIKPRAXIS 16/2014

Ideen-Board für Spansions FM ARM Cortex-M MCUs

Weitere Themen:

Geld verdienen mit sozialen Medien
Hardware für digitale Hörgeräte
Chips für smarte Stromversorgung

zum ePaper

zum Heftarchiv

ELEKTRONIKPRAXIS 15/2014

ELEKTRONIKPRAXIS 15/2014

Das Internet of Things ist mehr als die Summe seiner Teile

Weitere Themen:

Welches Display ist das richtige?
Datenmanagement mit C-Controller
Sicherungen für die Raumfahrt

zum ePaper

zum Heftarchiv

ELEKTRONIKPRAXIS 14/2014

ELEKTRONIKPRAXIS 14/2014

Wenn Optik und Haptik eines Displays entscheiden

Weitere Themen:

Verbesserte SiCLeistungs- MOSFETs
Theorie versus Prozesstoleranzen
Hardware Monitoring

zum ePaper

zum Heftarchiv