(SPiC) £“bungen zu Systemnahe Programmierung in C £“bungen zu Systemnahe Programmierung in C (SPiC)

  • View
    3

  • Download
    0

Embed Size (px)

Text of (SPiC) £“bungen zu Systemnahe Programmierung in C £“bungen zu Systemnahe...

  • bungen zu Systemnahe Programmierung in C(SPiC)

    Sebastian Maier, Heiko Janker(Lehrstuhl Informatik 4)

    bung 3

    Wintersemester 2015/2016

    InhaltBeliebte Fehler

    Sichtbarkeit & LebensdauerVerwendung falscher DatentypenTypdefs & Enumsvolatile Verwendung

    ModuleSchnittstellenbeschreibungAblauf vom Quellcode zum laufenden ProgrammInitialisierung eines Moduls

    Ein- & Ausgabe ber PinsActive-high & Active-lowKonfiguration der Pins

    Aufgabe 3: 7-Segment ModulFunktionsweiseImplementierungTesten des Moduls

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 2 22

  • Inhalt

    Beliebte FehlerSichtbarkeit & LebensdauerVerwendung falscher DatentypenTypdefs & Enumsvolatile Verwendung

    Module

    Ein- & Ausgabe ber Pins

    Aufgabe 3: 7-Segment Modul

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 2 22

    bersicht: Sichtbarkeit & Lebensdauer

    Lokale Variable, nicht static = auto Variable automatisch allokiert & freigegebenFunktionen als static, wenn kein Export notwendig

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 3 22

  • Globale Variablen

    1 static uint8_t state; // global static2 uint8_t event_counter; // global34 void main(void) {5 ...6 }78 static void f(uint8_t a) {9 static uint8_t call_counter = 0; // local static10 uint8_t num_leds; // local (auto)11 ...12 }

    Sichtbarkeit/Gltigkeit mglichst weit einschrnkenGlobale Variable lokale Variable in f()Globale static Variablen: Sichtbarkeit auf Modul beschrnken static bei Funktionen und globalen Variablen verwenden, womglich

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 4 22

    Verwendung falscher Datentypen

    Die Gre von int ist nicht genau definiert (ATmega32: 16 bit) Gerade auf C fhrt dies zu Fehlern und/oder langsameren CodeFr die bung:

    Verwendung von int ist ein FehlerStattdessen: Verwendung der in der stdint.h definierten Typen:int8_t, uint8_t, int16_t, uint16_t, etc.

    Wertebereich:limits.h: INT8_MAX, INT8_MIN, ...

    Speicherplatz ist sehr teuer auf C Nur so viel Speicher verwenden, wie tatschlich bentigt wird!

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 5 22

  • Typdefs & Enums

    1 #define PD3 32 typedef enum { BUTTON0 = 4, BUTTON1 = 83 } BUTTON;4 #define MAX_COUNTER 9005 ...6 void main(void) {7 ...8 PORTB |= (1

  • Inhalt

    Beliebte Fehler

    ModuleSchnittstellenbeschreibungAblauf vom Quellcode zum laufenden ProgrammInitialisierung eines Moduls

    Ein- & Ausgabe ber Pins

    Aufgabe 3: 7-Segment Modul

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 7 22

    Schnittstellenbeschreibung

    Erstellen einer .h-Datei (Konvention: gleicher Name wie .c-Datei)1 #ifndef LED_H2 #define LED_H3 /* fixed-width Datentypen einbinden (im Header verwendet) */4 #include 5 /* LED-Typ */6 typedef enum { RED0=0, YELLOW0=1, GREEN0=2, ... } LED;7 /* Funktion zum Aktivieren einer bestimmten LED */8 uint8_t sb_led_on(LED led);9 ...10 #endif

    Mehrfachinkludierung (evtl. Zyklen!) vermeiden Include-Guarddurch Definition und Abfrage eines PrprozessormakrosKonvention: das Makro hat den Namen der .h-Datei, . ersetzt durch _Der Inhalt wird nur eingebunden, wenn das Makro noch nicht definiert ist

    Vorsicht: flacher Namensraum Wahl mglichst eindeutiger Namen

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 8 22

  • Ablauf vom Quellcode zum laufenden Programm

    7seg.h

    7seg.c

    test.c

    libspicboard

    gcc

    gcc 7seg.o

    test.o

    timer.h

    ld

    libspicboard.a

    7seg.o

    adc.o

    led.o

    adc.h button.o

    timer.o

    aufgabe4.elf

    1. Prprozessor2. Compiler3. Linker4. Programmer/Flasher

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 9 22

    Initialisierung eines Moduls

    Module mssen Initialisierung durchfhren (z.B. Portkonfiguration)z.B. in Java mit Klassenkonstruktoren mglichC kennt kein solches Konzept

    Workaround: Modul muss bei erstem Aufruf einer seiner Funktionenggf. die Initialisierung durchfhren

    muss sich merken, ob die Initialisierung schon erfolgt istMehrfachinitialisierung vermeiden

    1 static uint8_t initDone = 0;2 // alternativ: lokale static Variable in init()34 static void init(void) { ... }5 void mod_func(void) {6 if(initDone == 0) {7 initDone = 1;8 init();9 }10 ....

    Initialisierung darf nicht mit anderen Modulen in Konflikt stehen!

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 10 22

  • Inhalt

    Beliebte Fehler

    Module

    Ein- & Ausgabe ber PinsActive-high & Active-lowKonfiguration der Pins

    Aufgabe 3: 7-Segment Modul

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 10 22

    Ausgang: active-high & active-low

    Ausgang je nach Beschaltung:active-high: high-Pegel (logisch 1; Vcc am Pin) LED leuchtetactive-low: low-Pegel (logisch 0; GND am Pin) LED leuchtet

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 11 22

  • Eingang: active-high & active-low

    Eingang je nach Beschaltung:active-high: Button gedrckt high-Pegel (logisch 1; Vcc am Pin)active-low: Button gedrckt low-Pegel (logisch 0; GND am Pin)

    interner pull-up-Widerstand (im ATmega32) konfigurierbar

    Lehrstuhl Informatik 4 bungen zu SPiC (WS 2015/16) 12 22

    Konfiguration der Pins

    28155B

    AV

    R07/09

    ATm

    ega32A

    1.P

    in Configurations

    Figure 1-1.P

    inout ATm

    ega32A

    !"#$%&'())*

    +'

    !&,())*+,

    !-.&/%0

    -.'())*

    +/

    !1#'%0

    -.,())*

    +2

    !33())*

    +4

    !513-())*

    +6

    !5-31())*

    +7

    !3#$())*

    +8

    9:3:&

    ;##

    ,

    !9"=())*

    ='

    !&"=())*

    =,

    !-.&'())*

    =/

    !-.&,())*

    =2

    !1#,+())*

    =4

    !1#,0())*

    =6

    !-#*,())*

    =7

    *0'))!0

    =#'(

    *0,))!0

    =#,(

    *0/))!0

    =#/(

    *02))!0

    =#2(

    *04))!0

    =#4(

    *06))!0

    =#6(

    *07))!0

    =#7(

    *08))!0

    =#8(

    09:?

    /

    "&0>,

    !9"=())*

    ='

    !&"=())*

    =,

    !-.&'())*

    =/

    !-.&,())*=2!1#,+())*=4!1#,0())*=6!-#*,())*=7!1#/())*=8

    ;##())*#'!3=0())*#,!$())*#/!&53())*#2

    *+4))!33(*+2))!0-.,%1#'(*+/))!0-.'%-.&/(*+,))!&,(*+'))!"#$%&'(/

    "&0>,

    !9"=())*

    ='

    !&"=())*

    =,

    !-.&'())*

    =/

    !-.&,())*

    =2

    !1#,+())*

    =4

    !1#,0())*

    =6

    !-#*,())*

    =7

    *0'))!0

    =#'(

    *0,))!0

    =#,(

    *0/))!0

    =#/(

    *02))!0

    =#2(

    *04))!0

    =#4(

    *06))!0

    =#6(

    *07))!0

    =#7(

    *08))!0

    =#8(

    09:?

    /

    "&0>,

    !9"=())*

    ='

    !&"=())*

    =,

    !-.&'())*

    =/

    !-.&,())*=2!1#,+())*=4!1#,0())*=6!-#*,())*=7!1#/())*=8

    ;##())*#'!3=0())*#,!$())*#/!&53())*#2

    *+4))!33(*+2))!0-.,%1#'(*+/))!0-.'%-.&/(*+,))!&,(*+'))!"#$%&'(/

    "&0>,

    !9"=())*

    ='

    !&"=())*

    =,

    !-.&'())*

    =/

    !-.&,())*

    =2

    !1#,+())*

    =4

    !1#,0())*

    =6

    !-#*,())*

    =7

    *0'))!0

    =#'(

    *0,))!0

    =#,(

    *0/))!0

    =#/(

    *02))!0

    =#2(

    *04))!0

    =#4(

    *06))!0

    =#6(

    *07))!0

    =#7(

    *08))!0

    =#8(

    09:?

    /

    "&0>,

    !9"=())*

    ='

    !&"=())*

    =,

    !-.&'())*

    =/

    !-.&,())*=2!1#,+())*=4!1#,0())*=6!-#*,())*=7!1#/())*=8

    ;##())*#'!3=0())*#,!$())*#/!&53())*#2

    *+4))!33(*+2))!0-.,%1#'(*+/))!0-.'%-.&/(*+,))!&,(*+'))!"#$%&'(/

    "&0>,

    !9"=())*

    ='

    !&"=())*

    =,

    !-.&'())*

    =/

    !-.&,())*

    =2

    !1#,+())*

    =4

    !1#,0())*

    =6

    !-#*,())*

    =7

    *0'))!0

    =#'(

    *0,))!0

    =#,(

    *0/))!0

    =#/(

    *02))!0

    =#2(

    *04))!0

    =#4(

    *06))!0

    =#6(

    *07))!0

    =#7(

    *08))!0

    =#8(

    09:?