Eingebettetes Linux und Entwicklungsmethoden

Embedded Development

Cross-Development

Die Sammlung der zum Erstellen einer Software benötigten Programme (Compiler, Linker, aber auch der Debugger) werden im Allgemeinen unter dem Begriff Toolchain zusammengefasst. Weiterhin wird der Entwicklungsrechner als Host, das Zielsystem (also das Embedded System) als Target bezeichnet.

Da das Target häufig mit einer anderen Prozessorarchitektur und mit anderer Peripherie als das Entwicklungssystem arbeiten, kann weder zur Entwicklung noch zum Debuggen die normale Toolchain verwendet werden. Selbst wenn es sich beim Target um die selbe Architektur handelt, ist der Einsatz dieser Toolchain nicht zu empfehlen, da es leicht zu Problemen beim Linken (wenn z. B. versehentlich die lokal installierte Version einer Bibliothek gewählt wird) und beim Debuggen spezieller Hardware-Eigenschaften kommt.

Weiterhin musst die Software auf dem Target-System getestet werden. Hier gibt es wiederum verschiedene Ansätze:

Linked Setup

Host- und Targetsystem sind über eine Datenverbindung, häufig die serielle Schnittstelle oder USB, verbunden. Dies ist die am häufigsten Auftretende Variante und hat sowohl Vor- als auch Nachteile. Zu den Vorteilen zählt primär, dass die Software direkt auf der Zielplattform getestet wird, alle dadurch verursachten Probleme also sofort erkannt werden können. Nachteilig ist jedoch, dass gerade auf kleinen Embedded Systems das Laden der Firmware und das Debugging sehr langsam von statten gehen kann. Zudem wird immer eine direkte Verbindung zum Embedded System benötigt, es muss also immer die entsprechende Hardware vorhanden sein.

Removable Storage Setup

Dies ist eine eher selten anzutreffende Version des Linked Setup: Die Software wird hier auf dem Host erstellt, auf ein Medium (z. B. ein Flash-Speicher) geladen und im Target installiert. Dies ist zwar sehr umständlich, häufig jedoch die einzige Möglichkeit, ein System zu programmieren.

Standalone Setup

Wenn das Target mächtig genug ist, dann kann die Entwicklung natürlich auch direkt dort geschehen.

Emulated Setup

Diese Variante nimmt an Beliebtheit stetig zu, nicht zuletzt das iPhone SDK hat ihr einem weiteren Bekanntheitsgrad verschafft (Maemo, OpenMoko und Android benutzen sie jedoch schon länger). Dabei wird das Target auf dem Host inklusive Peripherie emuliert. Es ist somit eine virtuelle Version des Linked Setup.

Cross-Toolchain

Abhilfe schafft das Cross-Compiling. Hierzu wird auf dem Host-Rechner zuerst eine an die Zielarchitektur angepasste Version der Toolchain generiert oder installiert. Auch wenn es sich empfiehlt muss anschließend nicht einmal ein Linux-System zum Entwickeln verwendet werden, sondern dies kann auch z. B. unter Mac OS X oder Windows erfolgen. Die Applikationen der Toolchain werden dabei mit einem nach einem festgelegten Muster aufgebauten Prefix cpu-manufacturer-kernel-os im System abgelegt:

cpu

Gibt die Prozessorarchitektur an, z. B. i386 oder mipsel.

manufacturer

Hersteller oder Variation, häufig unknown da es selten eine Auswirkung hat.

kernel

In der Regel ist dies linux, wird häufig auch weggelassen.

os

Gibt die Version des Userlands und teilweise auch das Format der Binaries (z. B. elf oder coff) an.

Gültige Applikationsnamen wären z. B. i686-pc-linux-gnu-gcc und powerpc-8540-linux-gnu-ld aber auch einfach i386-gdb.

Da das Erstellen einer Toolchain und insbesondere das Auflösen der Abhängigkeiten nicht trivial ist, gibt es diverse Ansätze zur Automation. Dazu gehören unter Anderem relativ einfache Lösungen wie crosstool und ptxdist sowie komplette Umgebungen wie das von Maemo eingesetzte scratchbox.

Die Maemo Quick Start Quide gibt eine gute Einführung in die Verwendung von scratchbox und beschreibt wie mit wenigen Schritten (jedoch vielen automatisierten Downloads) eine komplette Entwicklungsumgebung samt emulator installiert werden kann.

Für weitere Details sei auf das Buch Building Embedded Linux Systems (siehe Literaturliste) verwiesen.