Friedrich-Alexander-Universität Erlangen-Nürnberg 1
SEMINARSEMINAR
VernetzungVernetzung und und InteraktionInteraktionverteilterverteilter eingebettetereingebetteter
SystemeSysteme
Mateusz Majer ([email protected])
Hardware-Software-Co-Design
Friedrich-Alexander-Universität Erlangen-Nürnberg 2
Vernetzte eingebettete SystemeBeispiele für vernetzte eingebettete Systeme:
Automotiv-ElektronikComputer-NetzwerkeBluetooth-Headset und Handy…
Abhängig von der Anwendung müssen gemeinsame Kommunikationsmechanismen gefunden werden.
Friedrich-Alexander-Universität Erlangen-Nürnberg 3
Aspekte der VernetzungAd-Hoc-Netzwerke
Wie registrieren Netzwerkknoten, ob sich andere Kommunikationspartner in der Nähe befinden?Wie werden Kommunikationsknoten in ein Netz integriert?
Uhrensynchronisation:Wie erhalten alle Knoten eine gemeinsame Zeitbasis?
Datenübertragung:Wie werden Fehler bei der Datenübertragung erkannt und korrigiert?
Knoten 1 Knoten 2 Knoten 3 Knoten 1 Knoten 2 Knoten 3
Zyklus n Zyklus n+1
ZeitneuerKnoten
Umsetzung am Beispiel: Lego-Mindstorms
Friedrich-Alexander-Universität Erlangen-Nürnberg 4
Mindstorms:
Ziel:Ein Mindstorm spielt eine einstimmige Midi-Musik-Datei ab.Gruppe von Mindstorms soll synchron eine mehrstimmige Melodie spielenImplementierung unter leJOS (Java für Lego)
Infrarot Senderund Empfänger
LCD-Display
Lautsprecher
Schnittstellenfür Sensoren
Schnittstellenfür Aktoren
Friedrich-Alexander-Universität Erlangen-Nürnberg 5
OrganisationDozenten:
Thilo StreichertMateusz Majer
Umfang/Stunden:S2 für Hardware-Software-Co-Design und BetriebsystemeScheinvergabe auf Ausarbeitung, Präsentation und regelmäßiger, aktiver Teilnahme.
Ort und Zeit des Seminars:1. Gruppe – Montags 14:30 – 16:002. Gruppe – Donnerstags 9:00 – 10:30
Friedrich-Alexander-Universität Erlangen-Nürnberg 6
Inhalt
EinführungMotivationGeschichtlicher HintergrundDas Mindstorm System
RCX HardwareSensoren Der Mikrocontroller
LejOS + VM
Java Threads
Friedrich-Alexander-Universität Erlangen-Nürnberg 7
LEGO MindstormsDie LEGO-Gruppe entwickelte 1998 in Zusammenarbeit mit dem MIT und der Firma SRI das LEGO-MindstormsSystem
Weltweitder beliebtesteRoboter-Baukasten
Friedrich-Alexander-Universität Erlangen-Nürnberg 9
Eine kurze GeschichteMIT 1996
programmable brícksErweiterungsset für LEGOIntelligentes Spielzeug für Kinderhttp://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 10
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 12
Das Mindstorm System
StandardbausteineTechnikelementeMikrokontrollerSensoren und Motoren
Infrarotstation für den PC
Friedrich-Alexander-Universität Erlangen-Nürnberg 13
Sensoren
Rotationssensor
Lichtsensor
Temperatursensor
Berührungssensor
Friedrich-Alexander-Universität Erlangen-Nürnberg 14
Das RCX ModulLCDTastenIR3 Motoren3 Sensoren6 AA Batterien
Friedrich-Alexander-Universität Erlangen-Nürnberg 15
RCX von Innen
RCX-Platine von obenInfrarotsender und –EmpfängerDisplayLautsprecher
RCX-Platine von untenH8/3292 MikrokontrollerSpeicherbausteinDisplay und Motorsteuerbausteine
Friedrich-Alexander-Universität Erlangen-Nürnberg 16
Der H8/3292 MikrokontrollerHitachi H8/300 CPU16 MHz, 5V
16 KB ROM
512 Byte RAM intern32 KB RAM extern
16 Bit Timer8 Bit Timer 2 Kanäle10 Bit A/D Wandler 8 Kanäle1 Serielle Schnittstelle
Friedrich-Alexander-Universität Erlangen-Nürnberg 17
Die Infrarotschnittstelle
38 kHz Trägersignal2400 bps Übertragungsrate
RahmenformatHeaderDatenbytes plus KomplementePrüfsumme plus Komplement
Header
Befehls-Code
Prüfsumme
55 FF 00 65 11 769A EE 89
Datenbyte
Komplement
Komplement
Friedrich-Alexander-Universität Erlangen-Nürnberg 18
Betriebssysteme
LEGO FirmwareBytecode InterpreterNQC (Not Quite C)
PbForthInteraktiver Interpreter
LegOSC/C++Esterel
LeJOSJava Virtual Machine
Friedrich-Alexander-Universität Erlangen-Nürnberg 19
Java für Lego Mindstorms RCX
leJOS, ein Java SystemWinziges Java Betriebssystem (~ 16Kb)Portierungen für Mindstorms RCX und UNIX (nur Emulation)
leJOS BestandteileVirtual Machine für Java BytecodeHilfssoftware für den DownloadEmulationsumgebung
Java Development Kit (JDK) von SUN ist Vorraussetzung
Friedrich-Alexander-Universität Erlangen-Nürnberg 20
leJOS
leJOS unterstütztObjektorientierungPreemtive ThreadsArraysRekursionSynchronisationExceptions
Die von leJOS angebotenen Klassenbibliotheken sind gut dokumentiert.
Friedrich-Alexander-Universität Erlangen-Nürnberg 21
leJOS
leJOS bietet auchEine Windows VersionFließkomma OperationenString Konstantenjava.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 22
Java kompilieren, linkenUm Java Dateien zu kompilieren wir das Kommando `javasc` statt `javac` verwendet
javasc ist kein Java KompilerSondern ein Skript welches die –bootclasspath Option setzt und den Java Kompiler aufruft
lejos ist ein LinkerLöst alle Klassenreferenzen aufErmöglicht das Packen mehrerer Programme in eine Datei
lejosc *.java
lejos MyMainClass
Friedrich-Alexander-Universität Erlangen-Nürnberg 23
und auf dem RCX startenFirmware herunterladen
Beim Start wird die Batteriespannung angezeigtMuss 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 24
Das Beispielimport josx.platform.rcx.*;
class Receiveextends 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 25
Das Beispielclass Sendextends 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 26
Das Beispielpublic 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 27
EmulationGelinkte 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 28
Einschränkungen
Keine garbage collectionswitch Anweisungen werden nicht unterstütztArithmetische Operationen unterstützen Variablen des Typs long nichtMaximale Array Größe von 511Es 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 29
Referenzen
http://lejos.sourceforge.nethttp://lejos.sourceforge.net/tutorial
Guido KrügerHandbuch der Java-Programmierung3. AuflageAddison-Wesley, 2002ISBN 3-8273-1949-8http://www.javabuch.de
Friedrich-Alexander-Universität Erlangen-Nürnberg 30
Multithreading in Java
Mit Nebenläufigkeit bezeichnet man die Fähigkeit einesSystems, zwei oder mehr Vorgänge gleichzeitig oderquasi-gleichzeitig ausführen zu können.
Java integriert Threads direkt in die Sprache.
Ein Thread ist ein eigenständiges Programmfragment, dasparallel 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 31
Multithreading in Java
Threads werden in Java durch die Klasse Thread und dasInterface 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ügunggestellt.
Zur Synchronisation stellt Java das Konzept des Monitorszur Verfügung, mit dem kritische Abschnitte innerhalbkorrekt geklammerter Programmfragmente und Methodengekapselt werden.
Friedrich-Alexander-Universität Erlangen-Nürnberg 32
Die Thread Klasse
class MyThreadextends Thread{
public void run(){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.
2.) Die Methode run() implementiert das Verhalten eines Threads. Oft eine endlos Schleife.
Friedrich-Alexander-Universität Erlangen-Nürnberg 33
Threads unterbrechen
Durch Aufruf von interrupt wird ein Flag gesetzt, das eineUnterbrechungsanforderung signalisiert.
Durch Aufruf von isInterrupted kann der Thread feststellen, ob das Abbruchflag gesetzt wurde und der Thread beendetwerden 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 34
Threads unterbrechenpublic class Listingextends Thread{
int cnt = 0;
public void run(){while (true) {if (isInterrupted()) {break;
}printLine(++cnt);
}}
private void printLine(int cnt){//Zeile ausgebenSystem.out.println(cnt);
//100 ms. wartentry {Thread.sleep(100);
} catch (InterruptedException e) {interrupt();
}}
public static void main(String[] args){Listing th = new Listing();{//Thread startenth.start();//2 Sekunden wartentry {Thread.sleep(2000);
} catch (InterruptedException e) {}//Thread unterbrechenth.interrupt();
}}
}
3.) Hier wird überprüft ob ein Interrupt vorliegt und gegebenenfalls der Programmthreadabgebrochen.
2.) Da die Pause länger dauert als die Ausgabe, ist es wahrscheinlich, dass der Interruptgenau während dieser Pause eintritt.
1.) Thread wird nach 2 Sekunden unterbrochen.
Friedrich-Alexander-Universität Erlangen-Nürnberg 35
Threads synchronisieren
Wenn man sich mit Nebenläufigkeit beschäftigt, muß man sich in aller Regel auch mit Fragen der Synchronisationnebenläufiger Prozesse beschäftigen.
In Java erfolgt die Kommunikation zweier Threads auf derBasis gemeinsamer Variablen, die von beiden Threads erreicht werden können.
Führen beide Prozesse Änderungen auf den gemeinsamenDaten durch, so müssen sie synchronisiert werden, dennandernfalls können undefinierte Ergebnisse entstehen.
Friedrich-Alexander-Universität Erlangen-Nürnberg 36
Threads synchronisieren
Zur Synchronisation nebenläufiger Prozesse hat Java dasKonzept des Monitors implementiert.
Ein Monitor ist die Kapselung eines kritischen Bereichs(also eines Programmteils, der nur von jeweils einemProzeß zur Zeit durchlaufen werden darf) mit Hilfe einerautomatisch verwalteten Sperre.
Das Monitor-Konzept wird mit Hilfe des in die Spracheintegrierten Schlüsselworts synchronized realisiert.
Friedrich-Alexander-Universität Erlangen-Nürnberg 37
Threads synchronisierenpublic class Listingextends 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);
}}
public synchronized int myPrint(int n) {
// hier steht zeitaufwendiger Code //n++;System.out.println(n);
}}
Nur ein Thread hat jetzt Zugriff auf diese Methode.
Friedrich-Alexander-Universität Erlangen-Nürnberg 38
Threads synchronisieren
Neben dem Monitorkonzept stehen mit den Methoden waitund notify der Klasse Object noch weitereSynchronisationsprimitive zur Verfügung.
Zusätzlich zu der bereits erwähnten Sperre, die einemObjekt zugeordnet ist, besitzt ein Objekt nämlich auchnoch eine Warteliste.
Sowohl wait als auch notify dürfen nur aufgerufen werden, wenn das Objekt bereits gesperrt ist