Forum: Mikrocontroller und Digitale Elektronik I/O-Port in java für embedded Linux (ARM)


von Andreas S. (andi12)


Lesenswert?

Hey Leute, ich habe einen LPC3250 Controller von embedded artists und 
möchte diesen Controller gerne in Java programmieren.
Wie kann ich in Java einen I/O-Port abfragen? Prinzipiell müsste man ja 
abfragen können ob das zugehörige Register gesetzt ist?!
Oder ist das nicht ohne weiteres möglich?

Danke für eure Antworten
Andi

von Stefan (Gast)


Lesenswert?

Java selbst erlaubt keine direkten Zugriff auf die Hardware. Du brauchst 
eine Library (typischerweise in C), über deren Prozeduren/Funktionen Du 
auf die Hardware zugreifen kannst. Vermutlich enthält Deine Java 
Laufzeitumgebung (als der Teil, der sich in der Firmware des Controllers 
befindet) bereits eine oder mehrere Libraries für den Zugriff auf die 
Hardware.

von Andreas S. (andi12)


Lesenswert?

Dann brauch ich also einen Art InputReader aus dem Package java.io oder?
Aber dann muss ich ja auch noch eine Information über diesen I/O-Port 
geben, also welcher das ist.

Ich habe leider auf dem Mikrocontroller gebiet nicht soviel Ahnung.

Grüße.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Andreas S. schrieb:
> Dann brauch ich also einen Art InputReader aus dem Package java.io oder?

Nein du benötigst die zu diesem Board hofentlich mitgelieferte 
RuntimeUmgebung welche einen entsprechende Schnittstell bereistellt 
(z.B. JNI). Ist das Baord überhaupt für das Programmieren mit Java 
ausgelegt?

von Andreas S. (andi12)


Lesenswert?

Läubi .. schrieb:
> Ist das Baord überhaupt für das Programmieren mit Java ausgelegt?

Ja, auf dem Board läuft embedded Linux und hat somit auch eine Runtime 
Umgebung.

Ich habe allerdings keine Ahnung wie ich die Schnittstellen nützen kann.

Alternativ habe ich mir überlegt ein kleines C-Programm zu schreiben das 
den Port ausliest und dann diese Information an mein Java Programm 
übergibt. Allerdings weis ich hier auch nicht wie ich ein Java Programm 
mit einen C Programm verknüpfen kann.

von Oliver J. (skriptkiddy)


Lesenswert?

Ich würde ein Kernel-modul schreiben, welches mir über einen proc-entry 
die nötige Funktionalität zur Verfügung stellt. Den proc-entry kann man 
dann einfach lesen und schreiben, als wäre er eine Datei.

Gruß Oliver

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Andreas S. schrieb:
> Ja, auf dem Board läuft embedded Linux und hat somit
> auch eine Runtime Umgebung.
Ich meinte eher Ob es dafür ein "Java binding" oder so etwas gibt. Im 
einfachstem Falle gibt es doch für die I/Os auch einfach entsprechende 
/dev/balblabla Sachen welche man in Java einfach als Datei öffnen kann.

Andreas S. schrieb:
> Allerdings weis ich hier auch nicht wie ich ein Java
> Programm mit einen C Programm verknüpfen kann.
Dafür gibt es JNI: 
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/
Imprinzip ist das nicht viel mehr als eine Javadatei welche einige 
Methoden als "native" markeirt hat, dann wird mit dem JNI Compiler 
daraus eine c und h Datei mit Definitionen erzeugt welche mal als dll/so 
übersetzt. Also kein Hexenwerk, du benötigst aber eine C-Buildumgebung 
für dein Zielboard und natürlich dann in C Zugriffsmöglichkeiten auf die 
Ports.

von Stefan (Gast)


Lesenswert?

Java kann häufig diese virtuellen /dev Device in der Regel nicht sauber 
ansprechen, sondern nur Dateien.

Embedded Linux bedeutet noch lange nicht, dass Du die nötigen Java 
Libraries hast. Der Knackpunkt ist, dass Java Programme von einer 
virtuellen Maschine (man könnte sie auch "Intepreter" nennen) ausgeführt 
wird. Unter Windows ist das die java.exe. Vereinfacht gesagt, arbeitet 
die java.exe die Befehle aus, die im Java Programm (jar Datei oder 
*.class Dateien) stehen.

Alle mir bekannten virtuellen Java Maschinen kennen Files, Console, 
Grafische Bildschirmausgaben und TCP/IP. Mehr nicht.

Alles Weitere ist hardwarespezifisch und muss durch die Laufzeitumgebung 
bereitgestellt werden. Die Laufzeitumgebung besteht typischerweise auf 
einem Satz Java Libraries, welche wiederum C Libraries aufrufen, welche 
über Kernel Module, Gerätetreiber oder direktem Hardwarezugriff mit der 
Hardware kommunizieren. Ein typischer Fall ist der serielle Port. Dafür 
nutzt man bei PC's die RxTxComm Library, eben weil Java keine seriellen 
Ports kennt und dementsprechend keine Befehle für diese Ports bereit 
stellt.

Ähnlich ist es mit deinen I/O Pins. Java kennt keine Befehle für den 
Zugriff auf I/O Pins, C aber schon. Also schreibt man sich eine 
C-Library, mit Funktionen zum Zugriff auf den Port. Dazu schreibt man 
sich eine Java Library, welche die C Library aufruft. Die Schnittstelle 
zwischen C und Java heisst JNI.

Die Java Version für Windows, Linux, MAC, ... enthält einige solcher JNI 
Libraries, sonst könnten Java Programme gar keine Windows Funktionen 
Funktionen nutzen - sie hätten keine I/O Schnittstellen, also weder 
Tastatur, noch Bildschirm, noch Netzwerk.

Java besteht also auf einer virtuellen Maschine, plus einer 
Laufzeitmgebung (die mitgelieferten Libraries). Die Laufzeitumgebung ist 
abhängig vom Betriebssystem.

Manche Computer haben gar kein Betriebssystem, aber dennoch Java (zum 
Beispiel Lego Mindstorms mit Lejos). In diesem Fall enthalten die C 
Libraries ALLE Funktionen zum Zugriff auf die Hardware, Kernel Module 
und Gerätetreiber entfallen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stefan schrieb:
> Java kann häufig diese virtuellen /dev Device in der Regel
> nicht sauber ansprechen, sondern nur Dateien.
Dafür hast du bestimmt konkrete Beispiele...

Stefan schrieb:
> Java kennt keine Befehle für den
> Zugriff auf I/O Pins, C aber schon.

Dann zeig mir mal die I/O Pin Spezifikation im C Standard... C "kennt" 
genausowenig die I/O Ports, du benötigst da im einfachstem Falle ein 
Headerfile vom Hersteller und passende "Aufrufkonventionen" im 
einfachstem Falle werden die Bits direkt in eine Speicheradresse 
geschrieben (z.B. AVR).

Stefan schrieb:
> eben weil Java keine seriellen Ports kennt
Hängt wie gesagt von der Runntime ab.

von Andreas S. (andi12)


Lesenswert?

Vielen Dank für die Tipps. Ich habs jetzt schonmal hinbekommen ein 
HelloWorld Programm zu schreiben wobei ich eine C Funktion in eine Java 
Klasse eingebunden habe.
Im nächsten Schritt versuch ichs jetzt mit dem I/O Pin.

Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.