Einleitung: Hardware verzeiht nicht, aber Java kann verhandeln
\n\nWenn man „Embedded-Entwicklung“ hört, stellt man sich meist einen gestandenen C-Programmierer vor, mit einem Lötkolben in der einen und einem Datenblatt für den Mikrocontroller in der anderen Hand. Java? „Zu aufgebläht“, „der Garbage Collector killt die Echtzeitfähigkeit“, „wozu eine JVM auf einem 50-Cent-Chip?“ – werden Skeptiker sagen.
\n\nAber sehen wir der Wahrheit ins Auge: Die Welt hat sich verändert. Heute ist Embedded-Entwicklung mit Java keine Exotik mehr, sondern ein mächtiges Werkzeug für IoT-Geräte, intelligente Sensoren, Industriecontroller und sogar Robotik. Warum? Weil Java bietet, was C nicht hat: Plattformunabhängigkeit, Speichersicherheit, ein reichhaltiges Ökosystem an Bibliotheken und – am wichtigsten – Entwicklungsgeschwindigkeit.
\n\nIn diesem Artikel werden wir analysieren, wie Java in die Welt der eingebetteten Systeme einbricht, echten Code für Raspberry Pi und STM32 schreiben und verstehen, warum Java für Mikrocontroller kein Witz, sondern ein Arbeitswerkzeug ist.
\n\nKurz und knapp: Was ist Embedded mit Java
\n\nEmbedded-Entwicklung ist die Erstellung von Software für Geräte mit begrenzten Ressourcen: kleiner Prozessor, wenig RAM, spezifische Peripheriemodule (GPIO, UART, SPI, I2C). Traditionell dominieren hier C/C++ und Assembler. Aber Java kommt über drei Schlüsseltechnologien von der Flanke:
\n\n- \n
- Java ME Embedded (Micro Edition) – eine abgespeckte Version der JVM für Mikrocontroller und eingebettete Geräte. Unterstützt ARM, MIPS, x86. \n
- Android Things / Embedded Android – wenn Sie ein vollwertiges Linux + Java auf einem leistungsstarken Chip (z. B. Qualcomm oder Rockchip) benötigen. \n
- GraalVM Native Image – Kompilierung von Java-Code in ein natives Binärprogramm. Damit läuft Ihr Java-Code ohne JVM, belegt Megabyte statt Gigabyte und startet in Millisekunden. \n
Genau der letzte Punkt – GraalVM – hat eine Revolution ausgelöst. Jetzt ist Java für eingebettete Systeme nicht mehr langsam und ressourcenhungrig.
\n\nWarum Java und nicht C? Drei stichfeste Argumente
\n\nBevor wir Code schreiben, lassen Sie uns klären, warum man Java überhaupt auf die Hardware bringen sollte. Hier sind drei Gründe, die die Skepsis überwiegen:
\n\n1. Sicherheit und keine Speicherlecks
\nIn C verwalten Sie den Speicher selbst. Ein Fehler mit malloc/free – und Sie haben einen Segmentation Fault im Flug einer Drohne. In Java übernimmt das der Garbage Collector (GC). Moderne GCs für Embedded (z. B. Fiji VM, Metronome) arbeiten mit vorhersagbaren Pausen von unter 1 ms. Das ist für 99 % der Steuerungsaufgaben akzeptabel.
\n\n2. Ökosystem und Entwicklungsgeschwindigkeit
\nSie müssen keinen Treiber für Ethernet von Grund auf neu schreiben. Nehmen Sie einfach Spring Boot, binden Sie einen MQTT-Client ein, und schon kommuniziert Ihr Gerät mit der Cloud. Java IoT-Programmierung ermöglicht es, einen Prototypen an einem Tag statt einer Woche zu bauen.
\n\n3. Plattformunabhängigkeit
\nHaben Sie Code in Java für Raspberry Pi geschrieben? Er läuft mit minimalen Anpassungen auf BeagleBone, ESP32 (über Espressif Java) oder auf einer industriellen Siemens-Steuerung. C kann das ohne Neukompilierung für jeden Chip nicht.
\n\nPraxis: Embedded-Code in Java schreiben
\n\nKommen wir nun zum Interessantesten – echten Beispielen. Wir verwenden Java für Raspberry Pi in Verbindung mit der Bibliothek Pi4J. Das ist ein Klassiker für Embedded mit Java.
\n\nSzenario: Eine LED blinken lassen (GPIO) und Daten von einem Temperatursensor lesen (I2C).
\n\nBeispiel 1: LED blinken lassen (GPIO)
\n\nZuerst binden wir die Pi4J-Bibliothek in Maven/Gradle ein. Die Hauptmagie liegt in der Klasse GpioController.
import com.pi4j.io.gpio.*;\nimport com.pi4j.util.Console;\n\npublic class BlinkLED {\n public static void main(String[] args) throws InterruptedException {\n // GPIO-Controller erstellen\n final GpioController gpio = GpioFactory.getInstance();\n \n // Pin 0 (GPIO_0) als Ausgang initialisieren\n f