390 likes | 579 Views
Informatik II Grundlagen der Programmierung Programmieren in C Add Ons. Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ. Anwendung Smartmeter 1. Entwicklung eines Programms zum Auslesen des "intelligenten Stromzählers"
E N D
Informatik IIGrundlagen der ProgrammierungProgrammieren in CAdd Ons Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ
Anwendung Smartmeter 1 • Entwicklung eines Programms zum Auslesen des "intelligenten Stromzählers" • 3 Stromkreise sind zu messen • 1 Meßwert / Sekunde • 15 Minuten messen, dann Übertragung der Meßwerte an Versorger / Drittanbieter Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 2 • Datentypen für Messungen • wie sollen die Messungen abgebildet werden? • wie sollen die Messungen gespeichert werden? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 3 • Wie sieht die Messfunktion aus? Simulation! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 4 • Wie sieht die Sendefunktion aus?Simulation! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 5 • Wie sieht die main-Funktion aus?Simulation! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 6 • smartmeter1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 7 • smartmeter mit Grafikausgabe (SVG) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anwendung Smartmeter 8 • smartmeter2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 1 • Signal Systemnachricht an einen Prozess • vergleichbar mit einem Interrupt • ausgelöst z.B. vom Nutzer ... • Abbruch (Ctrl-C, SIGINT) • Programmstop (SIGKILL) • ... oder vom System • Timer (SIGALRM) • Programmende (SIGTERM) • #include <signal.h> Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 2 • einige Signale: • SIGINT – Unterbrechung (meist Ctrl-C) • SIGHUP – Programmende • SIGKILL – Programm beenden • SIGALRM – Timer abgelaufen • Signale können abgefangen werden:void handler(int sig) { ...}...signal(SIGALRM, handler); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 3 • signal.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 4 • Timerfunktionen • alarm(int nsec) • löst nach nsec Sekunden ein Signal SIGALRM aus:void alrmhandler() { printf("SIGALRM!\n");}...signal(SIGALRM, alrmhandler);alarm(5);... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 5 • alarm.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 6 • Feinere Auflösung mit Intervall-Timer • #include <sys/time.h> • Datentypenstruct timeval { time_t tv_sec; /* Sekunden */ suseconds_t tv_usec; /* Microsek. */};struct itimerval { struct timeval it_interval; struct timeval it_value;}; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 7 • Funktionensetitimer(int w, struct itimerval *v, struct itimerval *ov)getitimer(int w, struct itimerval *v) • Werte für wITIMER_REAL Systemuhr/-zeitITIMER_VIRTUAL Prozesszeit • Beispiel:struct itimerval it;it.it_value.tv_sec = 2; /* 2 Sek. */it.it_value.tv_usec = 0; /* Start */it.it_interval.tv_sec = 0; /* 0,5 Sek */ it.it_interval.tv_usec = 500000; /* Interv. */setitimer(ITIMER_REAL, &it, NULL); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 8 • smartmeter3.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Signale 9 • smartmeter4.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Bitfelder 1 • Bitfelder Elemente vom struct-Typ • Einzelelemente: int oder unsigned int • gedacht für hardwarenahe Programmierung • Problem: compilerabhängig nicht portabel! • Beispiel:typedef struct _iodev { /* Bitfeld */ unsigned int rflag:1; /* 1 Bit: Writeflag */ unsigned int wflag:1; /* 1 Bit: Readflag */ unsigned int d1:2; /* Dummy */ unsigned int type:2; /* 2 Bit: Geraetetyp */ unsigned int d2:2; /* Dummy */ unsigned int data:8; /* 8 Bit: Datenbyte */} iodev; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Bitfelder 2 • Speicherung eines Bitfelds Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Bitfelder 3 • bitfeld.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Unionen 1 • union: spezielle Art von struct • anderer Name: varianter Rekord • Speichern der Elemente in union nicht nacheinander, sondern übereinander • union-Elemente teilen sich Speicherplatz • sinnvoll bei gleichartigen Objekten, die aber verschiedenen Typs sein könnenunion { /* Union: */ char c; /* char */ short s; /* short */ int i; /* int */} u; /* teilen sich Platz */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Unionen 2 • Speicherung von struct und union Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Unionen 3 • union.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Unionen 4 • union oft Element in einem struct • Typ des Elements in union muss definiert sein eigenes Typelement im struct • Beispielstruct number { /* Struct Zahl */ byte typ; /* Typ union-Element */ union { /* Union: */ byte b; /* byte */ short s; /* short */ int i; /* int */ } u; }; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Unionen 5 • Zugriff auf union:struct number n;...switch(n.typ) { case BYTE: dobyte(n.u.b); break; case SHORT: doshort(n.u.s); break; case INT: doint(n.u.i); break;} Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Unionen 6 • Beispiel: mydraw4.c#define LINE 0x01 /* Typ Linie */#define RECT 0x02 /* Typ Rechteck */ #define CIRCLE 0x04 /* Typ Kreis */ ...typedef struct _obj { /* Objekt allgemein */ int n; /* Objektnummer */ int f; /* Loeschflag */ int t; /* Typ des Objekts */ union { line l; /* Linie */ rect r; /* Rechteck */ circle c; /* Kreis */ } o;} object; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Unionen 7 • mydraw4.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Syntaxfehler 1 • C hat kein sinnvolles error recovery • eine sehr schlechte Fehlerbehandlung beim Übersetzen nach Auftreten von Syntaxfehlern • der C-Compiler setzt nach einem Fehler nicht neu auf und tut so, als ob es keinen Fehler gegeben hat, sondern produziert eine Anzahl, manchmal eine wahre Fülle von Folgefehlern • tatsächliche Fehler oft schwer zu finden • Fehlererkennung und –korrektur mühsam Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Syntaxfehler 2 • treten nur ein oder ganz wenige Fehler auf Fehlersuche in oder vor der Zeile, die in der Fehlermeldung angegeben ist • treten viele und oft unsinnig erscheinende Fehler auf Fehlersuche im Umfeld vor der Zeile, die in der Fehlermeldung angegeben ist dann erneut kompilieren • ... oder viel Glück!! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 1 • oft ist es mühsam, Syntaxfehler zu finden • noch mühsamer Laufzeitfehler finden • intuitives Herangehen: zusätzliche Ausgaben in den Programmtext einstreuen • ggfs. mit CPP-Direktiven#ifdef DEBUGprintf("copy: %p %p\n", s1, s2);#endif • übersetzen dann mitgcc –DDEBUG file.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 2 • debug1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 3 • debug2.c - debug1.c mit CPP-Direktiven Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 4 • das Verfahren ist mühsam und zeitaufwendig • Alternative Debugger nutzen • Debugger: Werkzeug, unter dessen Kontrolle ein Programm gestartet und während des Programmslaufs untersucht werden kann • für gcc (und dev-cpp) GNU-Debugger gdb • Kode muss für Debugging instrumentiert werden: gcc –g file.c –o file • dann Debugger aufrufen:gdb file Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 5 • gdb – interaktive Shell mit vielen schönen Features • innerhalb dev-cpp weitgehend durch die grafische Oberfläche angesteuert • wichtige Kommandos • help • help topic • run • wenn das Programm läuft, alles ok! • bei Fehlern ??? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 6 • Wichtige Mechanismen • Breakpoints – Unterbrechung an definierten Stellen (z.B. Zeilennummer, Funktion) • break file.c:12 • break func • Watchpoints – Unterbrechung bei Änderung des Werts einer Variablen • watch varname • Anzeigen von Variablenwerten • print varname Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 7 • Breakpoint setzen und starten • break func • run • Unterbrechung bei Breakpoint • print varname • continue • schrittweises Vorgehen • step • Debugger beenden • quit Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Laufzeitfehler 8 • debug3.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Profilanalyse • oft notwendig: Laufzeitverhalten von Programmen zu überprüfen • wo wird die Laufzeit verbraucht? • wo ist Optimierung notwendig / möglich? • Profilanalyse des Programms • Instrumentierung mit -pg bei Neucompilieren gcc -pg prog.c -o prog • Starten des Programms gmon.outprog • Profilanalyse mit gprof, prog, gmon.outgprof prog Programmieren in C - Peter Klingebiel - HS Fulda - DVZ