Einführung in Mindstorms und Java Umgebung

Werbung
SEMINAR
Vernetzung und Interaktion
verteilter eingebetteter
Systeme
Mateusz Majer ([email protected])
Hardware-Software-Co-Design
Friedrich-Alexander-Universität Erlangen-Nürnberg
1
Vernetzte eingebettete Systeme
Beispiele für vernetzte eingebettete Systeme:
Automotiv-Elektronik
Computer-Netzwerke
Bluetooth-Headset und Handy
…
Abhängig von der Anwendung müssen gemeinsame
Kommunikationsmechanismen gefunden werden.
Friedrich-Alexander-Universität Erlangen-Nürnberg
2
Aspekte der Vernetzung
Ad-Hoc-Netzwerke
Wie registrieren Netzwerkknoten, ob sich andere
Kommunikationspartner in der Nähe befinden?
Wie werden Kommunikationsknoten in ein Netz integriert?
Zyklus n
Zyklus n+1
Knoten 1 Knoten 2 Knoten 3 Knoten 1 Knoten 2 Knoten 3
neuer
Knoten
Zeit
Uhrensynchronisation:
Wie erhalten alle Knoten eine gemeinsame Zeitbasis?
Datenübertragung:
Wie werden Fehler bei der Datenübertragung erkannt und
korrigiert?
Friedrich-Alexander-Universität Erlangen-Nürnberg
3
Umsetzung am Beispiel: Lego-Mindstorms
Mindstorms:
Infrarot Sender
und Empfänger
Schnittstellen
für Aktoren
LCD-Display
Schnittstellen
für Sensoren
Lautsprecher
Ziel:
Ein Mindstorm spielt eine einstimmige Midi-Musik-Datei ab.
Gruppe von Mindstorms soll synchron eine mehrstimmige
Melodie spielen
Implementierung unter leJOS (Java für Lego)
Friedrich-Alexander-Universität Erlangen-Nürnberg
4
Organisation
Dozenten:
Thilo Streichert
Mateusz Majer
Umfang/Stunden:
S2 für Hardware-Software-Co-Design und Betriebsysteme
Scheinvergabe auf Ausarbeitung, Präsentation und
regelmäßiger, aktiver Teilnahme.
Ort und Zeit des Seminars:
1. Gruppe – Montags 14:30 – 16:00
2. Gruppe – Donnerstags 9:00 – 10:30
Friedrich-Alexander-Universität Erlangen-Nürnberg
5
Inhalt
Einführung
Motivation
Geschichtlicher Hintergrund
Das Mindstorm System
RCX Hardware
Sensoren
Der Mikrocontroller
LejOS + VM
Java Threads
Friedrich-Alexander-Universität Erlangen-Nürnberg
6
LEGO Mindstorms
Die LEGO-Gruppe entwickelte 1998 in
Zusammenarbeit mit dem MIT und der
Firma SRI das LEGO-Mindstorms
System
Weltweit
der beliebteste
RoboterBaukasten
Friedrich-Alexander-Universität Erlangen-Nürnberg
7
Was man alles so machen kann…
Videos
Friedrich-Alexander-Universität Erlangen-Nürnberg
8
Eine kurze Geschichte
MIT 1996
programmable brícks
Erweiterungsset für LEGO
Intelligentes Spielzeug für Kinder
http://llk.media.mit.edu/projects/cricket/
Mitchel Resnick, Fred Martin, Randy Sargent, and Brian Silverman.
(1996). Programmable Bricks: Toys to Think With. IBM Systems
Journal, vol. 35, no. 3-4, pp. 443-452.
Friedrich-Alexander-Universität Erlangen-Nürnberg
9
Eine kurze Geschichte
Der Lego-RCX Urahn
Surface-mount 16F84 CPU @ 1 MHz
Two 1A, 9v motor outputs
Two resistive sensor inputs
600 baud IR communications
2048 bytes of user memory (1792 program, 256 data)
Beeper, pushbutton, LEDs
Friedrich-Alexander-Universität Erlangen-Nürnberg
10
Eine kurze Geschichte
Friedrich-Alexander-Universität Erlangen-Nürnberg
11
Das Mindstorm System
Standardbausteine
Technikelemente
Mikrokontroller
Sensoren und Motoren
Friedrich-Alexander-Universität Erlangen-Nürnberg
z
Infrarotstation für
den PC
12
Sensoren
z
Rotationssensor
z
Lichtsensor
z
Temperatursensor
z Berührungssensor
Friedrich-Alexander-Universität Erlangen-Nürnberg
13
Das RCX Modul
LCD
Tasten
IR
3 Motoren
3 Sensoren
6 AA Batterien
Friedrich-Alexander-Universität Erlangen-Nürnberg
14
RCX von Innen
RCX-Platine von oben
Infrarotsender und –
Empfänger
Display
Lautsprecher
Friedrich-Alexander-Universität Erlangen-Nürnberg
RCX-Platine von unten
H8/3292
Mikrokontroller
Speicherbaustein
Display und
Motorsteuerbausteine
15
Der H8/3292 Mikrokontroller
Hitachi H8/300 CPU
16 MHz, 5V
16 KB ROM
512 Byte RAM intern
32 KB RAM extern
16 Bit Timer
8 Bit Timer 2 Kanäle
10 Bit A/D Wandler
8 Kanäle
1 Serielle Schnittstelle
Friedrich-Alexander-Universität Erlangen-Nürnberg
16
Die Infrarotschnittstelle
38 kHz Trägersignal
2400 bps Übertragungsrate
Rahmenformat
Header
Datenbytes plus Komplemente
Prüfsumme plus Komplement
Friedrich-Alexander-Universität Erlangen-Nürnberg
Header
55
FF
Prüfsumme
Komplement
00
65
Befehls-Code
9A
11
EE
Datenbyte
76
89
Komplement
17
Betriebssysteme
LEGO Firmware
Bytecode Interpreter
NQC (Not Quite C)
PbForth
Interaktiver Interpreter
LegOS
C/C++
Esterel
LeJOS
Java Virtual Machine
Friedrich-Alexander-Universität Erlangen-Nürnberg
18
Java für Lego Mindstorms RCX
leJOS, ein Java System
Winziges Java Betriebssystem (~ 16Kb)
Portierungen für Mindstorms RCX und UNIX (nur Emulation)
leJOS Bestandteile
Virtual Machine für Java Bytecode
Hilfssoftware für den Download
Emulationsumgebung
Java Development Kit (JDK) von SUN ist Vorraussetzung
Friedrich-Alexander-Universität Erlangen-Nürnberg
19
leJOS
leJOS unterstützt
Objektorientierung
Preemtive Threads
Arrays
Rekursion
Synchronisation
Exceptions
Die von leJOS angebotenen Klassenbibliotheken sind gut
dokumentiert.
Friedrich-Alexander-Universität Erlangen-Nürnberg
20
leJOS
leJOS bietet auch
Eine Windows Version
Fließkomma Operationen
String Konstanten
java.lang.Math Klasse mit sin, cos, tan, pow, …
Download von mehreren Programmen
Weitere APIs sind vorhanden: Internetzugriff vom RCX.
Friedrich-Alexander-Universität Erlangen-Nürnberg
21
Java kompilieren, linken
Um Java Dateien zu kompilieren wir das Kommando
`javasc` statt `javac` verwendet
javasc ist kein Java Kompiler
Sondern ein Skript welches die –bootclasspath Option setzt
und den Java Kompiler aufruft
lejos ist ein Linker
Löst alle Klassenreferenzen auf
Ermöglicht das Packen mehrerer Programme in eine Datei
lejosc *.java
lejos MyMainClass
Friedrich-Alexander-Universität Erlangen-Nürnberg
22
und auf dem RCX starten
Firmware herunterladen
Beim Start wird die Batteriespannung angezeigt
Muss nur einmal heruntergeladen werden
Ein Beispiel:
export RCXTTY=usb
lejosfirmdl
lejosc RS.java
lejos –o RS.bin RS
Lejosrun RS.bin
Friedrich-Alexander-Universität Erlangen-Nürnberg
23
Das Beispiel
import josx.platform.rcx.*;
class Receive
extends Thread
{
public void run()
{
while (true) {
if(Serial.isPacketAvailable()) {
Sound.beep();
LCD.showNumber(receiveByte());
}
try {
Thread.sleep(100);
} catch (InterruptedException e){
//nichts
}
}
}
private byte[] buffer = new byte[10];
/**
* Receive a single byte
*/
protected byte receiveByte() {
josx.platform.rcx.Serial.readPacket(buffer);
return buffer[1];
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
24
Das Beispiel
class Send
extends Thread
{
public void run()
{
byte i = 0;
while (true) {
try {
Button.RUN.waitForPressAndRelease();
sendByte(i);
if (i<128) {
i++;
} else {
i = 0;
}
Thread.sleep(100);
} catch (InterruptedException e){
//nichts
}
}
}
private byte[] packet = {(byte)0xf7, (byte)0x00};
/**
* Send a single byte
*/
protected void sendByte(byte b) {
packet[1] = b;
josx.platform.rcx.Serial.sendPacket(packet, 0, 2);
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
25
Das Beispiel
public class RS {
// include a timer for checking the receive queue
// implemented in a separate thread!!!
public static void main(String [] args) {
Receive r = new Receive();
Send s = new Send();
r.start();
s.start();
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
26
Emulation
Gelinkte Programme lassen sich auf dem
Entwicklungsrechner auch testen.
Der Linker wird durch emu-lejos ersetzt.
emu-lejos –o MyProgram.bin MyProgram
emu-lejosrun MyProgram.bin
Die Option –v ermöglicht den Programmverlauf zu verfolgen.
emu-lejos –o MyProgram.bin MyProgram
emu-lejosrun –v MyProgram.bin
Friedrich-Alexander-Universität Erlangen-Nürnberg
27
Einschränkungen
Keine garbage collection
switch Anweisungen werden nicht unterstützt
Arithmetische Operationen unterstützen Variablen des
Typs long nicht
Maximale Array Größe von 511
Es existieren keine Objekte vom Typ java.lang.Class.
Damit ergibt Class.Name() eine ClassNotFoundException.
Die meisten JDK APIs sind nicht vorhanden.
Friedrich-Alexander-Universität Erlangen-Nürnberg
28
Referenzen
http://lejos.sourceforge.net
http://lejos.sourceforge.net/tutorial
Guido Krüger
Handbuch der Java-Programmierung
3. Auflage
Addison-Wesley, 2002
ISBN 3-8273-1949-8
http://www.javabuch.de
Friedrich-Alexander-Universität Erlangen-Nürnberg
29
Multithreading in Java
Mit Nebenläufigkeit bezeichnet man die Fähigkeit eines
Systems, zwei oder mehr Vorgänge gleichzeitig oder
quasi-gleichzeitig ausführen zu können.
Java integriert Threads direkt in die Sprache.
Ein Thread ist ein eigenständiges Programmfragment, das
parallel zu anderen Threads laufen kann.
Ein Thread ähnelt damit einem Prozeß, arbeitet aber auf
einer feineren Ebene.
Alle Threads eines Programms teilen sich den
Adressraum.
Friedrich-Alexander-Universität Erlangen-Nürnberg
30
Multithreading in Java
Threads werden in Java durch die Klasse Thread und das
Interface Runnable implementiert.
leJOS implementiert das Interface Runnable jedoch nicht!
Der Thread-Body, also der parallel auszuführende Code,
wird in Form der überlagerten Methode run zur Verfügung
gestellt.
Zur Synchronisation stellt Java das Konzept des Monitors
zur Verfügung, mit dem kritische Abschnitte innerhalb
korrekt geklammerter Programmfragmente und Methoden
gekapselt werden.
Friedrich-Alexander-Universität Erlangen-Nürnberg
31
Die Thread Klasse
class MyThread
extends Thread
{
2.) Die Methode run() implementiert das Verhalten
public void run()
eines Threads. Oft eine endlos Schleife.
{
int i = 0;
while (true) {
System.out.println(i++);
}
}
}
public class Listing
{
public static void main(String[] args)
{
MyThread t = new MyThread();
t.start();
1.) Thread wird mit der Methode start() gestartet.
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
32
Threads unterbrechen
Durch Aufruf von interrupt wird ein Flag gesetzt, das eine
Unterbrechungsanforderung signalisiert.
Durch Aufruf von isInterrupted kann der Thread feststellen,
ob das Abbruchflag gesetzt wurde und der Thread beendet
werden soll.
Die statische Methode interrupted stellt den Status des
Abbruchsflags beim aktuellen Thread fest.
public void interrupt()
public boolean isInterrupted()
public static boolean interrupted()
Friedrich-Alexander-Universität Erlangen-Nürnberg
33
Threads unterbrechen
public class Listing
extends Thread
{
int cnt = 0;
public void run()
{
while (true) {
if (isInterrupted()) {
break;
}
printLine(++cnt);
}
}
3.) Hier wird überprüft ob ein Interrupt vorliegt und
gegebenenfalls der Programmthread
abgebrochen.
private void printLine(int cnt)
{
//Zeile ausgeben
System.out.println(cnt);
//100 ms. warten
try {
Thread.sleep(100);
} catch (InterruptedException e) {
interrupt();
}
}
public static void main(String[] args)
{
Listing th = new Listing();
{
//Thread starten
th.start();
//2 Sekunden warten
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
//Thread unterbrechen
th.interrupt();
}
}
2.) Da die Pause länger dauert als die Ausgabe,
ist es wahrscheinlich, dass der Interrupt
genau während dieser Pause eintritt.
1.) Thread wird nach 2 Sekunden unterbrochen.
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
34
Threads synchronisieren
Wenn man sich mit Nebenläufigkeit beschäftigt, muß man
sich in aller Regel auch mit Fragen der Synchronisation
nebenläufiger Prozesse beschäftigen.
In Java erfolgt die Kommunikation zweier Threads auf der
Basis gemeinsamer Variablen, die von beiden Threads
erreicht werden können.
Führen beide Prozesse Änderungen auf den gemeinsamen
Daten durch, so müssen sie synchronisiert werden, denn
andernfalls können undefinierte Ergebnisse entstehen.
Friedrich-Alexander-Universität Erlangen-Nürnberg
35
Threads synchronisieren
Zur Synchronisation nebenläufiger Prozesse hat Java das
Konzept des Monitors implementiert.
Ein Monitor ist die Kapselung eines kritischen Bereichs
(also eines Programmteils, der nur von jeweils einem
Prozeß zur Zeit durchlaufen werden darf) mit Hilfe einer
automatisch verwalteten Sperre.
Das Monitor-Konzept wird mit Hilfe des in die Sprache
integrierten Schlüsselworts synchronized realisiert.
Friedrich-Alexander-Universität Erlangen-Nürnberg
36
Threads synchronisieren
public class Listing
extends Thread
{
static int cnt = 0;
public static void main(String[] args)
{
Thread t1 = new Listing();
Thread t2 = new Listing();
t1.start();
t2.start();
}
public void run()
{
while (true) {
cnt = myPrint(cnt);
}
}
Nur ein Thread hat jetzt Zugriff auf diese Methode.
public synchronized int myPrint(int n) {
// hier steht zeitaufwendiger Code
//
n++;
System.out.println(n);
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
37
Threads synchronisieren
Neben dem Monitorkonzept stehen mit den Methoden wait
und notify der Klasse Object noch weitere
Synchronisationsprimitive zur Verfügung.
Zusätzlich zu der bereits erwähnten Sperre, die einem
Objekt zugeordnet ist, besitzt ein Objekt nämlich auch
noch eine Warteliste.
Sowohl wait als auch notify dürfen nur aufgerufen werden,
wenn das Objekt bereits gesperrt ist
Friedrich-Alexander-Universität Erlangen-Nürnberg
38
Threads synchronisieren
Friedrich-Alexander-Universität Erlangen-Nürnberg
39
Herunterladen