Preview only show first 10 pages with watermark. For full document please download

überblick Verlässliche Echtzeitsysteme

   EMBED


Share

Transcript

Überblick Verlässliche Echtzeitsysteme Übungen zur Vorlesung 1 Abstrakte Interpretation mit Astrée 2 Aufgabenstellung 3 Softwareentwurf Florian Franzmann, Martin Hoffmann, Isabella Stilkerich Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme) http://www4.cs.fau.de 15. Mai 2013 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) 1 – 45 Astrée [1] Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) 2 – 45 Astrée weist nach Ziel: Nachweis der Abwesenheit von Laufzeitfehlern Überschreitung von Array-Grenzen findet alle potentiellen Laufzeitfehler Ganzzahldivision durch Null leider auch falsch-positive ; wegen Gödelschem Unvollständigkeitstheorem ungültige Dereferenzierung, arithmetische Überläufe Jedes hinreichend mächtige formale System ist entweder widersprüchlich oder unvollständig. ungültige Gleitkommaoperationen dass Code nicht erreichbar ist Programm ist korrekt, wenn Lesezugriff auf nicht initialisierte Variabeln Astrée keine Alarme meldet Verletzung benutzerdefinierter Zusicherungen ; assert() oder für alle Alarme nachgewiesen, dass falsch-positiv Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 3 – 45 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 4 – 45 Was Astrée nicht kann Einschränkungen Astrée nimmt an, dass als Einschränkungen gelten: Astrée kann nicht umgehen mit 1. der C99-Standard Rekursionen 2. implementierungsabhängiges Verhalten Größe von Datentypen Gleitkommastandard ... dynamischem Speicher ; kein malloc() 3. benutzerdefinierte Einschränkungen z. B. ob statische Variablen mit 0 initialisiert werden Aber das will man im Echtzeitbereich ja sowieso nicht haben , Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 4. außerdem benutzerspezifizierte Zusicherungen 5 – 45 Franzmann, Hoffmann, Stilkerich Benutzerdefinierte Zusicherungen 1 2 3 wird nicht weiter überprüft 6 – 45 # if 0 # include < astree .h > // Astree - Makros abschalten # endif 4 5 Analyzer warnt, falls B nie wahr 6 7 8 __ASTREE_assert((B)) 9 10 alterntiv auch assert() 11 Analyzer erzeugt Alarm, falls B nicht immer wahr 13 12 float filter ( Alpha_State *s , float val ) { __ASTREE_known_fact (( val == val )); __ASTREE_known_fact (( -10.0 f < val && val < 10.0 f )); __ASTREE_known_fact (( s - > val == s - > val )); __ASTREE_known_fact (( FLT_MIN < s - > val && s - > val < FLT_MAX )); __ASTREE_assert ((0 < s - > alpha )); __ASTREE_assert (( s - > alpha < 1)); float residual = val - s - > val ; s -> val = s - > val + s - > alpha * residual ; 14 B kann nicht von der Form e1 ? e2 : e3 sein 15 16 __ASTREE_assert (( s - > val == s - > val )); // ... return s - > val ; 17 Analyzer nimmt danach an, dass B wahr ist 18 19 die doppelten Klammern sind wichtig! VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée Beispiel __ASTREE_known_fact((B)) Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 20 7 – 45 } Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 8 – 45 Variable auf „unbekannter Wert“ setzen volatile __ASTREE_volatile_input((V)) zeigt an, dass V sich jederzeit ändern kann __ASTREE_modify((V1, ..., Vn)) __ASTREE_volatile_input((Vp, r)) zeigt an, dass Variablen V1 bis Vn unbekannten Wert haben ; braucht man um Stubs zu bauen p ist Pfad in der Variablen, z. B. V.a[3-4].b ; Variable V, Arrayelemente a[3] und a[4], Struct-Element b [i] ; Element i [i-j] ; Elemente i bis j [] ; alle Elemente r schränkt Wertebereich ein [i, j] ; von i bis j Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 9 – 45 Analyse untersuchen Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 10 – 45 Astrée verwenden __ASTREE_analysis_log(()) Astrée im CIP: gibt Zustand der Analyse an dieser Stelle aus % /proj/i4ezs/tools/astree_c-13.04/bin/astreec Anmeldung mit Benutzername und Passwort __ASTREE_log_vars((V1, ..., Vn)) zeigt Zustand der Analyse in Bezug auf einzelne Variabeln an ; Passwort wird bei der ersten Anmeldung festgelegt gute merken , Dokumentation unter /proj/i4ezs/tools/astree_c-13.04/share/astree_c/help __ASTREE_print(("text")) gibt Text aus Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 11 – 45 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 12 – 45 Anmelden Host Port Username Passwort Projekt anlegen faui48d.informatik.uni-erlangen.de 36000 nach Belieben bei der ersten Anmeldung festlegen und gut merken Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 13 – 45 Präprozessoreinstellungen Quelldateien zum Projekt hinzufügen Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 14 – 45 Table of Contents Include-Pfade festlegen Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Abstrakte Interpretation mit Astrée 15 – 45 1 Abstrakte Interpretation mit Astrée 2 Aufgabenstellung 3 Softwareentwurf Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung 16 – 45 Aufgabenstellung Festkommaarithmetik – Q-Notation kaum ein Mikrocontroller hat eine Gleitkommaeinheit ; Festkommaarithmethik mit Ganzzahlen einfaches Filter implementieren Zahlenformat häufig in Q-Notation [8] angegeben Qm.n ; Festkommazahl mit Korrektheit der Implementierung nachweisen m Bit vor dem Komma n nach dem Komma und einem Vorzeichenbit Wertebereich: [−2m , 2m − 2−n ] Auflösung: 2−n ; Astrée zunächst mit Gleitkommaarithmetik ; float dann für einen 8 Bit-Mikrocontroller mit Festkommaarithmetik Implementierung als Integer ; welches Q-Format Verwendung findet, ist dem Anwendungsprogrammierer überlassen Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung 17 – 45 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung – Festkommaarithmetik Q-Notation – Beziehung zu Gleitkommazahlen Operationen – Addition/Subtraktion von Gleitkomma nach Qm.n Addition und Subtraktion wie bei Ganzzahlen 1. Multiplikation mit 2n 18 – 45 Addition 2. Runden auf die nächste Ganzzahl 1 2 3 int8_t a = ...; int8_t b = ...; int8_t result = a + b ; von Qm.n nach Gleitkomma Subtraktion 1. Umwandlung in Gleitkommazahl ; cast 1 2. Multiplikation mit 2−n 2 3 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung – Festkommaarithmetik 19 – 45 int8_t a = ...; int8_t b = ...; int8_t result = a - b ; Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung – Festkommaarithmetik 20 – 45 Operationen – Multiplikation/Division Größe von Datentypen bestimmen I braucht Zwischenergebnis von doppelter Bitbreite % cat test.c Multiplikation 1 2 3 4 5 6 # define K (1 int8_t a = int8_t b = int16_t temp = temp += int8_t result = << ( n - 1)) ...; ...; ( int16_t ) a * ( int16_t ) b; K; temp >> n ; 1 2 # include < stddef .h > 3 static size_t short_size static size_t ushort_size static size_t int_size static size_t uint_size static size_t long_size static size_t ulong_size static size_t longlong_size static size_t float_size static size_t double_size static size_t longdouble_size static size_t ptr_size static size_t fptr_size void main ( void ) {} 4 5 6 7 8 9 10 11 Division 1 2 3 4 5 int8_t int8_t int16_t a = b = temp = temp += int8_t result = Franzmann, Hoffmann, Stilkerich 12 ...; ...; ( int16_t ) a << n ; b / 2; temp / b ; VEZS (15. Mai 2013) Aufgabenstellung – Festkommaarithmetik 13 14 15 = = = = = = = = = = = = sizeof ( short ); sizeof ( unsigned short ); sizeof ( int ); sizeof ( unsigned int ); sizeof ( long ); sizeof ( unsigned long ); sizeof ( long long ); sizeof ( float ); sizeof ( double ); sizeof ( long double ); sizeof ( void *); sizeof ( void (*)( void )); % avr-gcc -O0 -S -c test.c 21 – 45 Größe von Datentypen bestimmen II Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung – Größe von Datentypen 22 – 45 VEZS (15. Mai 2013) Aufgabenstellung – Größe von Datentypen 24 – 45 ABI ABI festlegen % cat test.s ... 1 2 3 4 5 6 short_size : .word 2 ← short zwei Byte lang .subsection 2 .align 2 .type ushort_size , @object .size ushort_size ,4 ... Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung – Größe von Datentypen 23 – 45 Franzmann, Hoffmann, Stilkerich α-β-Filter [4] Beispiel α-β-Filterung 4 Regler α-β-Filter Sensor Eingang Ausgang 3 Aktor −→ 2 ω rad/s Rauschunterdrückungsfilter geeignet zur Schätzung von physikalischen Größen mit Ableitung 6= 0 z. B. Position eines Flugzeugs, Lagewinkel . . . im I4Copter 0 -1 liefern Sensoren häufiger Werte als diese später verarbeitet werden ; α-β-Filter für Ratenwandlung verwendet ; nutzt gewonnene Information vollständig Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) 1 Aufgabenstellung – α-β-Filter -2 0 25 – 45 Franzmann, Hoffmann, Stilkerich 1.5 2 2.5 3 VEZS (15. Mai 2013) Aufgabenstellung – α-β-Filter 26 – 45 Filterparameter wird für jeden Messwert ausgeführt T Abtastintervall ; in welchem Zeitabstand gemessen wird y [κ]: Eingabewert für Abtastschritt κ xˆ [κ]: Schätzung der Messgröße zum Abtastschritt κ σw2 Prozessvarianz ; wie lebhaft der gemessene Prozess ist T Abtastintervall, α, β Filterparameter ˆ˙ Initialisierung: z. B. xˆ [0] = x[0] =0 r [κ] = y [κ] − xˆ [κ − 1] ˆ˙ ˆ˙ − 1] + β · r [κ] x[κ] = x[κ T ˆ˙ xˆ [κ] = xˆ [κ − 1] + T · x[κ] + α · r [κ] ; Schätzfehler (1) ; Schätzwert (3) ; 1. Ableitung (2) sinnvolle Werte für α und β? Literatur beschreibt viele Verfahren ; hier beispielhaft nur eines [6, 5] VEZS (15. Mai 2013) 1 t/s−→ Filteralgorithmus Franzmann, Hoffmann, Stilkerich 0.5 Aufgabenstellung – α-β-Filter 27 – 45 σv2 Rauschvarianz ; wie verrauscht das Signal ist σw T 2 σv √ 4 + λ − 8λ + λ2 θ= 4 α = 1 − θ2 √ β = 2 (2 − α) − 4 1 − α λ= Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) ; Tracking Index (4) ; Dämpfungsparameter (5) ; Gewicht für Ableitung (7) ; Gewicht für Wert Aufgabenstellung – α-β-Filter (6) 28 – 45 Sinnvolle Wertebereiche Korrektheitsbedingung Filter ist nur dann korrekt, wenn es auch stabil ist ; für wertbegrenzte Eingabe erfolgt wertbegrenzte Ausgabe [7] ; für Eingabe 0 geht der Filterausgang asymptotisch gegen 0 Erfahrungen mit dem I4Copter haben gezeigt, dass sich die Parameter in folgenden Bereichen bewegen: Abtastintervall T ∈ (0 . . . 1] Prozessvarianz σw2 ∈[0.5 . . . 2.0]  Rauschvarianz σv2 ∈ 10−3 . . . 10−1 Wert y [κ] ∈ [−10 . . . 10] α-β-Filter stabil, wenn gilt 0<α≤1 (8) 0<β≤2 (9) 0 < 4 − 2α − β (10) Außerdem: laut [2] Rauschunterdrückung nur dann, wenn ; Korrektheit mindestens für diese Wertebereiche zeigen! 0<β<1 (11) andernfalls wird das Rauschen verstärkt! Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung – α-β-Filter 29 – 45 Literatur I Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Aufgabenstellung – α-β-Filter 30 – 45 Literatur II [1] AbsInt Angewandte Informatik GmbH. The Static Analyzer Astrée, April 2012. [2] C. Frank Asquith. Weight selection in first-order linear filters. Technical report, Army Intertial Guidance and Control Laboratory Center, Redstone Arsenal, Alabama, 1969. [6] Paul R. Kalata. The tracking index: A generalized parameter for α-β and α-β-γ target trackers. IEEE Transactions on Aerospace and Electronic Systems, AES-20(2):174–181, mar 1984. [3] Grady Booch. Software Engineering with Ada. The Benjamin/Cummings Publishing Company, Inc., 2nd edition, 1987. [7] Richard G. Lyons. Understanding Digital Signal Processing. Prentice Hall, 3rd edition, 11 2010. [4] Eli Brookner. Tracking and Kalman Filtering Made Easy. Wiley-Interscience, 1st edition, 4 1998. [8] Erick L. Oberstar. Fixed-point representation & fractional math. Technical report, Oberstar Consulting, August 2007. [5] E. Gray, J. and W. Murray. A derivation of an analytic expression for the tracking index for the alpha-beta-gamma filter. IEEE Trans. on Aerospace and Electronic Systems, 29:1064–1065, 1993. Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Literatur 31 – 45 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Literatur 32 – 45 Table of Contents 1 Ziele des Softwareentwurfs Modifizierbarkeit: lokale Veränderbarkeit ; Änderungen an Anforderungen umsetzbar ; Fehler korrigierbar Abstrakte Interpretation mit Astrée Effizienz: optimaler Betriebsmittelbedarf wird häufig zu früh berücksichtigt 2 Aufgabenstellung 3 Softwareentwurf Verlässlichkeit: über lange Zeit Funktionsfähigkeit ohne menschlichen Eingriff gutmütiges Ausfallverhalten muss von Anfang an eingeplant sein! Verständlichkeit: Isolierung von Daten Algorithmen Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 33 – 45 Prinzipien des Softwareentwurfs Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 34 – 45 Fragestellung Abstraktion: wichtige Details hervorheben Wie komme ich von der Beschreibung zur Software? Kapselung: unnötige Details verbergen Objektorientierter/Objektbasierter Entwurf [3] Einheitlichkeit: konsistente Notation 1. identifiziere Objekte und deren Attribute 2. identifiziere Operationen jedes Objekts Vollständigkeit: alle wichtigen Aspekte berücksichtigt 3. lege Sichtbarkeit fest Testbarkeit: muss von Anfang an eingeplant werden 4. lege Objektschnittstellen fest 5. implementiere Objekte C macht es einem hier nicht leicht ; disziplinierte Herangehensweise notwendig! Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 35 – 45 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 36 – 45 Beispielbeschreibung – α-Filter 1. Objekte und Attribute identifizieren Herangehensweise: x[κ] Schätzung, α Filterparameter, y [κ] Messwert Initialisierung: xˆ [0] = 0 Hauptwortextraktion aus Anforderungsdokument für kleinere Probleme: Intuition Filterschritt: r [κ] = y [κ] − xˆ [κ − 1] xˆ [κ] = xˆ [κ − 1] + α · r [κ] Was ist das Objekt? ; Filter (12) Attribute? Welche Information brauche ich für jeden Filterschritt? (13) Schätzung aus der Vorrunde xˆ [κ − 1] Filterparameter α aktuellen Messwert y [κ] ; kein Zustand, kommt von aussen Optimale Parameter (σw2 Prozessvarianz, T Abtastintervall, σv2 Rauschvarianz): λ = σw · T 2 /σv   p α = −λ2 + λ4 + 16λ2 /8 Vorläufige Objektschablone (14) 1 (15) 2 3 4 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 37 – 45 typedef struct _Alpha_Filter { AF_Value_t x ; AF_Value_t alpha ; } Alpha_Filter ; Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 2. Operationen identifizieren 3. Sichtbarkeit festlegen Herangehensweise: in modernen Programmiersprachen private, public, . . . Verbenextraktion für kleinere Probleme: Intuition 38 – 45 in C nur eingeschränkt möglich modulintern vs. modulextern Leben eines Objekts: 1. Initialisierung ; Betriebsmittel anfordern 2. Verwendung 3. Beseitigung ; Betriebsmittel freigeben Leitfaden: möglichst wenig sichtbar machen Was soll bei unserem Filter öffentlich sein? Initialisierung Filterschritt Schätzung abfragen Was möchten Benutzer mit dem Filter machen? Filter initialisieren Filterschritt ausführen Schätzwert erfragen Betriebsmittelfreigabe nicht notwendig Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf alle anderen Operationen modulintern ; Hilfsfunktionen static 39 – 45 Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 40 – 45 4. Schnittstelle festlegen 5. Implementierung – Header alpha_filter.h 1 zwischen Modul und Außenwelt 2 # ifndef ALPHA_FILTER_H_INCLUDED # define ALPHA_FILTER_H_INCLUDED 3 statische Semantik 4 5 6 Schnittstelle 1 2 3 4 7 void afilter_init ( Alpha_Filter * filter , AF_Value_t process_variance , AF_Value_t noise_variance , AF_Value_t sampling_interval ); 8 9 10 11 5 6 7 8 9 12 void afilter_step ( Alpha_Filter * filter , AF_Value_t measurement ); 13 15 16 17 18 19 VEZS (15. Mai 2013) Softwareentwurf 3 4 5 6 7 8 9 10 Softwareentwurf r [κ] = y [κ] − xˆ [κ − 1] xˆ [κ] = xˆ [κ − 1] + α · r [κ] (17) 42 – 45 (19) (20) (18) alpha_filter.c 1 void afilter_init ( Alpha_Filter * filter , AF_Value_t process_variance , AF_Value_t noise_variance , AF_Value_t sampling_interval ) { filter - > x = 0; AF_Value_t l = sqrt ( process_variance ) * sampling_interval * sampling_interval / sqrt ( noise_variance ); filter - > alpha = ( - l * l + sqrtf ( l * l * l * l + 16.0 f * l * l )) / 8.0 f; } Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) 5. Implementierung – Filterschritt alpha_filter.c 2 AF_Value_t afilter_get_estimate ( Alpha_Filter * filter ); # endif // ALPHA_FILTER_H_INCLUDED (16) λ = σw · T 2 /σv   p α = −λ2 + λ4 + 16λ2 /8 1 void afilter_step ( Alpha_Filter * filter , AF_Value_t measurement ); Franzmann, Hoffmann, Stilkerich 41 – 45 5. Implementierung – Initialisierung xˆ [0] = 0 void afilter_init ( Alpha_Filter * filter , AF_Value_t process_variance , AF_Value_t noise_variance , AF_Value_t sampling_interval ); 14 AF_Value_t afilter_get_estimate ( Alpha_Filter * filter ); Franzmann, Hoffmann, Stilkerich typedef float AF_Value_t ; typedef struct _Alpha_Filter { AF_Value_t x ; AF_Value_t alpha ; } Alpha_Filter ; VEZS (15. Mai 2013) Softwareentwurf 2 3 4 5 void afilter_step ( Alpha_Filter * filter , AF_Value_t measurement ) { AF_Value_t r = measurement - filter - > x ; filter - > x = filter - > x + filter - > alpha * r ; } 6 7 8 9 10 43 – 45 AF_Value_t afilter_get_estimate ( Alpha_Filter * filter ) { return filter - > x ; } Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Softwareentwurf 44 – 45 Fragen? Franzmann, Hoffmann, Stilkerich VEZS (15. Mai 2013) Fragen? 45 – 45