6
Übungen zu Systemnahe Programmierung in C (SPiC) Sebastian Maier (Lehrstuhl Informatik 4) Übung 4 Sommersemester 2017 Inhalt Module Schnittstellenbeschreibung Ablauf vom Quellcode zum laufenden Programm Initialisierung eines Moduls Ein- & Ausgabe über Pins Active-high & Active-low Konfiguration der Pins Aufgabe 4: LED-Modul Hinweise Testen des Moduls Hands-on: Module, Felder & Zeiger Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 2 – 18 Inhalt Module Schnittstellenbeschreibung Ablauf vom Quellcode zum laufenden Programm Initialisierung eines Moduls Ein- & Ausgabe über Pins Aufgabe 4: LED-Modul Hands-on: Module, Felder & Zeiger Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 2 – 18 Schnittstellenbeschreibung Erstellen einer .h-Datei (Konvention: gleicher Name wie .c-Datei) 1 #ifndef LED_H 2 #define LED_H 3 /* fixed-width Datentypen einbinden (im Header verwendet) */ 4 #include <stdint.h> 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-Guard durch Definition und Abfrage eines Präprozessormakros Konvention: 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 möglichst eindeutiger Namen Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 3 – 18

Übungen zu Systemnahe Programmierung in C (SPiC) Module ... · Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken,

Embed Size (px)

Citation preview

Page 1: Übungen zu Systemnahe Programmierung in C (SPiC) Module ... · Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken,

Übungen zu Systemnahe Programmierung in C(SPiC)

Sebastian Maier(Lehrstuhl Informatik 4)

Übung 4

Sommersemester 2017

Inhalt

ModuleSchnittstellenbeschreibungAblauf vom Quellcode zum laufenden ProgrammInitialisierung eines Moduls

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

Aufgabe 4: LED-ModulHinweiseTesten des Moduls

Hands-on: Module, Felder & Zeiger

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 2 – 18

Inhalt

ModuleSchnittstellenbeschreibungAblauf vom Quellcode zum laufenden ProgrammInitialisierung eines Moduls

Ein- & Ausgabe über Pins

Aufgabe 4: LED-Modul

Hands-on: Module, Felder & Zeiger

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 2 – 18

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 <stdint.h>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 PräprozessormakrosKonvention: 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 möglichst eindeutiger Namen

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 3 – 18

Page 2: Übungen zu Systemnahe Programmierung in C (SPiC) Module ... · Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken,

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. Präprozessor2. Compiler3. Linker4. Programmer/Flasher

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 4 – 18

Initialisierung eines Moduls

Module müssen Initialisierung durchführen (z.B. Portkonfiguration)z.B. in Java mit Klassenkonstruktoren möglichC kennt kein solches Konzept

Workaround: Modul muss bei erstem Aufruf einer seiner Funktionenggf. die Initialisierung durchführen

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 (SS 2017) 5 – 18

Inhalt

Module

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

Aufgabe 4: LED-Modul

Hands-on: Module, Felder & Zeiger

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 5 – 18

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 (SS 2017) 6 – 18

Page 3: Übungen zu Systemnahe Programmierung in C (SPiC) Module ... · Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken,

Eingang: active-high & active-low

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

interner pull-up-Widerstand (im ATmega328PB) konfigurierbar

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 7 – 18

Konfiguration der Pins

Jeder I/O-Port des AVR-µC wird durch drei 8-bit Register gesteuert:Datenrichtungsregister (DDRx = data direction register)Datenregister (PORTx = port output register)Port Eingabe Register (PINx = port input register, nur-lesbar)

Jedem Anschluss-Pin ist ein Bit in jedem der 3 Register zugeordnet

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 8 – 18

I/O-Port-Register

DDRx: hier konfiguriert man Pin i von Port x als Ein- oder AusgangBit i = 1 → Pin i als Ausgang verwendenBit i = 0 → Pin i als Eingang verwenden

PORTx: Auswirkung abhängig von DDRx:ist Pin i als Ausgang konfiguriert, so steuert Bit i im PORTx Register obam Pin i ein high- oder ein low-Pegel erzeugt werden soll

Bit i = 1 → high-Pegel an Pin iBit i = 0 → low-Pegel an Pin i

ist Pin i als Eingang konfiguriert, so kann man einen internenpull-up-Widerstand aktivieren

Bit i = 1 → pull-up-Widerstand an Pin i (Pegel wird auf high gezogen)Bit i = 0 → Pin i als tri-state konfiguriert

PINx: Bit i gibt aktuellen Wert des Pin i von Port x an (nur lesbar)

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 9 – 18

Beispiel: Initialisierung eines Ports

Pin 3 von Port C (PC3) als Ausgang konfigurierenund PC3 auf Vcc schalten:

1 DDRC |= (1 << PC3); /* =0x08; PC3 als Ausgang nutzen... */2 PORTC |= (1 << PC3); /* ...und auf 1 (=high) setzen */

Pin 2 von Port D (PD2) als Eingang nutzen,pull-up-Widerstand aktivieren und prüfen ob ein low-Pegel anliegt:

1 DDRD &= ~(1 << PD2); /* PD2 als Eingang nutzen... */2 PORTD |= (1 << PD2); /* pull-up-Widerstand aktivieren */3 if((PIND & (1 << PD2)) == 0){ /* den Zustand auslesen */4 /* ein low Pegel liegt an, der Taster ist gedrückt */5 }

Die Initialisierung der Hardware wird in der Regel einmalig zumProgrammstart durchgeführt

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 10 – 18

Page 4: Übungen zu Systemnahe Programmierung in C (SPiC) Module ... · Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken,

Inhalt

Module

Ein- & Ausgabe über Pins

Aufgabe 4: LED-ModulHinweiseTesten des Moduls

Hands-on: Module, Felder & Zeiger

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 10 – 18

LED-Modul – Übersicht

LED 0 (RED0) ⇒ PD6 ⇒ Port D, Pin 6 ⇒ Bit 6 in PORTD und DDRD...LED 7 (BLUE1) ⇒ PC2 ⇒ Port C, Pin 2 ⇒ Bit 2 in PORTC und DDRC

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 11 – 18

SPiCboard Schaltplan

RXTX

D2*D3D4*D5*D6D7D8*D9*D10*D11D12D13

A0A1A2A3A4A5

VINRES

5V

AREFGNDGNDGND

3.3V

VCC

SDASCL

QB 1QC 2QD 3QE 4QF 5QG 6QH 7

SCL10 SCK11

RCK12

G13

SER14 QA 15

QH* 9

1 2

3 4

5 6

7 8

1 2

3 4

5 6

7 8

DP 418

2

1516 COM 14

3

1

17 DP 912

6

1011 COM 13

8

5

7

31 2

4 31 2

4

1234

1234

123

123

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 12 – 18

LED-Modul – Aufgabe

LED-Modul der SPiCboard-Bibliothek selbst implementierenGleiches Verhalten wie das OriginalBeschreibung:http://www4.cs.fau.de/Lehre/SS17/V_SPIC/Uebung/doc

Testen des ModulsEigenes Modul mit einem Testprogramm (test.c) linkenAndere Teile der Bibliothek können für den Test benutzt werden

LEDs des SPiCboardsAnschlüsse und Namen der einzelnen LEDs können demÜbersichtsbildchen entnommen werdenAlle LEDs sind active-low, d.h. leuchten wenn ein low-Pegel auf dem Pinangelegt wirdPD6 = Port D, Pin 6

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 13 – 18

Page 5: Übungen zu Systemnahe Programmierung in C (SPiC) Module ... · Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken,

Exkurs: const uint8_t* vs. uint8_t* const

const uint8_t*ein Pointer auf einen uint8_t-Wert, der konstant istWert nicht über den Pointer veränderbar

uint8_t* constein konstanter Pointer auf einen (beliebigen) uint8_t-WertPointer darf nicht mehr auf eine andere Speicheradresse zeigen

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 14 – 18

Port- und Pin-Array

Port und Pin Definitionen (in avr/io.h)1 #define PORTD (* (volatile uint8_t*)0x2B)2 ...3 #define PD0 04 ...

Adressoperator: &Dereferenzierungsoperator: ∗Port Array:

1 static volatile uint8_t * const ports[] = { &PORTD,2 ...,3 &PORTC };

Pin Array:1 static uint8_t const pins[] = { PD6, ..., PC2 };

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 15 – 18

AVR-Studio Projekteinstellungen

Projekt wie gehabt anlegenInitiale Quelldatei: test.cDann weitere Quelldatei led.c hinzufügen

Wenn nun übersetzt wird, werden die Funktionen aus dem eigenenLED-Modul verwendetAndere Teile der Bibliothek werden nach Bedarf hinzugebundenTemporäres Deaktivieren zum Test der Originalfunktiononen:

1 #if 02 ....3 #endif

Sieht der Compiler diese “Kommentare”?

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 16 – 18

Testen des Moduls

1 void main(void){2 ...3 // 1.) Testen bei korrekter LED-ID4 int8_t result = sb_led_on(RED0);5 if(result != 0){6 // Test fehlgeschlagen7 // Ausgabe z.B. auf 7-Segment-Anzeige8 }910 // 2.) Testen bei ungueltiger LED-ID11 ...12 }

Schnittstellenbeschreibung genau beachten (inkl. Rückgabewerte)Testen aller möglichen RückgabewerteFehler wenn Rückgabewert nicht der Spezifikation entspricht

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 17 – 18

Page 6: Übungen zu Systemnahe Programmierung in C (SPiC) Module ... · Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken,

Inhalt

Module

Ein- & Ausgabe über Pins

Aufgabe 4: LED-Modul

Hands-on: Module, Felder & Zeiger

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 17 – 18

Hands-on: Module, Felder & Zeiger

Statistikmodul und TestprogrammFunktionalität des Moduls:

Mittelwertbildunguint8_t avgArray(uint16_t *a, size_t s, uint16_t *avg);

Minimal- und Maximalwertermittlunguint8_t minArray(uint16_t *a, size_t s, uint16_t *min);uint8_t maxArray(uint16_t *a, size_t s, uint16_t *max);

Rückgabewert: 0: OK; 1: FehlerInterne Hilfsfunktionen:

uint16_t getMin(uint16_t a, uint16_t b);uint16_t getMax(uint16_t a, uint16_t b);

Vorgehen:Header-Datei mit Modulschnittstelle (und Include-Guards)Implementierung des Moduls (Sichtbarkeit beachten)Testen des Moduls im Hauptprogramm (inkl. Fehlerfälle)

Lehrstuhl Informatik 4 Übungen zu SPiC (SS 2017) 18 – 18