Embedded Linux
Linux ist heute in vielen Bereichen der Industrie die Basis für zuverlässige und flexible Systeme. Durch die große Entwickler-Community und die Vielfalt an verfügbaren Paketen lassen sich maßgeschneiderte Lösungen für nahezu jede Anwendung umsetzen – von der Maschinensteuerung bis hin zum IoT-Gateway. Falls Sie Unterstützung in einem der im Folgenden genannten Bereiche benötigen, zögern Sich nicht, mich zu kontaktieren.
Linux im Embedded-Bereich
Linux ist seit ca. 2015 das weltweit meistverwendete Embedded-Betriebssystem. Die Gründe hierfür sind vielfältig. Der als Open-Source verfügbare Linux-Kernel wird seit Jahrzehnten von einer Vielzahl von Entwicklern kontinuierlich erweitert und verbessert. Jeder kann den Quellcode einsehen, wodurch Fehler und Optimierungspotenzial leichter identifiziert werden, als es bei proprietären Betriebssystemen der Fall ist.
Bei der Entwicklung von Linux wurde immer darauf geachtet, dass mit dem Fortschreiten der verfügbaren Rechenleistung und des verfügbaren Arbeitsspeichers nicht automatisch gleichermaßen der Ressourcenverbrauch steigt. Durch den anpassbaren, modularen Kernel kann selbst die aktuellste Linux-Version sowohl für eingebette Systeme mit begrenzten Ressourcen als auch für Supercomputer mit mehreren Millionen Prozessorkernen eingesetzt werden.
Für den Einsatz im Embedded-Bereich zählen insbesondere Stabilität, Sicherheit und Echtzeitfähigkeit. Die Stabilität und Sicherheit von Linux wird durch den massenhaften Einsatz, vor allem in den Bereichen Embedded- und High-Performance-Computing, täglich unter Beweis gestellt. Bei der Echtzeitfähigkeit unterscheidet man zwischen “harten” und “weichen” Echtzeitbedingungen, was im nächsten Abschnitt näher erläutert wird.
Linux und Echtzeit
Unter harten Echtzeitanforderungen versteht man, dass ein Task seine Deadline einhalten muss, da ansonsten das gesteuerte System einen katastrophalen Fehler erleidet. Beispiele sind eine Airbagsteuerung oder eine Schrittmotorsteuerung in einer CNC-Maschine. Unter weichen Echtzeitanforderungen hingegen versteht man den etwas entspannteren Fall, dass eine Deadline eingehallten werden sollte, weil das betreffende System ansonsten Qualitätseinbußen erleidet. Beispiele hierfür sind Videostreaming oder die Sprachübertragung mittels VoIP.
Linux selbst kann lediglich weiche Echtzeitbedingungen gewährleisten. Dazu musste früher ein versionsspezifisches Patch auf den Quellcode-Baum angewendet und eine entsprechende Option (PREEMPT_RT) in der Kernel-Konfiguration aktiviert werden. Im September 2024 wurde die PREEMPT_RT-Unterstützung in den Mainline-Kernel gemerged. Durch die Aktivierung von PREEMPT_RT sinkt die Variation im Timing, so dass das System sich “deterministischer” Verhält. Dieser Vorteil wird durch überschaubare Einbußen bei der Gesamtperformance und dem Energieverbrauch erkauft.
Falls ein System gleichzeitig harte Echtzeitbedingungen erfüllen und Linux ausführen muss, bietet es sich an, die harten Echtzeitaufgaben von einem Echtzeitbetriebssystem (Real-Time Operating System, RTOS) übernehmen zu lassen und Linux lediglich als Task innerhalb des Echtzeitbetriebssystems auszuführen. So behält das RTOS die Kontrolle über die Echtzeitfähigkeit des Systems, ohne dass man auf die Vorteile von Linux in Embedded-Systemen verzichten muss.
Yocto Project & Build-Systeme
Mit dem Yocto Project (kurz: Yocto) können Linux-Systeme individuell aufgebaut und optimal an die jeweilige Hardware angepasst werden. Dadurch wird ein maßgeschneidertes, minimales Image erreicht, welches einerseits den meist limitierten Flash-Speicher nicht unnötig belegt und andererseits keine nicht benötigten Pakete und Bibliotheken beinhaltet.
Die Integration kundenspezifischer Treiber und Software ist mit Yocto problemlos möglich. Das Build-System basiert auf Recipes (“Rezepten”), die ähnlich wie Kochrezepte den Ablauf des Builds der einzelnen Software-Komponenten regeln. Die Schritte für die Konfiguration, Kompilation und Installation eines jeden Software-Pakets können individuell definiert und angepasst werden. Außerdem können vor dem Build automatisch Patches auf den Source-Tree angewendet werden, um z.B. Bugs oder Security-Vulnerabilities zu beheben.
Yocto kann mit Continuous-Integration- (CI) und Continuous-Delivery- (CD) Systemen wie Jenkins integriert werden. Dadurch wird sichergestellt, dass jede Änderung zunächst automatisch auf Kompilierbarkeit getestet, optional einem Code-Review-System zugeführt und anschließend integriert wird.

Gerätetreiber-Entwicklung
Für kundenspezifische Hardware, z.B. bei der Anbindung eines auf einem FPGA implementierten IP-Cores an einen ebenfalls in dem FPGA vorhandenen Prozessor, kann eine individuelle Treiberentwicklung oder -anpassung erforderlich sein. Dadurch wird ermöglicht, dass User-Space-Applikationen über definierte Schnittstellen, meist ein Device-File und in dem Treiber entsprechend implementierte System-Calls, mit der kundenspezifischen Hardware sicher und effektiv interagieren können.
Für das Bring-Up einer neuen Plattform kann es erforderlich sein, bereits vorhandene Gerätetreiber anzupassen. Im Idealfall ist ein Treiber bereits so implementiert, dass die Konfiguration über eine Anpassung des Devicetrees geändert werden kann. Der Devicetree ist eine XML-ähnliche Datenstruktur, welche dem Kernel die Hardwarekonfiguration des Systems mitteilt.
Da Gerätetreiber im Kernel-Space ausgeführt werden, haben sie vollen Zugriff auf alle Ressourcen des Systems. Dadurch kann ein Bug die Stabilität des kompletten Systems gefährden können. Zudem können sich suboptimale Implementierungen negativ auf die Systemperformanz auswirken. Deswegen sollte insbesondere bei Gerätetreibern großer Wert auf Debugging und Performance-Optimierung gelegt werden.
Systemdienste
Systemdienste übernehmen in Linux Initialisierungs- und Überwachungsaufgaben und erledigen ihren Dienst als sog. Services oder Daemons im Hintergrund. Systemdienste werden von einem Init-System verwaltet, welches sicherstellt, dass der richtige Service zur richtigen Zeit gestartet, gestoppt und evtl. im Fehlerfall neu gestartet wird. Die gängigsten Init-Systeme für eingebettete Systeme sind systemd, sysvinit und busybox.
Mit Systemdiensten lassen sich beispielsweise Dienste für das Datenlogging, die Anpassung der Firewall-Konfiguration oder das aktivieren und konfigurieren kundenspezifischer Hardwarekomponenten implementieren.
Industrielle Schnittstellen
Linux bietet eine gute Unterstützung für die Anbindung gängiger industrieller Schnittstellen:
- CAN (inkl. SocketCAN, CANopen, J1939): Der Kernel unterstützt eine vielzahl von On-Chip- und Off-Chip-Can-Controllern
- EtherCAT: EtherCAT wird nicht nativ unterstützt. Für Echtzeitsysteme existieren kommerzielle (z.B. Acontis EtherCAT Master) und freie (z.B. IgH EtherCAT Master) EtherCAT-Master-Lösungen. Diese beinhalten i.d.R. einen Gerätetreiber. Für nicht echtzeitfähige Prototypen und Entwicklungssysteme existieren auch reine Userspace-Lösungen, z.B. Simple Open EtherCAT Master (SOEM).
- Profibus & Profinet: Es existieren mehrere kommerzielle Lösungen, die i.d.R. aus einem Gerätetreiber und einer Userspace-Komponente bestehen.
On-Board-Schnittstellen & Peripheriegeräte
Insbesondere eingebettete Systeme erfordern oft die direkte Anbindung von Sensoren, Aktoren oder kundenspezifischer Hardware.
- I²C, SPI, UART, GPIO: Diese Schnittstellen werden von Linux nativ unterstützt. Gängige Linux-fähige SoCs haben diese Schnittstellen oft bereits an Bord.
- ADC/DAC-Ansteuerung
- Speicher- und Sensorintegration
- Anpassung des Device-Trees für Hardwareanbindung und -konfiguration
Kontakt
Falls Sie Unterstützung bei einer Entwicklungsaufgabe im Bereich Embedded Linux suchen, würde ich mich freuen, wenn Sie über das folgende Formular Kontakt aufnehmen würden.