Einführung in Eingebettete Systeme Vorlesung 3 Bernd Finkbeiner 05/11/2014 finkbeiner@cs.uni-saarland.de Prof. Bernd Finkbeiner, Ph.D. finkbeiner@cs.uni-saarland.de 1
Programmierung 2
manuell/ Codegenerator Modell C Programm #include <stdio.h> int main(void) { char a = 3, b = 4, c; while(1) { a++, b++; c = a + b; Compiler } } printf( "%d ", c ); Assembler Programm Linker Binärcode 0000012a <main>: 12a: cf 93 push r28 12c: df 93 push r29 12e: 00 d0 rcall.+0 ; 0x130 <main+0x6> 130: cd b7 in r28, ; 61, SP low 0x3d 132: de b7 in r29, 0x3e ; 62, SP high (r28/r29 == Y) 134: 83 e0 ldi r24, 0x03 ; 3 (Wert für a) 136: 89 83 std Y+1, r24 ; Variable a, auf Stack 138: 84 e0 ldi r24, 0x04 ; 4 (Wert für b) 13a: 8a 83 std Y+2, r24 ; Variable b, auf Stack 13c: 99 81 ldd r25, Y+1 ; a 13e: 8a 81 ldd r24, Y+2 ; b 140: 89 0f add r24, r25 ; a + b 142: 8b 83 std Y+3, r24 ; Ergebnis in c, auf Stack 144: 8b 81 ldd r24, Y+3 ; c 146: 28 2f mov r18, r24 ; c in r18 148: 30 e0 ldi r19, 0x00 ; 0 in r19 14a: 00 d0 rcall.+0 ; 0x14c <main+0x22> 14c: 0f 92 push r0 14e: 8d b7 in r24, ; 61, SP low 0x3d 150: 9e b7 in r25, 0x3e ; 62, SP high 152: 01 96 adiw r24, 0x01 ; SP-Kopie + 1 154: 40 e0 ldi r20, 0x00 ; 0 156: 52 e0 ldi r21, 0x02 ; 2 158: fc 01 movw r30, r24 ; r24/25 in r30/31 (Z) 15a: 51 83 std Z+1, r21 ; Parameter auf Stack 15c: 40 83 st Z, r20 ; 15e: fc 01 movw r30, r24 ; 160: 33 83 std Z+3, r19 ; Kopie von c auf Stack 162: 22 83 std Z+2, r18 ; 164: 0e 94 b9 00 call 0x172 ; <printf> aufrufen 168: 0f 90 pop r0 ; Stack bereinigen 16a: 0f 90 pop r0 16c: 0f 90 pop r0 16e: 0f 90 pop r0 170: e5 cf rjmp.-54 ; 0x13c <main+0x12> :100100000BBF02C007900D92A430B107D9F712E0DF :10011000A4E0B2E001C01D92AA30B107E1F70E944D :1001200095000C9472030C940000CF93DF9300D0E1 :10013000CDB7DEB783E0898384E08A8399818A81A1 :10014000890F8B838B81282F30E000D00F928DB7E1 :100150009EB7019640E052E0FC0151834083FC01D0 :10016000338322830E94B9000F900F900F900F905D :10017000E5CFCF93DF93CDB7DEB7FE013696619121 :1001800071918091060290910702AF010E94CB000D :10019000DF91CF9108952F923F924F925F926F928D :1001A0007F928F929F92AF92BF92CF92DF92EF9207 :1001B000FF920F931F93CF93DF93CDB7DEB72D97A9 :1001C0000FB6F894DEBF0FBECDBF3C017D876C87B4 :1001D0005A01FC0117821682838181FFC8C12E015A :1001E0000894411C511CF3019381EC85FD8593FD1E :1001F000859193FF8191FD87EC87882309F4B3C132 :10020000853241F493FD859193FF8191FD87EC87C1 :10021000853229F490E0B3010E94E802E4CFFF2484 :10022000EE2410E01032B0F48B3269F08C3228F4F6 :10023000803251F0833271F40BC08D3239F080334B :1002400049F411602CC01260146029C0186027C0E6 :10025000106125C017FD2EC0282F20532A3098F496 :1002600016FF08C08F2D880FF82EFF0CFF0CF80E1C :10027000F20E15C08E2D880FE82EEE0CEE0CE80E57 :10028000E20E10620CC08E3221F416FD6CC11064B7 :1002900006C08C3611F4106802C0883659F4EC851B :1002A000FD8593FD859193FF8191FD87EC878823E0 :1002B00009F0B8CF982F9554933018F0905293309E 3
Arduino Programme! C Programme (mit Bibliotheken)! Arduino nennt Programme Sketches! Programmstruktur:! Header Deklarationen, Einbinden von Bibliotheken, etc.! setup() wird einmal ausgeführt bei Programmstart! loop() wird immer wieder ausgeführt sobald das Ende erreicht wurde 4
Implementierung eines Mealy-Automaten 1/P k0 0/P 0 1 k0 k1 / P f1 / P f1 k1 k1 f2 / P k2 / P 0/P, 1/P 0/P 1/P k2 k3 / P f3 / P 0/P, 1/P f2 1/P k2 0/P 1/Ö k3 k0 / S k0 / Ö f1 f2 / P f2 / P 0/S 0/S,1/S f3 k3 f2 f3 / P f3 / P f3 k0 / S k0 / S 5
Schritt 1: Repräsentation von Zuständen und Eingabesymbolen! Zustände und Symbole können aufgezählt werden, wir können sie deshalb durch ganze Zahlen (integers) darstellen: #define STATE_k0 0 #define STATE_k1 1 #define STATE_k2 2... #define STATE_f3 6 int current_state; #define INPUT_0 0 #define INPUT_1 1 int current_input; 0 1 k0 k1 / P f1 / P k1 f2 / P k2 / P k2 k3 / P f3 / P k3 k0 / S k0 / Ö f1 f2 / P f2 / P f2 f3 / P f3 / P f3 k0 / S k0 / S 6
Schritt 2: Funktionen für Ausgaben! Ausgaben entsprechen bestimmten Aktionen (z.b. an einer Schnittstelle). Wir implementieren diese Aktionen als Funktionen. void action_p() { digitalwrite(led, HIGH); delay(1000); digitalwrite(led, LOW); delay(1000); } void action_s() {...} void action_oe() {...} 0 1 k0 k1 / P f1 / P k1 f2 / P k2 / P k2 k3 / P f3 / P k3 k0 / S k0 / Ö f1 f2 / P f2 / P f2 f3 / P f3 / P f3 k0 / S k0 / S 7
Schritt 3: Initialzustand! Der Initialzustand wird in setup() gesetzt. 1/P k0 0/P void setup() { current_state = STATE_k0; } 0/P, 1/P f1 0/P k1 1/P 0/P, 1/P f2 1/P k2 0/P 1/Ö 0/S 0/S,1/S f3 k3 8
Schritt 4: Transitionen! Für jede Eingabe wird, in Abhängigkeit vom Zustand, die entsprechende Ausgabeaktion durchgeführt und der neue Zustand gesetzt. void loop() { current_input = get_new_input(); switch(current_state) { case STATE_k0 : if (current_input==input_0) { action_p(); current_state = STATE_k1; } else if (current_input==input_1) { action_p(); current_state = STATE_f1; } case STATE_k1 :...... } } 0 1 k0 k1 / P f1 / P k1 f2 / P k2 / P k2 k3 / P f3 / P k3 k0 / S k0 / Ö f1 f2 / P f2 / P f2 f3 / P f3 / P f3 k0 / S k0 / S 9
4. StateCharts Ziele:! Erstellen von kompakten, lesbaren Modellen für diskrete Steuerungen mit Hilfe von Hierarchie und Variablen! Bewusstsein für semantische Schwierigkeiten (insbesondere Superstep Semantik)
StateCharts Automaten mit zusätzlichen Konstrukten! Hierarchie! Variablen mit komplexen Datentypen! Timer Achtung: Bedeutung (Semantik) von StateCharts nicht einheitlich (mehr dazu später).! Referenzsemantik: Statemate! StateFlow Semantik! UML!... 11
Beispiel: Anrufbeantworter 12
Hierarchie Wenn Zustand S aktiv ist, dann ist auch einer der Unterzustände aktiv (A oder B oder..) Superzustand (superstate) Unterzustände (substates) 13
Zustände! Zustände, die nicht aus weiteren Zuständen bestehen, heissen Basiszustände.! Zustände die aus weiteren Zuständen bestehen heissen Superzustände.! Die Superzustände eines Zustands sind seine Ahnen.! Superzustände können OR-Superzustände oder AND- Superzustände sein. Wann immer ein OR-Superzustand aktiv ist, ist auch genau einer seiner Unterzustände aktiv. Ahne von E 14
Hierarchie Statechart SC! Die Hierarchie kann durch einen Baum repräsentiert werden, in dem die Basiszustände als Blätter auftreten. S SC Z Transitionen sind zwischen allen Hierarchie-Ebenen möglich A B C D E Wenn ein Basiszustand aktiv ist, dann sind alle seine Ahnen aktiv. 15
Transitionen zu Superstates! Durch die Transition von Z nach S wird der Superzustand S aktiv.! Zusätzlich muss ein Basiszustand aktiv werden. Default State Mechanismus History Mechanismus 16
Beispiel: Digitalcamera [http://www.boost.org/doc/libs/1_41_0/libs/statechart/doc/tutorial.htm] 17
Default Konnektoren! Der gefüllte Kreis heißt default Konnektor und kennzeichnet den default state, der aktiv wird, wenn der Superzustand aktiv wird.! Der Konnektor ist selbst kein Zustand.! Die interne Struktur von S wird gegenüber der Außenwelt verborgen. 18
History Konnektoren! Durch die Transition von Z nach S wird der Zustand aktiv, der aktiv war als S zuletzt verlassen wurde.! Falls S zum ersten Mal besucht wird, wird der default state aktiv. 19
History und Default Konnektoren! Die History und Default State Konnektoren können in verschiedenen Hierarchieebenen unterschiedlich eingesetzt werden. 20
History und Deep History Default states Active states DC S CO ID OP SL FA H History connectors speichern Zustände die auf der gleichen Hierarchiestufe wie der History Konnektor angesiedelt sind. 21
History und Deep History Default states Active states DC S ID CO SL speichert OP OP FA H Welcher Zustand wird aktiv nach SENSOR_DISCONNECTED, SENSOR_CONNECTED? 22
History und Deep History * S Default states Active states DC ID CO OP H* Deep History Konnektor H* speichert den aktuellen Basiszustand SL FA 23
History und Deep History * Default states Active states DC S ID CO SL OP speichert OP, FA Welcher Zustand wird aktiv H* nach SENSOR_DISCONNECTED, SENSOR_CONNECTED? FA 24
AND Superzustände! Alle (direkten) Unterzustände eines aktiven AND- Superzustands sind aktiv! Beispiel: 25
AND-Superzustände! Beispiel für aktive Zustände: answ. Default states off on AND-super-state Active states l-m. k-m. L.w. L.p. K.w. K.p.! AND-Zustände können in normalen Automaten nur durch Produktzustände nachgebildet werden Strukturelle Information geht verloren Produktautomat ist viel größer 26
Eintritt und Austritt aus AND-Superzuständen incl.! Sowohl Line-monitoring als auch key-monitoring werden durch key-on and key-off betreten bzw. verlassen. 27
Variablen mit komplexen Datentypen Problem der klassischen Automaten:! Sowohl Kontrolle als auch Daten werden durch explizite Zustände dargestellt. Hier:! Getypte Variablen (z.b. integers, reals, strings, records) speichern Daten! Der Zustand setzt sich zusammen aus den explizit dargestellten Kontrollzuständen und den Variablenbelegungen! Terminologie: graphisch dargestellter Kontrollzustand = Zustand graphisch dargestellter Kontrollzustand + Variablenbelegung = Status 28
Beispiel: Alarmuhr P1 = alarm1_enabled (alarm2_disabled T1 T2) P2 = alarm2_enabled (alarm1_disabled T1 T2) P = alarm1_enabled alarm2_enabled T1=T2 [Harel: StateCharts: A visual formalism for complex systems. Science of Computer Programming, 1987] 29
Allgemeine Form der Kantenmarkierungen Ereignis [Bedingung] / Aktion Bedeutung:! Transition kann genommen werden, wenn Ereignis stattgefunden hat und Bedingung wahr ist.! Wenn Transition genommen wird, dann wird die Aktion ausgeführt. Bedingung:! Bedingung bezieht sich auf die Variablen Aktion:! Zuweisung und Generierung von Ereignis Beispiel:! a & [x = 1023] / overflow; x:=0 30
Timer! Timer können direkt in StateCharts modelliert werden.! Spezielle Kanten beschreiben Timeouts. Falls Ereignis a nicht innerhalb von 20 ms eintritt während das System im linken Zustand ist, dann tritt das Timeout-Ereignis ein. 31
Beispiel 32
Aufgabe! Modellieren Sie einen Aufzug für ein Haus mit zwei Stockwerken (EG und OG).! Vorschlag: Benutzen Sie einen AND-Superzuständen mit drei OR-Superzuständen, jeweils einen für die Anforderungstaster in den beiden Stockwerken, und einen für die Steuerung der Kabine 33
34