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