1 / 39

Informatik II Grundlagen der Programmierung Programmieren in C Add Ons

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"

azia
Télécharger la présentation

Informatik II Grundlagen der Programmierung Programmieren in C Add Ons

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. Anwendung Smartmeter 3 • Wie sieht die Messfunktion aus? Simulation! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  5. Anwendung Smartmeter 4 • Wie sieht die Sendefunktion aus?Simulation! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  6. Anwendung Smartmeter 5 • Wie sieht die main-Funktion aus?Simulation! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  7. Anwendung Smartmeter 6 • smartmeter1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  8. Anwendung Smartmeter 7 • smartmeter mit Grafikausgabe (SVG) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  9. Anwendung Smartmeter 8 • smartmeter2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  10. 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

  11. 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

  12. Signale 3 • signal.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  13. 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

  14. Signale 5 • alarm.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  15. 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

  16. 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

  17. Signale 8 • smartmeter3.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  18. Signale 9 • smartmeter4.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  19. 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

  20. Bitfelder 2 • Speicherung eines Bitfelds Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  21. Bitfelder 3 • bitfeld.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  22. 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

  23. Unionen 2 • Speicherung von struct und union Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  24. Unionen 3 • union.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  25. 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

  26. 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

  27. 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

  28. Unionen 7 • mydraw4.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  29. 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

  30. 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

  31. 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

  32. Laufzeitfehler 2 • debug1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  33. Laufzeitfehler 3 • debug2.c - debug1.c mit CPP-Direktiven Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  34. 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

  35. 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

  36. 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

  37. 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

  38. Laufzeitfehler 8 • debug3.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

  39. 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

More Related