Experience Embedded

Professionelle Schulungen, Beratung und Projektunterstützung

Software in Echtzeitsystemen korrekt verteilen

Autoren: Dr. Jochen Härdtlein, Kramer Simon, Peter Häfele, Dr. Dirk Ziegenbein, Robert Bosch GmbH

Beitrag - Embedded Software Engineering Kongress 2017

 

Die Lösung der Fehlerfälle, die durch nebenläufige bzw. parallele SW-Ausführung entstehen, mit traditionellen Mitteln - wie etwa Locks - führt zu großem System-Overhead und schränkt die Verteilbarkeit bzw. die effektive Nutzung der parallelen Rechenleistung massiv ein. Mit dem konstruktiven Ansatz der Logical Execution Time wird die Kommunikation von den Berechnungen entkoppelt und systemweit zeitlich strukturiert. Im vorliegenden Beitrag werden die typischen Fehlerfälle nebenläufiger Echtzeit-SW analysiert und konstruktive Mechanismen zu deren Vermeidung zusammengefasst [6]. Ebenso wird ein Ausblick auf toolgestützte korrekte Softwareverteilung gegeben.

Die nötige Leistungssteigerung für die eingebetteten Steuergeräte in Fahrzeugen kann nicht mehr wie in den vergangenen Jahrzehnten allein über eine steigende Taktfrequenz in Single-Core-Rechnern bereitgestellt werden. Neben der Entwicklung hin zu Mikrocontrollern mit Multi- bzw. Many-Core-Architekturen kommen auch Multi-µC-Lösungen oder Domänenrechner mit Mikroprozessoren zum Einsatz. Diese Rechnerarchitekturen bestehen aus einer Vielzahl von teils heterogenen Rechnerkernen, d.h. unterschiedlicher Rechenleistung bzw. Berechnungsfähigkeiten. Zusätzlich ist die zugehörige Speicherarchitektur vermehrt durch NUMA (Non-uniform Memory Access) gekennzeichnet, d.h. Zugriffsgeschwindigkeiten und Bandbreiten zwischen Rechnern und Speichern variieren. Die Anforderungen an die SW-Architektur für aktuelle und zukünftige eingebettete Systeme wird massiv von der steigenden Parallelität und der zunehmenden Heterogenität der parallelen Systeme bestimmt (siehe Abbildung 1, PDF).

Nebenläufigkeits- und Echtzeitfelder

Eingebettete Systeme – wie etwa Motorsteuerungssysteme für Verbrennungsmotoren – sind Systeme mit einer Mischung aus Event- und zeitgesteuerten Berechnungen, die ein hohes Maß an Echtzeitanforderungen haben, um die Korrektheit der implementierten Regelungen sicherzustellen. Darüber hinaus werden die Lösungen aufgrund der Komplexität verteilt entwickelt, an unterschiedlichen Standorten sowie in verschiedenen Unternehmen (OEM, TIER1, TIER2). In diesem Setup ist es notwendig zu verstehen, dass die Absicherung der Systeme mit der steigenden heterogenen Parallelität zunehmen aufwändig und komplex wird. Im ersten Schritt möchten wir daher die möglichen Fehlerfälle der Software aus Nebenläufigkeits- und Echtzeitsicht verstehen, um im Nachgang Lösungen für deren Vermeidung ableiten zu können ([1], [5]).

Die eingebetteten Softwaresysteme bestehen aus mehreren hundert Funktionen, die mit spezifischer Frequenz aufgerufen werden. Das Betriebssystem hat die Aufgabe, die Berechnungen entsprechend ihrer Aktivierungsrate zu aktivieren und ggf. laufende Berechnungen mit niederer Priorität zu unterbrechen (rate-monotonic scheduling). Jede korrekte Bearbeitung einer Funktion basiert auf Abhängigkeiten zu Funktionen – genannt Ordnung – welche vorher bzw. nachher gerechnet werden (z.B. muss ein Sensorwert aufbereitet werden, bevor er weiterverarbeitet wird). Bei Berechnungen auf einem Rechnerkern ist dies für Funktionen mit gleicher Aktivierungsrate einfach sicherzustellen (durch eine fixe Reihenfolge innerhalb der Task). Jedoch ist bereits die Reihenfolge zwischen unterschiedlichen Zeitscheiben nur teilweise mittels Prioritäten regelbar oder kostspielig mittels Synchronisationspunkten realisierbar. Sind die Berechnungen über mehrere Rechenkerne verteilt, lässt sich die Reihenfolge nur noch über Synchronisationspunkte (etwa auch ein globales Scheduling) realisieren, was aber den Nutzen der parallelen Rechenleistung deutlich reduziert. Zusätzlich zeigt sich, dass die impliziten Annahmen der Legacy-Software in Single-Core-Systemen häufig nicht lückenlos transparent sind. Dies birgt die Gefahr, dass bei einer einfachen Verteilung der Software die notwendigen Berechnungsreihenfolgen evtl. (sporadisch) nicht eingehalten werden (siehe Abbildung 2, PDF).

Die wohl bekanntesten Fehlerquellen bei Synchronisationen sind sicherlich Deadlocks. Verklemmungen können auftreten, wenn etwa Locks sukzessive gesetzt werden und die Reihenfolge nicht systemweit einheitlich ist. Mögliche Lösungen sind etwa die Nutzung einer Ressource für alle zu schützenden Anteile oder die Sicherstellung der konformen systemweiten Locking-Reihenfolge. Erstere Lösung kann zu großen System-Overhead führen, da Beeinflussungen von Berechnungen entstehen, die inhaltlich unabhängig sind. Das vollständige Betrachten der systemweiten Locking-Reihenfolge ist im Allgemeinen extrem schwierig sicherzustellen (siehe Abbildung 3, PDF).

Dateninkonsistenzen sind die meistgenannten Fehlerquellen in nebenläufigen Systemen. Diese können entstehen, wenn gleichzeitig auf Daten gearbeitet bzw. Funktionen mehrfach aufgerufen werden. Zur Vermeidung dieser Überlappungsfehler werden häufig auch Synchronisationen eingesetzt, die wiederum Overhead erzeugen. Zusätzlich sind Zustandswechsel in Software zu beachten, da besonders Realisierungen aus der Single-Core-Umgebung häufig schwer beherrschbare Zeiteffekte in parallelen Systemen haben (siehe Abbildung 4, PDF).

Die letzte Kategorie behandelt die Verletzung von Echtzeitanforderungen, etwa dem Verpassen von Deadlines, was dazu führt, dass Ergebnisse anderen Funktionen zu spät bereitgestellt werden. Je nach Schwere der Auswirkung kann dies entweder irrelevant sein oder auch zur völligen Fehlfunktion des eingebetteten Systems führen (siehe Abbildung 5, PDF).

Die aufgeführten Fehler werden typischerweise mittels Synchronisationsmechanismen wie Spinlocks vermieden. Bei steigender Auslastung des Systems steigt auch der Overhead durch das Sperren bzw. Abfragen der Locks signifikant.

Timed Communication

Eine strukturelle Lösung, den Aufwand zur Sicherstellung einer konsistenten Kommunikation in parallelen Echtzeitsystemen zu senken, wurde von Henzinger et al. mit der Logical Execution Time eingeführt und in deren Giotto Framework umgesetzt ([2], [3], [4]). Mittels der Logical Execution Time werden die Kommunikationen von den Berechnungen entkoppelt und systemweit koordiniert. Dadurch reduzieren sich die individuellen Synchronisationen auf ein Minimum. Diese Kommunikationsart wird Timed Communication genannt (siehe Abbildung 6, PDF).

Im Vergleich zur traditionellen Implementierungen, in denen Zeitscheiben die Daten direkt mit dem globalen Speicher austauschen, findet bei Timed Communication der Datenaustausch direkt zwischen zwei Zeitscheiben statt. Zusätzlich wird nur dann kommuniziert, wenn auch neue Daten verfügbar sind. Durch die zeitliche Entkopplung der Kommunikation von der Berechnung wird für zeitgesteuerte Tasks sichergestellt, dass diese immer Daten mit gleichem Alter als Input erhalten, wenn die Berechnungen inklusive der Kommunikation innerhalb der Periode beendet werden.

Mittels Timed Communication können Ordnungsfehler zwischen Zeitscheiben vermieden und Synchronisations- bzw. Überlappungsfehler (für Daten) verhindert werden. Zusätzlich strukturiert Timed Communication die deterministische, lockfreie Kommunikation und erlaubt das taskspezifische Erkennen von Echtzeitfehlern.

Darüber hinaus ist es möglich, auf der Basis einer deterministischen Kommunikation mit den zeitlichen Anforderungen der Kommunikation zwischen Funktionen eine toolgestützte Verteilung zu erreichen, welche die zugrundeliegenden Zeitanforderungen per Konstruktion sicherstellt bzw. überprüft. Dafür sind für alle Funktionen, die zeitkritischen Schnittstellen und deren Zeitanforderungen zu erfassen. Zusätzlich ist das Ausweisen der zeitkritischen Wirkketten mit deren Deadlines zu erfassen. Ebenso wird eine abstrahierte Beschreibung der zugrundeliegenden Hardware benötigt. All diese Daten sind jedoch typischerweise nur mittels Expertenwissen zu ermitteln. Diese Daten können bereits heute in dem öffentlich verfügbaren Amalthea-Format verwaltet werden (siehe Abbildung 7, PDF) [7].

Aus dem aktuell genutzten präemptiven rate-monotonic Scheduling in automotive Single-Core-Systemen resultiert bereits ein nebenläufiges Echtzeitsystem, in dem die präsentierten Fehlerzustände bereits auftreten können. Die Wahrscheinlichkeit der Fehler erhöht sich jedoch signifikant durch die Verteilung der Software auf parallele Recheneinheiten. Die Vermeidung der Fehler durch zusätzliche Synchronisationen führt zu zusätzlichem Overhead, der den Nutzen der zusätzlichen parallelen Rechenleistung zum Teil zunichtemacht und darüber hinaus schwierig abzusichern ist. Zusätzlich ist die Freiheit von Echtzeitfehlern weiterhin schwierig zu validieren. Das Timed Communiction Framework kann nun als Grundlage genutzt werden, um die Zeitanforderungen der Funktionen und der Wirkketten systemweit beim Systemsetup zu sicherzustellen und dadurch den massiv steigenden und komplexeren Absicherungsaufwand in parallelen Systemen massiv zu reduzieren.

Quellen

[1] Clarke S.J. and McDermid JA. Software fault trees and weakest preconditions: a comparison

and analysis. Software Engineering Journal. 8(4):225-236, 1993.

[2] Henzinger TA, Horowitz B, Kirsch CM (2001a) Embedded control systems development with Giotto. In: Proceedings of the ACM SIGPLAN workshop on languages, compilers, and tools for embedded systems (LCTES). ACM

[3] Henzinger TA, Horowitz B, Kirsch CM (2001b) Giotto: A time-triggered language for embedded programming. In: Proceedings of the international workshop on embedded software (EMSOFT), vol 2211 of LNCS, Springer, pp 166–184

[4] Henzinger TA, Horowitz B, Kirsch CM (2003a) Giotto: A time-triggered language for embedded programming. Proc IEEE 91(1):84–99

[5] Thane, Henrik. Monitoring, testing and debugging of distributed real-time systems. Diss. Ph. D. Thesis, MRTC Report 00/15, 2000.

[6] Härdtlein, Jochen, Verteilte Software in Echtzeitsytemen. HANSER automotive 03-04/2017

[7] www.amalthea-project.org, An Open Platform Project for Embedded Multicore Systems, Öffentlich gefördertes ITEA Projekt

 

Beitrag als PDF-Datei downloaden


Echtzeit - MicroConsult Trainings & Coachings

Wollen Sie sich auf den aktuellen Stand der Technik bringen?

Dann informieren Sie sich hier zu Schulungen/ Seminaren/ Trainings/ Workshops und individuellen Coachings von MircoConsult zum Thema Embedded- und Echtzeit-Softwareentwicklung.

 

Training & Coaching zu den weiteren Themen unseren Portfolios finden Sie hier.


Echtzeit - Fachwissen

Wertvolles Fachwissen zum Thema Embedded- und Echtzeit-Softwareentwicklung steht hier für Sie zum kostenfreien Download bereit.

Zu den Fachinformationen

 
Fachwissen zu weiteren Themen unseren Portfolios finden Sie hier.