Real-Time and Embedded Systems

tinyVM

Die TinyVM ist eine Java Virtual Machine für den RCX. Programme für die TinyVM werden an einem gewöhnlichen Linux-Rechner mit einem gewöhnlichen Java-Compiler erstellt. Ein Crosscompiler ist hierfür also nicht erforderlich.

Systemvoraussetzungen:

  • Linux (für andere Systeme siehe Homepage)
  • JDK 1.1 oder 1.2. Eigene Erfahrungen: 1.1.8 und 1.3.1_01 gehen, 1.4.0-b92 nicht (vielleicht mit -target 1.1). Ansonsten - probieren, oder gleich eins benutzen, mit dem es geht. Vorsicht: Für Installation (make) und Kompilieren der eigenen Programme die gleiche Version benutzen! Zur Benutzung der mitgelieferten Skripte sollte das bin-Verzeichnis im PATH sein, bzw. ein Alias für "javac" existieren.

 

Installation:

  • tinyVM von http://tinyvm.sourceforge.net/ herunterladen, zum Beispiel tinyvm_0_2_6.tar.gz und die Datei auspacken.
  • bin-Verzeichnis der TinyVM dem PATH hinzufügen.
  • "make" im TinyVM-Homeverzeichnis ausführen.
  • RCXTTY auf com-device setzen, der für den Upload an den RCX benutzt wird, z.B:
    export RCXTTY=/dev/ttyS0
    
  • Sicherstellen, daß die nötigen Rechte vorhanden sind (lesen und schreiben)!
  • Firmware downloaden:
    tvmfirmdl

 

Beispiel für Kompilieren und Upload

Das Beispielprogramm Displaytest.java wird folgendermaßen compiliert:

Listing von Displaytest.java

import tinyvm.rcx.*;
public class Displaytest {
   public static void main(String[] args){
      LCD.clear();
      LCD.showNumber(23);
      Time.sleep(1000);
   }
}

Kompilation:

export CLASSPATH=.

  # Kompilieren. Es wird der normale Java-Compiler benutzt.
  # Dieses Skript ruft ihn mit dem korrekten CLASSPATH auf.

  tvmc Displaytest.java

  # Sollte die Meldung "javac: invalid flag: -bootclasspath" auftauchen,
  # so paßt das entsprechende shell-Skript nicht zu Deiner Java-Version.
  # In dem Fall änder' in der bin/tvmc die Zeile
  # ${JAVAC} -bootclasspath "${JCCP}" $@
  # in
  # ${JAVAC} -classpath "${JCCP}" $@

  # Linken und Upload geht in einem Befehl.
  # Alternative: Linken mit "tvmld -o Displaytest.tvm Displaytest",
  # Download mit "tvm Displaytest.tvm".

  tvmld Displaytest -d

  # Jetzt die Run-Taste auf dem RCX drücken. Auf dem Display sollte
  # für eine Sekunde eine "23" erscheinen.

In dem Rechnerpool im Hochhaus R. 802 sind die Dateien für die TinyVM fertig installiert (mit 1.3.1_01) in /home/rtj/tinyvm. Dort wird folgendermaßen gearbeitet:

export RCXTTY=/dev/ttyS0

  # Wichtig, läuft nicht mit 1.4!

  export PATH=/usr/local/jdk1.3.1_01/bin:/home/rtj/tinyvm/bin:$PATH
  export CLASSPATH=.
  tvmfirmdl
  tvmc Displaytest.java
  tvmld Displaytest -d

Einschränkungen:

  • kein Garbagecollector
  • keine switch-Anweisungen möglich
  • keine Floating point operations *
  • keine Berechnungen mit long-Variablen
  • arrays sind auf 255 Objekte begrenzt (511 bei lejOS)
  • Gesamtzahl aller Klassen auf 255 begrenzt *
  • Rekursionstiefe auf 8 begenzt *
  • Parameterliste der Funktionen ist auf 64 Bytes begrenzt *
  • Einschränkungen bei der String-Bearbeitung *
  • Einschränkungen bei instanceof (immer true bei Interfaces)
  • kein instanceof und checkcast bei Array-Klassen
  • alle Threads sind non-daemon Threads *
  • keine Objekte vom Typ java.lang.Class
  • die meisten JDK-APIs stehen nicht zur Verfügung

 

Mit * markierte Einschränkungen sind bei lejOS implementiert.

Wichtige Links:

Homepage der TinyVM. Siehe vor allem im "User's Guide" die "Performance Tips".

API zur TinyVM

lejOS, eine Alternative zur TinyVM. Ist in jeder Hinsicht weiter entwickelt als die TinyVM, allerdings auch deutlich größer: Die TinyVM benötigt nur 9 kB, während lejOS 16 kB von den 32 kB des RCX-Speichers belegt.