SJC: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
(Java für ATmega mit SJC)
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
''von Stefan Frenz''
''von [[Benutzer:Stefan Frenz]]''


== Übersicht über SJC ==
== Übersicht über SJC ==
Zeile 25: Zeile 25:
'''Kurzanleitung'''
'''Kurzanleitung'''


TODO
1. Benötigte Dateien
 
* Linux: compile (~500kb)
* Windows: compile.exe (~500kb)
* alle: bootconf.txt (~130b), batmel32.bin (98b)
* Beispielprojekt: atbase.zip (~10kb)
Alle Dateien sind unter untenstehender Quelle verfügbar.
 
2. Angenommene Verzeichnisstruktur
 
* im aktuellen Verzeichnis: obige Dateien
* im Verzeichnis atbase unterhalb des aktuellen: entpacktes Beispielprojekt
 
3. Testaufruf
 
* Linux: ./compile -t atmega -L -P batmel32.bin -y -e 0x60 -E -a 0 -o boot -B -C -k atbase
* Windows: compile.exe -t atmega -L -P batmel32.bin -y -e 0x60 -E -a 0 -o boot -B -C -k atbase
Erzeugt werden sollten aus allen (!) Quelltexten im Verzeichnis "atbase" eine Datei syminfo.txt mit textuellen Informationen zum erzeugten Image sowie eine Datei BOOT_ATM.HEX, die das erzeugte Image enthält und von avrdude weiterverwendet werden können sollte, je nach lokalen Gegebenheiten zum Beispiel mittels: avrdude -P /dev/ttyUSB1 -p m32 -c stk500v2 -U flash:w:BOOT_ATM.HEX
 
4. Erläuterung der Optionen
 
Der Compiler übersetzt im Gegensatz zum Java-Compiler von Sun nicht eine Datei nach der anderen und sucht sich die jeweils referenzierten Dateien selbst, sondern übersetzt genau die angegebenen Dateien oder rekursiv alle auffindbaren Java-Dateien in einem Verzeichnis (in obigem Beispiel "atbase"). Er erzeugt standardmäßig Code für die ia32-Architektur mit einer maximalen Image-Größe von 128k und diversen Java-konformen Einstellungen. Für die Verwendung mit dem ATmega sind "ein paar" andere Einstellungen sinnvoll:
* -t atmega: Code für den ATmega statt für ia32 erzeugen.
* -L: Möglichst abgespeckte Objekte ohne Heap-Informationen verwenden.
* -y: Strings mit byte- statt char-Werten verwenden.
* -B: Keine Bound-Checks für Arrays (Vorsicht: ein ungültiger Index wird nicht mehr erkannt!).
* -C: Keine Array-Store-Checks für Arrays (Vorsicht: die Ablage eines Objekts in einem Objekt-Array wird zur Laufzeit nicht mehr überprüft, bei ATmega-Projekten wohl kein Problem).
* -k: Keine Code-Erzeugung für ausschließlich inline erzeugte Methoden.
* -P batmel32.bin: Speziellen Header (bei ATmega für Startcode und Interrupt-Tabelle) verwenden.
* -e 0x60 -E -a 0: Compiler in den "embedded mode" schalten, RAM bei Adresse 0x60 und Flash bei Adresse 0 beginnen lassen.
* -o boot -O "bootconf.lin#atmel": Ausgabemodul "boot" des Compilers aktivieren, die dafür erforderliche Konfiguration steht in der Datei "bootconf.lin" im Abschnitt "atmel" (standardmäßig wird die Datei "bootconf.txt" und der Abschnitt "default" verwendet).


'''Geplante Erweiterungen'''
'''Geplante Erweiterungen'''
Zeile 46: Zeile 76:
* Offizielle Versionen: http://www.fam-frenz.de/stefan/compiler.html
* Offizielle Versionen: http://www.fam-frenz.de/stefan/compiler.html
* Nightly Snapshot: http://www-vs.informatik.uni-ulm.de/dept/staff/frenz/private/snapshot/
* Nightly Snapshot: http://www-vs.informatik.uni-ulm.de/dept/staff/frenz/private/snapshot/
* Beispielprojekte: http://www.fam-frenz.de/stefan/atproj.html


== Siehe auch ==
== Siehe auch ==

Version vom 13. Januar 2010, 13:36 Uhr

von Benutzer:Stefan Frenz

Übersicht über SJC

Es existiert ein experimenteller Java-Compiler namens SJC (siehe Link unten), direkt nativen Code für diverse Plattformen 1.4 erzeugt, wobei die Syntax in etwa Java 1.4 entspricht und keine Bibliotheken oder virtuelle Maschinen vorausgesetzt werden. Neben ia32 und x86_64 kann auch nativer (i.e. ausführbarer, nicht zu interpretierenden) Code für die ATmega-Reihe erzeugt werden.

Der Compiler wird für Forschung und Lehre sowie diverse private Projekte eingesetzt, ist vollständig in Java geschrieben und steht unter GPL. Da er sich selbst übersetzen kann und entsprechende Konfigurationen für Linux- und Windows-Ausgaben existieren, können statt der Java-Class-Files auch einzeln ausführbare Versionen verwendet werden, für die keine SunJava-Umgebung und keine Bibliotheken erforderlich sind.

Derzeit ist der Optimierer noch sehr rudimentär, so dass derzeit gegenüber einer Implementierung mit avrgcc etwa mit Faktor 1.8 Flashbedarf gerechnet werden muss. Der Autor freut sich über Mithilfe. ;-)

Systemprogrammierung mit SJC

Hardwarezugriff

Um den Zugriff auf die Hardware auch in Java zu ermöglichen, existieren drei Spezial-Klassen:

  • MAGIC: Codeerzeugender Zugriff auf die Hardware, zum Beispiel Zugriff auf das RAM mittels MAGIC.rMem8(addr) oder MAGIC.wMem32(addr, value).
  • MARKER: Hinweise für den Compiler, eine besondere Behandlung der aktuellen Methode oder des nachfolgenden Codes vorzunehmen, zum Beispiel Markierung der aktuellen Methode als Interrupt-Handler mittels MARKER.interrupt().
  • STRUCT: Elternklasse für eigene Klassen, die den Zugriff auf strukturierte RAM-Bereiche ohne Objekte ermöglichen.

Laufzeitumgebung

Die Laufzeitumgebung wird immer mitübersetzt, es kann also gezielt auf Bestandteile verzichtet werden, die nicht benötigt werden. Beispielumgebungen sind unter untenstehendem Link auf SJC vorhanden, das Handbuch beschreibt die erforderlichen und optionalen Klassen und Methoden.

Kurzanleitung

1. Benötigte Dateien

  • Linux: compile (~500kb)
  • Windows: compile.exe (~500kb)
  • alle: bootconf.txt (~130b), batmel32.bin (98b)
  • Beispielprojekt: atbase.zip (~10kb)

Alle Dateien sind unter untenstehender Quelle verfügbar.

2. Angenommene Verzeichnisstruktur

  • im aktuellen Verzeichnis: obige Dateien
  • im Verzeichnis atbase unterhalb des aktuellen: entpacktes Beispielprojekt

3. Testaufruf

  • Linux: ./compile -t atmega -L -P batmel32.bin -y -e 0x60 -E -a 0 -o boot -B -C -k atbase
  • Windows: compile.exe -t atmega -L -P batmel32.bin -y -e 0x60 -E -a 0 -o boot -B -C -k atbase

Erzeugt werden sollten aus allen (!) Quelltexten im Verzeichnis "atbase" eine Datei syminfo.txt mit textuellen Informationen zum erzeugten Image sowie eine Datei BOOT_ATM.HEX, die das erzeugte Image enthält und von avrdude weiterverwendet werden können sollte, je nach lokalen Gegebenheiten zum Beispiel mittels: avrdude -P /dev/ttyUSB1 -p m32 -c stk500v2 -U flash:w:BOOT_ATM.HEX

4. Erläuterung der Optionen

Der Compiler übersetzt im Gegensatz zum Java-Compiler von Sun nicht eine Datei nach der anderen und sucht sich die jeweils referenzierten Dateien selbst, sondern übersetzt genau die angegebenen Dateien oder rekursiv alle auffindbaren Java-Dateien in einem Verzeichnis (in obigem Beispiel "atbase"). Er erzeugt standardmäßig Code für die ia32-Architektur mit einer maximalen Image-Größe von 128k und diversen Java-konformen Einstellungen. Für die Verwendung mit dem ATmega sind "ein paar" andere Einstellungen sinnvoll:

  • -t atmega: Code für den ATmega statt für ia32 erzeugen.
  • -L: Möglichst abgespeckte Objekte ohne Heap-Informationen verwenden.
  • -y: Strings mit byte- statt char-Werten verwenden.
  • -B: Keine Bound-Checks für Arrays (Vorsicht: ein ungültiger Index wird nicht mehr erkannt!).
  • -C: Keine Array-Store-Checks für Arrays (Vorsicht: die Ablage eines Objekts in einem Objekt-Array wird zur Laufzeit nicht mehr überprüft, bei ATmega-Projekten wohl kein Problem).
  • -k: Keine Code-Erzeugung für ausschließlich inline erzeugte Methoden.
  • -P batmel32.bin: Speziellen Header (bei ATmega für Startcode und Interrupt-Tabelle) verwenden.
  • -e 0x60 -E -a 0: Compiler in den "embedded mode" schalten, RAM bei Adresse 0x60 und Flash bei Adresse 0 beginnen lassen.
  • -o boot -O "bootconf.lin#atmel": Ausgabemodul "boot" des Compilers aktivieren, die dafür erforderliche Konfiguration steht in der Datei "bootconf.lin" im Abschnitt "atmel" (standardmäßig wird die Datei "bootconf.txt" und der Abschnitt "default" verwendet).

Geplante Erweiterungen

Für den Compiler sind eine Reihe von Erweiterungen geplant, die derzeit mangels Zeit noch nicht umgesetzt sind:

  • Konstante Platzierung von STRUCTs zum einfacheren Zugriff auf die benannten Register des ATmega.
  • Markierung von Klassen als "keep in flash", um zum Beispiel Strings direkt aus dem Flash zugreifen zu können.
  • Code-Optimierung - sei es abhängig oder unabhängig von der Zielarchitektur.

Umgesetzte Projekte

Hier soll eine kleine Liste der Projekte entstehen, die mit SJC umgesetzt wurden, zur leichteren Einordnung optimalerweise mit Autor und Datum des ersten Eintrags.

  • smf, 2010-01-13: GPS-Logger mit Anzeige auf LCD und Aufzeichnung auf SD-Karte.
  • smf, 2010-01-13: Zeitmessung und Rundenzähler für Rennbahnen.

Software

Siehe auch