Eingebettetes Linux und Entwicklungsmethoden

Embedded Systems

Grundlagen

Die Entwicklung von Software für Embedded Systems unterscheidet sich meist von der Entwicklung herkömmlicher Anwender- oder Serversoftware. Zwar ist dies nicht immer der Fall, aber in der Regel müssen spezielle Hardware-Anforderungen und Anwendungsfälle berücksichtigt werden und oft unterliegt die Software speziellen Sicherheits- oder Echtzeitanforderungen.

In der Vergangenheit wurde auf Embedded Systems häufig gar kein formelles Betriebssystem eingesetzt, sondern eine problem- und hardwarespezifische Treibersoftware in C oder Assembler (oder anderen, plattformspezifischen Sprachen) geschrieben. Doch auch in diesem Bereich gilt noch das Mooresche Gesetz und aufgrund der rasanten Entwicklung sind heute zu erschwinglichen Preisen Embedded Platforms erhältlich, die vor einigen Jahren mit ihrer Leistungsfähigkeit zur Oberklasse der PC-Systeme gehört hätten. Zugleich werden auch diese Systeme immer komplexer und Detailaspekte wie etwa das Energiemanagement immer wichtiger. Weiterhin verkürzt sich gerade im Consumer-Bereich die zur Verfügung stehende Entwicklungszeit.

Sobald das Embedded System eine gewisse Komplexität überschreitet, ist daher gerade für kleine Firmen der Einsatz einer eigenen, meist monolithisch gewachsenen und schwer anzupassenden, In-House-Entwicklung als Basis nicht mehr praktikabel. In Anbetracht der steigenden Leistungsfähigkeit der Hardware braucht heutzutage auch hier auf den flexiblen Unterbau eines Betriebssystems nicht mehr verzichtet zu werden.

Im Gegensatz zum Betriebssystemmarkt im Desktop- und Serverbereich, herrscht bei den Eingebetteten Systemen seit jeher eine rege Konkurrenz mit diversen Alternativen. Neben den klassischen Marktführern für Echtzeit-Betriebsysteme, VxWorks und QNX Neutrino, existiert eine schier unüberschaubare Auswahl an anwendungs- oder gar herstellerspezifischen Betriebsystemen, wie etwa Symbian für Mobiltelefone und Handhelts. Auch Microsoft hat mit Windows CE nicht die selben Erfolge wie in den anderen Bereichen feiern können.

Aufgrund diverser Vorteile hat sich statt dessen Linux als offene Software-Plattform für dedizierte Geräte etabliert. Die VDC Research Group führt seit 2004 jährlich eine repräsentative Umfrage zu den im Embedded Bereich eingesetzten Betriebssystemen durch. Schon im ersten Jahr führte Linux als Plattform mit 15,5% vor dem ursprünglichen Marktführer VxWorks (10,3%), damals nur übertroffen von Systemen ohne formelles Betriebssystem. Im Bericht von 2008 ist der Anteil auf 18% angestiegen, Tendenz sowohl bei Linux als auch anderen Open Source Plattformen steigend.

Theorie und Praxis

Wie schwer die Einteilung von Technologien in starre Kategorien fällt, sieht man schon im Desktop- und Serverbereich: Ein moderner Desktop-Rechner hat mit den landläufig installierten Diensten die fließende Grenze zum Server häufig schon überschritten. Im weit gefassten Embedded Bereich fällt diese Differenzierung noch schwerer und auch hier ist der Übergang zu anderen Kategorien, insbesondere den Appliances (Serversysteme mit dedizierter Funktionalität) und den Thin Clients (Clientsysteme mit eingeschränkter Hardware), fließend.

[Anmerkung]

Unter dem Begriff Embedded System ist jedoch immer die Kombination aus einer problemorientierten Software mit einer spezifischen Hardware (meist einer Embedded Plattform) zu verstehen.

Es gibt verschiedene Ansätze zur genaueren Definition von Embedded Systems bzw. dem Embedded Development, die jedoch teilweise anderen Definitionen oder der Realität widersprechen. Prinzipiell lässt sich ein Embedded System aufgrund einer oder mehrerer der folgenden Merkmale identifizieren:

  • Spezifischer Einsatzzweck.

  • Blackbox-Verhalten dem Anwender gegenüber.

  • Vom Anwender nur bedingt erweiterbar.

  • Hardwarenahe bzw. -spezifische Softwareentwicklung.

  • Limitierte Hardware-Ressourcen.

  • Echtzeitfähigkeit gefordert.

Wie bereits erwähnt sind dies nur Anhaltspunkte und Interpretationssache; so bestehen z. B. Vertreter einer sehr engen Auslegung der Definition darauf, dass ein Embedded System in keiner Weise vom Anwender erweiterbar ist. Damit würden jedoch moderne Mobiltelefone oder gar Handhelts nicht mehr als Embedded Systems gelten, eine Interpretation die der allgemeinen Wahrnehmung widerspricht. Auf der anderen Seite erfüllen auch andere Systeme wie z. B. Supercomputer und Nettops (ganz zu schweigen von den bereits erwähnten Appliances und Thin Clients) viele der Kriterien, werden jedoch definitiv nicht zu den Embedded Systems gezählt.

Der Hauptgrund für die Vieldeutigkeit des Begriffs liegt in der geschichtlichen Entwicklung begründet: Ursprünglich wurden als Embedded Development nur die direkte Programmierung einer Hardware bezeichnet. Mit der Zeit wurden die Embedded Platforms leistungsfähiger und näherten sich in Funktionsumfang den PC-Systemen an, während bei diesen wiederum Aspekte der Embedded Platforms (z. B. Energieeffizienz) an Wichtigkeit gewannen. Jörn Engel, Entwickler von LogFS, fasst die Situation treffend zusammen: „Ein Entwickler meint mit einem Embedded System zu arbeiten, wenn es für ihn aussieht wie ein anderes Embedded System mit dem er zuvor schon einmal gearbeitet hat.

Klassifikation

Verbreitet ist die Klassifikationen von Embedded Systems anhand zweier Merkmale: Dem Grad der Benutzerinteraktion und der Größe (im Sinne von verfügbarer Hardware) des Systems.

In Bezug auf die Benutzerinteraktion kann man grob zwischen drei Typen von Embedded Systems unterscheiden:

  • Systeme, die nur zu Wartungszwecken eine Benutzerinteraktion vorsehen (z. B. Autopiloten, Roboter, Router, Telefonanlagen).

  • Systeme, die (Netzwerk-) Dienste bereitstellen, jedoch ohne aktive Benutzerinteraktion auskommen bzw. bei denen diese nicht im Vordergrund steht (z. B. NAS, Printserver).

  • Systeme, mit denen aktiv interagiert wird und deren Benutzeroberfläche einen essentiellen Bestandteil ausmachen (z. B. Mobiltelefone, Handhelts, die CoBench)

In der Praxis jedoch ist zur Unterscheidung meist nur relevant, ob das System mit einer grafischen Benutzeroberfläche ausgestattet ist bzw. direkte Benutzerinteraktion vorsieht. Geräten ohne direkte Interaktion sehen häufig nur eine serielle Schnittstelle oder ein Web-Interface zur Konfiguration vor.

Weiterhin spielt häufig die verfügbare Hardware eine Rolle. Anhand der drei Kriterien CPU, RAM und ROM (heutzutage meist EEPROMs oder Flash-Speicher) lassen sich hier grob vier Kategorien erkennen. Die Kriterien sind mit der fortschreitenden Entwicklung der Technik zwar ständigen Änderungen unterworfen, lassen sich aber folgendermaßen abschätzen:

Sehr kleine Embedded Systems

Sehr geringe CPU-Leistung (mit 8-Bit bis 32-Bit, oft keine MMU und keine FPU), weniger als 4 MiB ROM, weniger als 8 MiB RAM.

Kleine Embedded Systems

Geringe CPU-Leistung (mit 32-Bit), 4 MiB bis 8 MiB ROM, 8 MiB bis 16 MiB RAM.

Mittlere Embedded Systems

Geringe CPU-Leistung (mit 32-Bit), 16 MiB bis 512 MiB ROM, 16 MiB bis 128 MiB RAM.

Große Embedded Systems

Normale CPU-Leistung (mit 32-Bit oder mehr), 1 GiB oder mehr ROM, 256 MiB oder mehr RAM.

Je nach Größe des Systems müssen unterschiedliche Abstriche an die Software gemacht werden. Auf sehr kleinen Embedded Systems lässt sich z. B. nur bedingt das 32-Bit-Betriebssystem Linux installieren. Es gab zwar mehrere Ansätze, Linux auf 16-Bit-CPUs zu portieren (unter Anderem das Embeddable Linux Kernel Subset), diese waren jedoch weder von Erfolg gekrönt noch in Anbetracht der Preisunterschiede zu 32-Bit-CPUs sonderlich sinnvoll. Für CPUs ohne MMU existiert die Variante uClinux, die seit der Version 2.6 auch Bestandteil des Kernels ist. Auch Portierungen von Linux auf weniger als 4 MiB ROM sind eher umständlich (wenn auch nicht unmöglich, wie z. B. picotux mit nur 2 MiB ROM zeigt).

[Anmerkung]

Als Minimalanforderungen zum Betrieb von Linux werden im Allgemeinen ein kleines 32-Bit Embedded System mit 4 MiB ROM und 8 MiB RAM vorrausgesetzt.

Häufige Unterschiede

Wie bereits erwähnt kann es zwar durchaus vorkommen, dass im Inneren des Embedded Systems ein alltägliches x86-System steckt. Doch meist bringt die Entwicklung eines Embedded Systems Hardware-bedingte Unterschiede oder Einschränkungen im Vergleich zur normalen Softwareentwicklung:

Ausgefallene CPU-Architektur

Im Desktop- und Serverbereich ist die Architektur meist beschränkt auf x86, in Ausnahmefällen findet man noch PowerPC, SPARC oder MIPS. Die Liste der im Embedded Bereich verbreiteten Architekturen ist um einiges länger, zu den zuvor genannten kommen neben ARM, AVR32, m68k und SuperH unzählige weitere hinzu. Auf viele dieser Architekturen wurde Linux bereits portiert, hinzu kommen Portierungen auf DSPs und FPGAs.

Keine MMU

Gerade in Mikrocontrollern ist häufig keine MMU zu finden. Das hat zur Folge, dass diese Prozessoren keinen virtuellen Speicher und insbesondere keinen Speicherschutz unterstützen. Dies wirkt sich nicht nur auf die Speicherverwaltung, sondern auch auch die Anforderungen an das Binärformat der ausführbaren Dateien und Bibliotheken aus, so dass unter Linux häufig nicht das Standardformat ELF eingesetzt werden kann.

Keine FPU

Ohne Gleitkommaeinheit sind Berechnungen mit Fließkommazahlen aufwändiger als gewohnt, so dass häufig spezielle Algorithmen nötig zur effizienten Näherung der Ergebnisse sind. Rechenaufwändige Software muss demnach speziell angepasst werden.

Unterschiedliche Byteorder

Nicht nur beim Austausch von Daten zwischen verschiedenen Architekturen muss man hier aufpassen, hinzu kommt dass einige Prozessorarchitekturen wie MIPS eine konfigurierbare Byteorder bieten, also mal als Little- und mal als Big-Endian-System auftreten und demnach die richtigen Binaries gewählt werden müssen.

Arbeitsspeicher

RAM steht meist nur in eingeschränkter Form zur Verfügung und aufgrund des häufig ebenfalls fehlenden virtuellen Speichers in Form von Swap wird dieser Mangel bei exzessiver Speicherauslastung ein Problem und der OOM Killer spring schnell an.

Nichtflüchtiger Speicher

In Embedded Systems werden heutzutage häufig Flash-Speicher eingesetzt, bei deren Verwendung unter Umständen auf spezielle Eigenarten Rücksicht genommen werden muss (z. B. durch Verwendung des MTD-Subsystems) oder gar eigene Dateisysteme benötigt werden. Trotz einiger Nachteile haben diese Speicher jedoch auch Vorteile, so entfallen z. B. die von Festplatten gewohnten Latenzzeiten beim nicht-linearen Zugriff. Gerade in kleinen Geräten ist der Speicher zudem oft nur-lesend, so dass alle modifizierten Dateien in RAM-Disks vorgehalten werden und Änderungen beim Neustart nicht erhalten bleiben.

Zusätzliche Hardware und Peripherie

Ein Embedded System wird in der Regel eine dedizierte Aufgabe entwickelt. Im Zusammenhang damit stößt man häufig auf spezielle und problem orientierte zusätzliche Hardware. Häufig trifft man auf Watchdogs oder Krypto-Beschleunigern wie den Soekris vpn1xxx.

Schnittstellen und Bussysteme

Ebenso wie ungewöhnliche Hardware sind von Embedded Systems häufig veraltete oder spezielle Bus- und Feldbussysteme anzusprechen. Für die meisten Standard-Bussysteme existieren Treiber im Linux Kernel.