Java am Microcontroller

Seite 3: Java in Frankreich

Inhaltsverzeichnis

Sowohl HaikuVM als auch die weiter oben genannte JNI-Lösung leiden darunter, dass das Einbinden von Bildschirmen und Eingabehardware in Arbeit ausartet: Auch wenn das Swizzeling der Daten für ein SPI-Display im "grand scheme of things" nicht weiter relevant erscheint, ist es doch eine mehr als ärgerliche Arbeit. Eine von diversen Initiativen im Hause SGS Thompson ist das Anbieten einer virtuellen Maschine, die auf die Bedürfnisse von an HMI-Systemen arbeitende Entwickler optimiert ist. Der Autor bespricht das – vergleichsweise teure – Produkt an dieser Stelle vor allem deshalb, weil es die Zukunft von Java im Embedded-Bereich skizziert. STM unterstützt rund ein Dutzend Controller – das im Handel preiswerte STM32F429I-DISCO dient als "Basis" für die folgenden Experimente. Zuerst ist eine Registrierung erforderlich. Das zum Download bereitstehende .zip-Archiv ist auf der Workstation zu installieren und zur Aktivierung freizugeben. Der Prozess kann nur an französischen Arbeitstagen erfolgen und nimmt einige Stunden Zeit in Anspruch.

Das Kompilieren übernimmt die Entwicklungsumgebung Keil: Auf der Website von IS2T findet sich ein PDF, das einen personalisierten Aktivierungscode enthält. Nach dem ersten Start der IDE müssen Entwickler einige Device-Support-Dateien herunterladen, um das Produkt mit dem verwendeten Microcontroller bekannt zu machen. Die eigentliche Entwicklung erfolgt in zwei Schritten: Man klickt auf File | New | Java Platform, um den Assistenten zum Erstellen einer neuen Java-Plattform zu öffnen. Als Architektur dient STM32JavaF4, während die Vorlage STM32F429I-DISCO | Full die für das Board benötigten Anpassungen lädt. STM32Java generiert sodann die vier in der Abbildung 12 gezeigten Projektmappen, die gemeinsam die Laufzeitumgebung darstellen.

Plattformen bestehen aus mindestens vier Unterprojekten (Abb. 12).

In bsp findet sich das Board Support Package für MicroVision, während -configuration- eine .platform-Datei enthält. Ein Doppelklick darauf im grafischen Editor und der anschließende Klick auf Build Platform stößt das Kompilieren der Umgebung an. Zum Anlegen eines Projekts folgt ein Klick auf File | New | Java Example. Danach wählt man im Feld JPF die soeben erstellte Plattform aus, um darauf die Vorlage EDC | Hello World zu aktivieren. HelloWorld.java enthält Testcode, der vielen Entwicklern bekannt vorkommen dürfte:

public class HelloWorld { 

public static native void setupGPIO();
public static native void emit();

public static void main(String[] args) {
setupGPIO();
while(1==1)
{
emit();
}
}
}

Das Transpilieren in ein für Keil verständliches Format erfolgt durch [Run | Run configurations, wo man die Rubrik MikroEJ Application öffnet. Wählen Entwickler nun die Option EmbJPF aus und klicken auf Run, ist der Lohn der Mühen eine ELF-Kompilatdatei, die STM32Java automatisch in das vom Keil-Projekt erwartete Verzeichnis kopiert. Danach klickt man im BSP-Verzeichnis auf Project | MicroEJ | MDK-ARM | Project.uvproj, um den Ladeprozess in MicroVision anzustoßen.

Da STM32Java derzeit nicht mit dem neuen Projektformat von Keil 5 zurechtkommt, muss man auf Install Legacy Support klicken. Im daraufhin erscheinenden Fenster wird der Button Download Legacy Support for Cortex-M Devices angeklickt, um die Unterstützungsbibliotheken zu laden. Nach einem Klick auf Project | Build target wirft die IDE zwei Fehlermeldungen, die über die Namen der fehlenden nativen Methoden informieren:

linking... 
.\STM32F429i-DISCO\STM32429I-DISCO.axf: Error:
L6218E: Undefined symbol
Java_com_is2t_examples_edc_hello_HelloWorld_setupGPIO
(referred from javaapp.o).
.\STM32F429i-DISCO\STM32429I-DISCO.axf: Error:
L6218E: Undefined symbol
Java_com_is2t_examples_edc_hello_HelloWorld_emit
(referred from javaapp.o).

Keil gruppiert Codedateien in sogenannte Groups: Ein Rechtsklick auf das Stammverzeichnis ermöglicht das Anlegen einer neuen. Danach legt man eine C-Datei an, die mit der Inklusion einiger für die Arbeit mit STM-Prozessoren notwendiger Header beginnt:

#include "cpu.h" 
#include "stm32f4xx.h"
#include "stm32f429i_discovery_sdram.h"
#include "stm32f4xx_fmc.h"
#include "stm32f429i_discovery.h"

Die für das Ausgeben der charakteristischen Wellenform zuständige Methode emit() verhält sich im Großen und Ganzen so, wie man es erwartet. Der einzige Unterschied zum vorhergehenden Beispiel ist, dass man nun auf die in SGS Thompsons "HAL" CUBE enthaltenen GPIO-Methoden zurückgreift:

void Java_com_is2t_examples_edc_hello_HelloWorld_emit() { 
GPIO_SetBits(GPIOC, GPIO_Pin_0 );
GPIO_ResetBits(GPIOC, GPIO_Pin_0 );
GPIO_SetBits(GPIOC, GPIO_Pin_0 );
GPIO_ResetBits(GPIOC, GPIO_Pin_0 );
}

Die in WiringPi enthaltenen Abstraktionen fehlen unter MicroVision. Die manuelle Konfiguration des GPIO-Ports sieht folgendermaßen aus:

void Java_com_is2t_examples_edc_hello_HelloWorld_setupGPIO() { 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}

Damit steht das Programm zum Test bereit. Der Klick auf Project | Build Target ermöglicht das Kompilieren des Projekts, und ein Klick auf Flash | Download stößt die Übertragung an das angeschlossene Evaluationsboard an. Danach verbindet man einen Oszillographen und einen Modulationsdomänenanalysator mit Pin 0 des Evaluationsboards, um weitere Informationen über die Stabilität der Wellenform zu erhalten (s. Abb. 13 und 14).

Auch am STM32 zeigt sich JNI von der langsamen Seite (Abb. 13).

Die extremen Ausreißer nach unten sind seltsam (Abb. 14).

Das Realisieren charakteristischer Rechteckwellen ist laut STM nicht Ziel der Plattform. Seine Stärken spielt STM32Java beim Gestalten grafischer Benutzeroberflächen aus. IS2T arbeitet an der Stelle mit dem ESR-Konsortium zusammen, das seinen Partnern zwei Frameworks anbietet. MicroUI(ESR002) ist dabei ein Eventverwaltungssystem, das zudem einige an QML erinnernde Grafikelemente mitbringt und teilweise auch auf semigrafischen Anzeigen funktioniert. MWT(ESR011) – der Begriff steht für Micro Window Toolkit – implementiert derweil einen vollständigeren Grafikstack.

ST Microns Java-Initiative droht primär aus der Welt der Prozessrechner Unbill: Für Kleinserien ist der Mehrpreis für einen Orange Pi klein im Vergleich zu den nicht unerheblichen Lizenzgebühren. Auch bei einer Mittelserie hat Unix angesichts der höheren Kommunalität Vorteile: Die IS2T-Runtime amortisiert sich erst ab einer gewissen Menge gefertigter Platinen.