Java am Microcontroller

Seite 2: Java für den Achtbitter

Inhaltsverzeichnis

JNI ist vergleichsweise konventionell:. Doch ist der Raspberry Pi alles andere als billig. Atmels AVR-Serie mag einst für die Bedürfnisse von C-Programmierern optimiert worden sein – bei weniger als zwei Kilobyte RAM erscheint eine VM illusorisch. Doch der Eindruck täuscht: Unter anderem weisen Troy Downing und Jon Meyer in ihrem Buch zur Java Virtual Machine [1] darauf hin, dass eine VM nicht sonderlich viel Speicher braucht. Das beweist HaikuVM, ein auf dem Prinzip des Ahead-of-Time-Compilers aufgebautes Laufzeitsystem, dessen Grundstruktur Abbildung 8 zeigt.

HaikuVM erledigt einen Gutteil der Arbeit auf der Workstation (Abb. 8).

(Bild: HaikuVM)

Nach dem Herunterladen des Archivs (hier: HaikuVM-1.4.2.zip) von SourceForge extrahiert man seinen Inhalt in das Verzeichnis C:\haikuVM. Das Haiku-Team liefert eine Vielzahl von Utilities für die AVR-Plattform mit: So ist die Arduino IDE nicht beziehungsweise nur zur Installation der Hardwaretreiber erforderlich. Im nächsten Schritt erzeugt man in C:\haikuVM\examples\src\main\java\heise eine Datei namens blinky.java und stattet sie mit folgendem Inhalt aus:

package heise; 
import static haiku.avr.lib.arduino.WProgram.*;
public class Blinky {
static byte ledPin = 13;

public static void main(String[] args) {
pinMode(ledPin, OUTPUT);
while(true) {
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin, LOW);
}
}
}

Aus technischer Sicht gibt es keine großen Neuerungen: Man nutzt eine Schleife, die die bekannte charakteristische Wellenform am für die LED vorgesehenen Pin 13 emittiert. Anschließend kommt der Haiku-Compiler zum Einsatz, der aus einer Gruppe von Batch-Dateien besteht. Aktuelle Versionen von HaikuVM kommen mit JDK 8 zurecht – zum Finden des Werkzeugs ist das Setzen einer Umgebungsvariable zwingend erforderlich:

C:\haikuVM\bin> set LEJOS_NXT_JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0_40 

Danach verbindet man den Arduino Uno mit der Workstation. An der Stelle bietet sich ein probeweiser Start der Arduino IDE an: Sie bietet einen bequemen Weg zum Ermitteln des für die Kommunikation vorgesehenen COM-Ports an. Die Information wandert im nächsten Schritt in den Aufruf des Haiku-Hauptbefehls, der im Fall der Beispielkonfiguration folgendermaßen aussieht:

C:\haikuVM\bin>C:\haikuVM\bin\haiku -v --Config arduino --Config:Port com5 -o Blinky.hex C:\haikuVM\examples\src\main\java\heise\Blinky.java 

Das Deployment des Programms sollte nun abgeschlossen sein – auf der Workstation kam es bei der Ausführung des als avrdude bezeichneten Brennprogramms zur Fehlermeldung, die auf das Nichtübereinstimmen der erwarteten und der vom Prozessrechner zurückgelieferten Informationen hinweist. Die Ursache dafür ist die von HaikuVM erwartete Arbeitsumgebung, die insbesondere im Bereich des Bootloaders nicht zum Arduino passt. Die Toolchain arbeitet mit einer Gruppe von Profilen, die unter
C:\haikuVM\config\HaikuVM.properties deklariert und parametrisiert werden. Danach öffnet man das File in einem beliebigen Texteditor.

Da HaikuVM eine vergleichsweise komplexe Vererbungsstruktur realisiert, bietet sich stattdessen die "Radikalmethode" an. Entwickler suchen im ersten Schritt alle Vorkommnisse des Strings 57600, um sie durch den Wert 115200 zu ersetzen – damit ist die zur Kommunikation verwendete Baudrate angepasst. Ärgernis Nummer zwei betrifft den Bootloader: Der in HaikuVM erwartete "stk500v1" muss durch "arduino" ersetzt werden. Nach der Korrektur quittiert avrdude den Brennprozess folgendermaßen:

... 
avrdude: verifying ...
avrdude: 5430 bytes of flash verified

avrdude done. Thank you.

Damit ist auch diese Version des Programms einsatzbereit. Der für die Abarbeitung der while-Schleife benötigte Zeitaufwand liegt im Bereich von rund sieben Mikrosekunden; beachtenswert ist die hohe Wellenformstabilität (s. Abb. 9 bis 11).

Die Verarbeitung der While-Schleife nimmt nicht ... (Abb. 9)

... sonderlich viel Zeit in Anspruch, wie der hervorgehobenen Teil der Wellenform oben belegt (Abb. 10).

Da der Garbage Collector nichts zu tun hat, ist die Stabilität hervorragend (Abb. 11).

HaikuVM kann seine Stärken immer dann ausspielen, wenn eine größere Menge von in Java vorliegenden Algorithmen auf den Microcontroller zu bringen ist. Im Zusammenspiel mit einem der größeren AVR-MCUs lässt sich eine erstaunliche Menge Code "mobilisieren": Der wegfallende Umstellungsaufwand und die kommunale Codebasis rentieren sich so gut wie immer.

Wer HaikuVM erwähnt, darf Mike Kohns JavaGrinder nicht ignorieren. Es handelt sich dabei um eine Implementierung einer virtuellen Laufzeitumgebung für Java. Kohn versuchte, maximale Portierbarkeit zu garantieren. Zum Erreichen dieses Fernziels setzte er auf einen zweistufigen Prozess: Die Workstation kompiliert das Java-Programm in eine Gruppe von Funktionen, die dann von nasm oder der nativen Toolchain weiterkompiliert werden. Der Clou an der Sache findet sich in der Datei Generator.h, die wie folgt aufgebaut ist und Kenner der JVM an ebenderen Bytecode erinnert:

class W65816 : public Generator 
{
public:
W65816();
...
virtual int push_long(int64_t n);
virtual int push_float(float f);
virtual int push_double(double f);

Aus technischer Sicht unterscheidet sich JavaGrinder nicht signifikant von HaikuVM: Das Produkt ist interessant, um Java-Code schnell auf eine neue Controllerplattform zu portieren. Ein gutes Beispiel dafür ist die Portierung von Java auf den Parallax Propeller – Kohn beschreibt, dass die Arbeit binnen kürzester Zeit bewerkstelligt war.