Fachthema
Wie programmiert man Embedded Systeme?
Embedded Systems verrichten ihren Dienst verlässlich im Verborgenen. Sie sind so vielfältig wie ihre Anwendungen in den unterschiedlichsten Branchen. Wie man sie programmiert erfahren Sie hier.
Ein Embedded System ist ein programmierbares elektronisches System, das für einen ganz bestimmten Zweck eingesetzt wird. Denken Sie an einen Drucker in Ihrem Büro. Innerhalb dieses Druckers arbeiten ein oder mehrere Mikroprozessoren, mit einem begrenzten Umfang an Speicher und Peripherieelektronik um Daten zu übernehmen und diese auf Papier auszudrucken. Die Aufgaben dieses Embedded Systems sind vielfältig:
- Kommunikation mit dem PC über Netzwerk, USB o.ä.
- Reaktion auf Tasteneingaben am Drucker
- Rückmeldung am Druckerdisplay
- Steuerung der gesamten Druckermechanik (Motoren, Sensoren usw.)
- Kontrolle und Überwachung des Gesamtsystems
Je nach gewünschter Druckerleistung (Farbe, Auflösung, Seiten/Minute) müssen diese Aufgaben mehr oder weniger schnell ausgeführt werden. Dafür gibt es, wie bei den PCs, Prozessoren unterschiedlicher Leistungsklassen. Bekannte Prozessorfamilien sind ARM, MIPS, Coldfire, 8051, aber auch die aus der PC-Welt bekannte Intel x86 Baureihe.
Früher wurden Embedded Systeme direkt in Assembler, der Maschinensprache des Prozessors programmiert. Speicher war damals noch teuer und sehr beschränkt. Die Assembler Programmierung war in diesem Umfang noch handhabbar und man konnte die Programme bis ins letzte Bit optimieren. Lesen, Analysieren und Warten der Programme war nur mit hohem Aufwand machbar.
Mit wachsendem Funktionsumfang war dieser Weg nicht mehr praktikabel. Die Komplexität von zigtausenden Zeilen Assemblercode führte zum Einsatz neuer „höherer“ Programmiersprachen wie C, C++ oder Java auch in der Embedded Welt. Höhere Programmiersprachen und Programmbibliotheken erlauben die schnellere Realisierung von Embedded Programmen.
So kann sich ein Druckerhersteller z.B. eine Programmbibliothek für alle in seinen Geräten Displays vorbereiten und diese dann einfach in unterschiedlichen Geräten wieder verwenden. Mit der Zeit zogen dann auch die Betriebssysteme in die Embedded Systeme ein. Wie in einem PC übernehmen diese fundamentale Aufgaben im System um Daten über Netzwerke auszutauschen, Speicher zu verwalten oder auf Eingaben zu reagieren.
Die Embedded Betriebssysteme unterscheiden sich in vielen Bereichen von den bekannten PC-Betriebssystemen, sind meistens viel schlanker und reagieren genau vorhersehbar auf Ereignisse (echtzeitfähig). Bekannte Vertreter von Embedded Betriebssystemen sind VxWorks, Nucleus, QNX aber auch verschiedene Linux-Varianten. Neuerdings fassen auch bekannte Systeme wie Windows oder Android im Embedded Bereich Fuß.
Programmiersprachen – ein kleiner Exkurs
Assemblersprache
Assemblersprache, kurz auch Assembler genannt (to assemble ‚montieren‘), ist eine Programmiersprache, die auf den Befehlsvorrat eines bestimmten Computertyps (dessen Prozessorachitektur) ausgerichtet ist. Man bezeichnet sie daher als maschinenorientierte Programmiersprachen und – als Nachfolger der direkten Programmierung mit Zahlencodes – als Programmiersprachen der zweiten Generation. Denn anstelle eines Binärcodes der Maschinensprache können Befehle und deren Operanden durch leichter verständliche mnemonische Symbole in Textform (z. B. „MOVE“), Operanden z. T. als symbolische Adresse (z. B. „PLZ“), notiert und dargestellt werden.
Der Quelltext eines Assemblerprogramms wird mit Hilfe einer Übersetzungssoftware in Maschinencode übersetzt. Dagegen über in höhere Programmiersprachen ein sogenannter Compiler abstraktere Befehle in den Maschinencode der gegebenen Zielarchitektur - oder in eine Zwischensprache.
höhere Programmiersprachen
Eine höhere Programmiersprache ist eine Programmiersprache zur Abfassung eines Computerprogramms, die in Abstraktion und Komplexität von der Ebene der Maschinensprache deutlich entfernt ist. . Die Grenze zwischen einfachen und höheren Programmiersprachen ist nicht eindeutig definiert. Mindestmerkmal ist, dass die Befehle höherer Programmiersprachen nicht unmittelbar von Mikroprozessoren verstanden und ausgeführt werden können. Befehle müssen durch Interpreter oder Compiler in Maschinensprache übersetzt werden. Oft sind auch umfangreiche Betriebssysteme dazwischengeschaltet.
Vereinfacht kann man sagen, dass höhere Programmiersprachen (oder auch "Programmiersprachen der dritten Generation") mehr und komplexere logische Zusammenhänge kürzer ausdrücken, der dann durch automatisierte Prozesse auf Maschinencode heruntergebrochen wird. Die Lesbarkeit des Programmtextes wird so erhöht und die Anzahl der expliziten rekursiven Aufgaben verringert.
Einige Beispiele für höhere Programmiersprachen:
- Java
- C++
- JavaScript
- C#
- Python
- PHP
- Ruby