408
Systemnahe Programmierung in C (SPiC) Jürgen Kleinöder, Daniel Lohmann, Volkmar Sieh Lehrstuhl für Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg Sommersemester 2018 http://www4.cs.fau.de/Lehre/SS18/V _ SPIC V_SPIC_handout

this page¼berblick Teil A: Konzept und Organisation 1 Einführung 2 Organisation Teil B: Einführung in C 3 Java versus C 4 Softwareschichten und Abstraktion 5 …

Embed Size (px)

Citation preview

  • Systemnahe Programmierungin C (SPiC)

    Jrgen Kleinder, Daniel Lohmann, Volkmar Sieh

    Lehrstuhl fr Informatik 4Verteilte Systeme und Betriebssysteme

    Friedrich-Alexander-UniversittErlangen-Nrnberg

    Sommersemester 2018

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

    V_

    SPIC

    _ha

    ndou

    t

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

  • Referenzen

    [1] ATmega328PB 8-bit AVR Microcontroller with 32K Bytes In-SystemProgrammable Flash. Atmel Corporation. Okt. 2015.

    [GDI] Frank Bauer. Grundlagen der Informatik. Vorlesung.Friedrich-Alexander-Universitt Erlangen-Nrnberg, Lehrstuhl fr Informatik 5,2015 (jhrlich). URL: https://gdi.cs.fau.de/w15/material.

    [2] Manfred Dausmann, Ulrich Brckl, Dominic Schoop u. a. C als ersteProgrammiersprache: Vom Einsteiger zum Fortgeschrittenen. (Als E-Book ausdem Uninetz verfgbar; PDF-Version unter /proj/i4gspic/pub).Vieweg+Teubner, 2010. ISBN: 978-3834812216. URL:https://www.springerlink.com/content/978-3-8348-1221-

    6/#section=813748&page=1.

    [3] Brian W. Kernighan und Dennis MacAlistair Ritchie. The C ProgrammingLanguage. Englewood Cliffs, NJ, USA: Prentice Hall PTR, 1978.

    [4] Brian W. Kernighan und Dennis MacAlistair Ritchie. The C ProgrammingLanguage (2nd Edition). Englewood Cliffs, NJ, USA: Prentice Hall PTR, 1988.ISBN: 978-8120305960.

    [5] Dennis MacAlistair Ritchie und Ken Thompson. The Unix Time-SharingSystem. In: Communications of the ACM 17.7 (Juli 1974), S. 365370. DOI:10.1145/361011.361061.

    c kls SPiC (SS 18)

    V_

    SPIC

    _ha

    ndou

    t

    https://gdi.cs.fau.de/w15/material/proj/i4gspic/pubhttps://www.springerlink.com/content/978-3-8348-1221-6/#section=813748&page=1https://www.springerlink.com/content/978-3-8348-1221-6/#section=813748&page=1http://dx.doi.org/10.1145/361011.361061

  • Referenzen (Forts.)

    [6] David Tennenhouse. Proactive Computing. In: Communications of the ACM(Mai 2000), S. 4345.

    [7] Jim Turley. The Two Percent Solution. In: embedded.com (Dez. 2002).http://www.embedded.com/story/OEG20021217S0039, visited 2011-04-08.

    c kls SPiC (SS 18)

    V_

    SPIC

    _ha

    ndou

    t

    http://www.embedded.com/story/OEG20021217S0039

  • Veranstaltungsberblick

    Teil A: Konzept und Organisation

    1 Einfhrung

    2 Organisation

    Teil B: Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor

    Teil C: Systemnahe Softwareentwicklung

    12 Programmstruktur und Module

    13 Zeiger und Felder

    14 C-Systemarchitektur

    Teil D: Betriebssystemabstraktionen

    15 Nebenlufigkeit

    16 Ergnzungen zur Einfhrung in C

    17 Betriebssysteme

    18 Dateisysteme

    19 Programme und Prozesse

    20 Speicherorganisation

    21 Nebenlufige Prozesse

    V_

    SPIC

    _ha

    ndou

    t

  • Systemnahe Programmierungin C (SPiC)

    Teil A Konzept und Organisation

    Jrgen Kleinder, Daniel Lohmann, Volkmar Sieh

    Lehrstuhl fr Informatik 4Verteilte Systeme und Betriebssysteme

    Friedrich-Alexander-UniversittErlangen-Nrnberg

    Sommersemester 2018

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

    V_

    SPIC

    _ha

    ndou

    t

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

  • berblick: Teil A Konzept und Organisation

    1 EinfhrungZiele der LehrveranstaltungWarum -Controller?Warum C?Literatur

    2 OrganisationVorlesungbungLtabendPrfungSemesterberblick

    01-E

    infu

    ehru

    ng:20

    18-0

    2-21

  • Lernziele

    Vertiefen des Wissens ber Konzepte und Technikender Informatik fr die Softwareentwicklung

    Ausgangspunkt: Grundlagen der Informatik (GdI)Schwerpunkt: Systemnahe Softwareentwicklung in C

    Entwickeln von Software in C fr einen -Controller (C)und eine Betriebssystem-Plattform (Linux)

    SPiCboard-Lehrentwicklungsplattform mit ATmega-CPraktische Erfahrungen in hardware- und systemnaherSoftwareentwicklung machen

    Verstehen der technologischen Sprach- und Hardwaregrundlagenfr die Entwicklung systemnaher Software

    Die Sprache C verstehen und einschtzen knnenUmgang mit Nebenlufigkeit und HardwarenheUmgang mit den Abstraktionen eines Betriebssystems(Dateien, Prozesse, . . . )

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Ziele der Lehrveranstaltung 11

    V_

    SPIC

    _ha

    ndou

    t

  • Motivation: Eingebettete Systeme

    Omniprsent: 9899 Prozent aller Prozessoren wurden im Jahr2000 in einem eingebetteten System verbaut [6]

    Kostensensitiv: 7080 Prozent aller produzierten Prozessoren sindDSPs und -Controller, 8-Bit oder kleiner [6, 7]

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Warum -Controller? 12

    01-E

    infu

    ehru

    ng:20

    18-0

    2-21

    Marktanteil (Umsatz/Stckzahl) im Jahr 2002 [7]

    http://stepstone.com

  • Motivation: Eingebettete Systeme

    Omniprsent: 9899 Prozent aller Prozessoren wurden im Jahr2000 in einem eingebetteten System verbaut [6]

    Kostensensitiv: 7080 Prozent aller produzierten Prozessoren sindDSPs und -Controller, 8-Bit oder kleiner [6, 7]

    Relevant: 25 Prozent der Stellenanzeigen fr EE-Ingenieureenthalten die Stichworte embedded oder automo-tive (http://stepstone.com, 4. April 2011)

    Bei den oberen Zahlen ist gesunde Skepsis gebotenDie Verffentlichungen [6, 7] sind mehr als 10 Jahre alt!

    Man kann dennoch davon ausgehen, dass dierelativen Grenordnungen nach wie vor stimmen

    2016 liegt der Anteil an 8-Bittern (vermutlich) noch bei 40 Prozent4-Bitter drften inzwischen jedoch weitgehend ausgestorben sein

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Warum -Controller? 12

    01-E

    infu

    ehru

    ng:20

    18-0

    2-21

    http://stepstone.com

  • Motivation: Die ATmega-C-Familie (8-Bit)

    Type Flash SRAM IO Timer 8/16 UART SPI ADC PWM EUR

    ATTINY13 1 KiB 64 B 6 1/- - - 1*4 - 0,86

    ATTINY2313 2 KiB 128 B 18 1/1 - 1 - - 0,99

    ATMEGA48 4 KiB 512 B 23 2/1 1 1 8*10 6 1,40

    ATMEGA16 16 KiB 1024 B 32 2/1 1 1 8*10 4 2,05

    ATMEGA32 32 KiB 2048 B 32 2/1 1 1 8*10 4 3,65

    ATMEGA64 64 KiB 4096 B 53 2/2 2 1 8*10 8 5,70

    ATMEGA128 128 KiB 4096 B 53 2/2 2 1 8*10 8 7,35

    ATMEGA256 256 KiB 8192 B 86 2/2 4 1 16*10 16 8,99

    ATmega-Varianten (Auswahl) und Handelspreise (Reichelt Elektronik, April 2015)

    Sichtbar wird: RessourcenknappheitFlash (Speicher fr Programmcode und konstante Daten) ist knappRAM (Speicher fr Laufzeit-Variablen) ist extrem knappWenige Bytes Verschwendung ; signifikant hhere Stckzahlkosten

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Warum -Controller? 14

    01-E

    infu

    ehru

    ng:20

    18-0

    2-21

  • Motivation: Die Sprache C

    Systemnahe Softwareentwicklung erfolgt berwiegend in CWarum C? (und nicht Java/Cobol/Scala/)

    C steht fr eine Reihe hier wichtiger EigenschaftenLaufzeiteffizienz (CPU)

    bersetzter C-Code luft direkt auf dem ProzessorKeine Prfungen auf Programmierfehler zur Laufzeit

    Platzeffizienz (Speicher)Code und Daten lassen sich sehr kompakt ablegenKeine Prfung der Datenzugriffe zur Laufzeit

    Direktheit (Maschinennhe)C erlaubt den direkten Zugriff auf Speicher und Register

    PortabilittEs gibt fr jede Plattform einen C-CompilerC wurde erfunden (1973), um das BetriebssystemUNIX portabel zu implementieren [3, 5]

    ; C ist die lingua franca der systemnahen Softwareentwicklung!

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Warum C? 15

    01-E

    infu

    ehru

    ng:20

    18-0

    2-21

  • Motivation: SPiC Stoffauswahl und Konzept

    Lehrziel: Systemnahe Softwareentwicklung in CDas ist ein sehr umfangreiches Feld: Hardware-Programmierung,Betriebssysteme, Middleware, Datenbanken, Verteilte Systeme,bersetzerbau, . . .Dazu kommt dann noch das Erlernen der Sprache C selber

    AnsatzKonzentration auf zwei Domnen

    -Controller-ProgrammierungSoftwareentwicklung fr die Linux-Systemschnittstelle

    Gegensatz C-Umgebung Betriebssystemplattform erfahrenKonzepte und Techniken an kleinen Beispielen lehr- und erfahrbarHohe Relevanz fr die Zielgruppe (ME)

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Warum C? 16

    V_

    SPIC

    _ha

    ndou

    t

  • Vorlesungsskript

    Das Handout der Vorlesungsfolien wird online und als4 1-Ausdruck auf Papier zur Verfgung gestellt

    Ausdrucke werden vor der Vorlesung verteiltOnline-Version wird vor der Vorlesung aktualisiertHandout enthlt (in geringem Umfang) zustzliche Informationen

    Das Handout kann eine eigene Mitschrift nicht ersetzen!

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Literatur 17

    01-E

    infu

    ehru

    ng:20

    18-0

    2-21

  • Literaturempfehlungen

    [2] Fr den Einstieg empfohlen:

    Manfred Dausmann, Ulrich Brckl, Dominic Schoopu. a. C als erste Programmiersprache: Vom Einsteigerzum Fortgeschrittenen. (Als E-Book aus dem Uninetzverfgbar; PDF-Version unter /proj/i4gspic/pub).Vieweg+Teubner, 2010. ISBN: 978-3834812216. URL:https://www.springerlink.com/content/978- 3-

    8348-1221-6/#section=813748&page=1

    [4] Der Klassiker (eher als Referenz geeignet):

    Brian W. Kernighan und Dennis MacAlistair Ritchie.The C Programming Language (2nd Edition). Engle-wood Cliffs, NJ, USA: Prentice Hall PTR, 1988. ISBN:978-8120305960

    c kls SPiC (Teil A, SS 18) 1 Einfhrung Literatur 18

    01-E

    infu

    ehru

    ng:20

    18-0

    2-21

    /proj/i4gspic/pubhttps://www.springerlink.com/content/978-3-8348-1221-6/#section=813748&page=1https://www.springerlink.com/content/978-3-8348-1221-6/#section=813748&page=1

  • berblick: Teil A Konzept und Organisation

    1 Einfhrung

    2 Organisation

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

  • Vorlesung

    Inhalt und ThemenGrundlegende Konzepte der systemnahen ProgrammierungEinfhrung in die Programmiersprache C

    Unterschiede zu JavaModulkonzeptZeiger und Zeigerarithmetik

    Softwareentwicklung auf der nackten Hardware (ATmega-C)Abbildung Speicher SprachkonstrukteUnterbrechungen (interrupts) und Nebenlufigkeit

    Softwareentwicklung auf einem Betriebssystem (Linux)Betriebssystem als Ausfhrungsumgebung fr ProgrammeAbstraktionen und Dienste eines Betriebssystems

    Termin: Dienstag, 08:15 09:45, H7Einzeltermin am 12. April (Do), 10:15 11:45, H7insgesamt 13 Vorlesungstermine 28

    c kls SPiC (Teil A, SS 18) 2 Organisation Vorlesung 21

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

  • bungen

    Tafelbung und RechnerbungTafelbungen

    Ausgabe und Erluterung der ProgrammieraufgabenGemeinsame Entwicklung einer LsungsskizzeBesprechung der Lsungen

    Rechnerbungenselbststndige ProgrammierungUmgang mit Entwicklungswerkzeug (Atmel Studio)Betreuung durch bungsbetreuer

    Termin: 9 Gruppen zur AuswahlAnmeldung ber Waffel (siehe Webseite) ab heute (Dienstag), 19:30nach dem Windhundverfahren.Bei zu wenigen Teilnehmern behalten wir uns eine Verteilung auf andereGruppen vor. Ihr werdet in diesem Fall per E-Mail angeschrieben.

    Zur bungsteilnahme wird ein gltiger Login im Linux-CIP gebraucht!

    c kls SPiC (Teil A, SS 18) 2 Organisation bung 22

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

    https://waffel.informatik.uni-erlangen.de/

  • Programmieraufgaben

    Praktische Umsetzung des VorlesungsstoffsAcht Programmieraufgaben 28Bearbeitung teilweise alleine / mit bungspartner

    Lsungen mit Abgabeskript am Rechner abgebenLsung wird durch Skripte berprftWir korrigieren und bepunkten die Abgaben und geben sie zurck

    Abgabe der bungsaufgaben ist freiwillig; 27es knnen jedoch bis zu 10% Bonuspunktefr die Prfungsklausur erarbeitet werden!

    Plagiate knnen zum Verlust aller Bonus-punkte fhren.

    Unabhngig davon ist dieTeilnahme an den bun-gen dringend empfohlen!

    c kls SPiC (Teil A, SS 18) 2 Organisation bung 23

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

  • Bestehensquote der Klausur

    nach Aktivitt der Teilnehmer bei den bungsaufgaben

    0% 20% 40% 60% 80% 100%

    SS13

    SS14

    SS15

    SS16

    SS17

    73% (mit 2,4)

    72% (mit 2,8)

    90% (mit 1,9)

    89% (mit 2,3)

    94% (mit 2,4)

    6% (mit 3,8)

    33% (mit 3,7)

    59% (mit 2,9)

    38% (mit 3,3)

    37% (mit 3,4)

    Bestehensquote

    keine oder weniger als die Hlfte der bungsaufgaben abgegeben

    mindestens die Hlfte der bungsaufgaben abgegeben

    c kls SPiC (Teil A, SS 18) 2 Organisation bung 24

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

  • bungsplattform: Das SPiCboard

    ATmega328-C

    USB-Anschluss

    8 LEDs

    2 7-Seg-Elemente

    2 Taster

    1 Potentiometer

    1 Fotosensor

    optional:

    OLED Display

    Ausleihe whrend Rechnerbung oder von der FSI ME mglichOder noch besser selber Lten

    c kls SPiC (Teil A, SS 18) 2 Organisation bung 25

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

  • SPiCboard-Ltabend

    Die FSI EEI, FSI ME sowie das FabLab bieten einen Ltabend frdie Teilnehmer der Veranstaltung an

    Teilnahme ist freiwillig

    (Erste) Lterfahrung sammeln beim Lten eines eigenen SPiCboards

    Voraussichtlich insgesamt 6 Termine (in KW 16 & 17)

    Anmeldung: ber Waffel notwendig, da begrenzte Pltze:

    Heute (Dienstag), 20:15 Freitag, 11:00

    Kostenbeitrag: kostenlos (fr Teilnehmer dieser Veranstaltung),

    finanziert aus Studienzuschssen

    Der bei der Anmeldung gewhlte Termin ist verbindlich!

    c kls SPiC (Teil A, SS 18) 2 Organisation Ltabend 26

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

    https://eei.fsi.uni-erlangen.de/https://mechatronik.fsi.fau.dehttps://fablab.fau.de/

  • Prfung und Modulnote

    Prfung (Klausur)

    Termin: voraussichtlich Ende Juli / Anfang August

    Dauer: 90 min

    Inhalt: Fragen zum Vorlesungsstoff + Programmieraufgabe

    Klausurnote 7 Modulnote

    Bestehensgrenze (in der Regel): 50% der mglichen Klausurpunkte (KP)

    Falls bestanden ist eine Notenverbesserung mglichdurch Bonuspunkte aus den Programmieraufgaben

    Basis (Minimum): 50% der mglichen bungspunkte (P)

    Jede weiteren 5% der mglichen P 7 +1% der mglichen KP

    ; 100% der mglichen P 7 +10% der mglichen KP

    c kls SPiC (Teil A, SS 18) 2 Organisation Prfung 27

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

  • Sem

    este

    rpla

    nung

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

  • Bei Fragen oder Problemen

    Vorlesungs- und bungsfolien konsultieren

    Hufig gestellte Fragen (FAQ) und Antworten siehe Webseite http://www4.cs.fau.de/Lehre/SS18/V_SPIC bungen FAQ

    Allgemeine Fragen zu bungsaufgaben etc. im EEI-Forum posten https://eei.fsi.uni-erlangen.de/forum/forum/16

    Bei speziellen Fragen Mail an Mailingliste (alle bungsleiter) [email protected]

    c kls SPiC (Teil A, SS 18) 2 Organisation Semesterberblick 29

    02-O

    rgan

    isat

    ion:

    2018

    -04-

    05

    http://www4.cs.fau.de/Lehre/SS18/V_SPIChttps://eei.fsi.uni-erlangen.de/forum/forum/16mailto:[email protected]

  • Systemnahe Programmierungin C (SPiC)

    Teil B Einfhrung in C

    Jrgen Kleinder, Daniel Lohmann, Volkmar Sieh

    Lehrstuhl fr Informatik 4Verteilte Systeme und Betriebssysteme

    Friedrich-Alexander-UniversittErlangen-Nrnberg

    Sommersemester 2018

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

    V_

    SPIC

    _ha

    ndou

    t

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor03-

    Java

    -vs-

    C:20

    18-0

    2-21

  • Das erste C-Programm

    Das berhmteste Programm der Welt in C

    #include

    int main(int argc, char **argv) {/* greet user */printf("Hello World!\n");return 0;

    }

    bersetzen und Ausfhren (auf einem UNIX-System)

    ~> gcc -o hello hello.c~> ./helloHello World!~>

    Gar nicht soschwer :-)

    c kls SPiC (Teil B, SS 18) 3 Java versus C Ausgabe 31

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Das erste C-Programm Vergleich mit Java

    Das berhmteste Programm der Welt in C

    1 #include 2

    3 int main(int argc, char **argv) {4 /* greet user */5 printf("Hello World!\n");6 return 0;7 }

    Das berhmteste Programm der Welt in Java

    1 import java.lang.System;2 class Hello {3 public static void main(String[] args) {4 /* greet user */5 System.out.println("Hello World!");6 return;7 }8 }

    c kls SPiC (Teil B, SS 18) 3 Java versus C Ausgabe 32

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Das erste C-Programm Erluterungen [Handout]

    C-Version zeilenweise erlutert1 Fr die Benutzung von printf() wird die Funktionsbibliothek stdio.h mit

    der Prprozessor-Anweisung #include eingebunden.3 Ein C-Programm startet in main(), einer globalen Funktion vom Typ int,

    die in genau einer Datei definiert ist.5 Die Ausgabe einer Zeichenkette erfolgt mit der Funktion printf(). (\n ;

    Zeilenumbruch)6 Rckkehr zum Betriebssystem mit Rckgabewert. 0 bedeutet hier, dass

    kein Fehler aufgetreten ist.

    Java-Version zeilenweise erlutert1 Fr die Benutzung der Klasse out wird das Paket System mit der

    import-Anweisung eingebunden.2 Jedes Java-Programm besteht aus mindestens einer Klasse.3 Jedes Java-Programm startet in main(), einer statischen Methode vom

    Typ void, die in genau einer Klasse definiert ist.5 Die Ausgabe einer Zeichenkette erfolgt mit der Methode println() aus

    der Klasse out aus dem Paket System. [ GDI, 01-10]6 Rckkehr zum Betriebssystem.

    c kls SPiC (Teil B, SS 18) 3 Java versus C Ausgabe 33

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Das erste C-Programm fr einen -Controller

    Hello World fr AVR ATmega (SPiCboard)

    #include

    void main() {// initialize hardware: LED on port D pin 6, active lowDDRD |= (1

  • Das erste C-Programm fr einen -Controller

    Hello World fr AVR ATmega (vgl. 31 )

    1 #include 2

    3 void main() {4 // initialize hardware: LED on port D pin 6, active low5 DDRD |= (1

  • -Controller-Programm Erluterungen [Handout]

    -Controller-Programm zeilenweise erlutert(Beachte Unterschiede zur Linux-Version 33 )

    1 Fr den Zugriff auf Hardware-Register (DDRD, PORTD, bereitgestellt alsglobale Variablen) wird die Funktionsbibliothek avr/io.h mit #includeeingebunden.

    3 Die main()-Funktion hat keinen Rckgabewert (Typ void). Ein-Controller-Programm luft endlos ; main() terminiert nie.

    5-6 Zunchst wird die Hardware initialisiert (in einen definierten Zustandgebracht). Dazu mssen einzelne Bits in bestimmten Hardware-Registernmanipuliert werden.

    9 Die Interaktion mit der Umwelt (hier: LED einschalten) erfolgt ebenfallsber die Manipulation einzelner Bits in Hardware-Registern.

    12-13 Es erfolgt keine Rckkehr zum Betriebssystem (wohin auch?). DieEndlosschleife stellt sicher, dass main() nicht terminiert.

    c kls SPiC (Teil B, SS 18) 3 Java versus C Ausgabe 36

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Das zweite C-Programm Eingabe unter Linux

    Benutzerinteraktion (Lesen eines Zeichens) unter Linux:

    #include

    int main(int argc, char** argv){

    printf("Press key: ");int key = getchar();

    printf("You pressed %c\n", key);return 0;

    }

    Die getchar()-Funktion liest ein Zeichenvon der Standardeingabe (hier: Tastatur).Sie wartet gegebenenfalls, bis ein Zeichenverfgbar ist. In dieser Zeit entzieht das Be-triebssystem den Prozessor.

    c kls SPiC (Teil B, SS 18) 3 Java versus C Eingabe 37

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Das zweite C-Programm Eingabe mit -Controller

    Benutzerinteraktion (Warten auf Tasterdruck) auf dem SPiCboard:

    1 #include 2

    3 void main() {4 // initialize hardware: button on port D pin 25 DDRD &= ~(1

  • Warten auf Tasterdruck Erluterungen [Handout]

    Benutzerinteraktion mit SPiCboard zeilenweise erlutert5 Wie die LED ist der Taster mit einem digitalen IO-Pin des -Controllers

    verbunden. Hier konfigurieren wir Pin 2 von Port D als Eingang durchLschen des entsprechenden Bits im Register DDRD.

    6 Durch Setzen von Bit 2 im Register PORTD wird der internePull-Up-Widerstand (hochohmig) aktiviert, ber den VCC anliegt ; PD2 =high.

    13-14 Aktive Warteschleife: Wartet auf Tastendruck, d. h. solange PD2 (Bit 2im Register PIND) high ist. Ein Tasterdruck zieht PD2 auf Masse ; Bit 2im Register PIND wird low und die Schleife verlassen.

    c kls SPiC (Teil B, SS 18) 3 Java versus C Eingabe 39

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Zum Vergleich: Benutzerinteraktion als Java-Programm

    1 import java.lang.System;2 import javax.swing.*;3 import java.awt.event.*;4

    5 public class Input implements ActionListener {6 private JFrame frame;7

    8 public static void main(String[] args) {9 // create input, frame and button objects

    10 Input input = new Input();11 input.frame = new JFrame("Java-Programm");12 JButton button = new JButton("Klick mich");13

    14 // add button to frame15 input.frame.add(button);16 input.frame.setSize(400, 400);17 input.frame.setVisible(true);18

    19 // register input as listener of button events20 button.addActionListener(input);21 }22

    23 public void actionPerformed(ActionEvent e) {24 System.out.println("Knopfdruck!");25 System.exit(0);26 }27 }

    c kls SPiC (Teil B, SS 18) 3 Java versus C Eingabe 310

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

    Eingabe als typischesJava-Programm(objektorientiert, grafisch)

  • Benutzerinteraktion als Java-Programm Erluterungen [Handout]

    Das Programm ist mit der C-Variante nicht unmittelbar vergleichbarEs verwendet das in Java bliche (und Ihnen bekannte)objektorientierte Paradigma.Dieser Unterschied soll hier verdeutlicht werden.

    Benutzerinteraktion in Java zeilenweise erlutert5 Um Interaktionsereignisse zu empfangen, implementiert die Klasse Input

    ein entsprechendes Interface.10-12 Das Programmverhalten ist implementiert durch eine Menge von Objekten

    (frame, button, input), die hier bei der Initialisierung erzeugt werden.20 Das erzeugte button-Objekt schickt nun seine Nachrichten an das

    input-Objekt.23-26 Der Knopfdruck wird durch eine actionPerformed()-Nachricht

    (Methodenaufruf) signalisiert.

    c kls SPiC (Teil B, SS 18) 3 Java versus C Eingabe 311

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Ein erstes Fazit: Von Java C (Syntax)

    Syntaktisch sind Java und C sich sehr hnlich(Syntax: Wie sehen gltige Programme der Sprache aus?)

    C-Syntax war Vorbild bei der Entwicklung von Java; Viele Sprachelemente sind hnlich oder identisch verwendbar

    Blcke, Schleifen, Bedingungen, Anweisungen, LiteraleWerden in den folgenden Kapiteln noch im Detail behandelt

    Wesentliche Sprachelemente aus Java gibt es in C jedoch nichtKlassen, Pakete, Objekte, Ausnahmen (Exceptions), . . .

    c kls SPiC (Teil B, SS 18) 3 Java versus C Erstes Fazit 312

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Ein erstes Fazit: Von Java C (Idiomatik)

    Idiomatisch gibt es sehr groe Unterschiede(Idiomatik: Wie sehen bliche Programme der Sprache aus?)

    Java: Objektorientiertes ParadigmaZentrale Frage: Aus welchen Dingen besteht das Problem?Gliederung der Problemlsung in Klassen und ObjekteHierarchiebildung durch Vererbung und AggregationProgrammablauf durch Interaktion zwischen ObjektenWiederverwendung durch umfangreiche Klassenbibliothek

    C: Imperatives ParadigmaZentrale Frage: Aus welchen Aktivitten besteht das Problem?Gliederung der Problemlsung in Funktionen und VariablenHierarchiebildung durch Untergliederung in TeilfunktionenProgrammablauf durch Aufrufe zwischen FunktionenWiederverwendung durch Funktionsbibliotheken

    c kls SPiC (Teil B, SS 18) 3 Java versus C Erstes Fazit 313

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Ein erstes Fazit: Von Java C (Philosophie)

    Philosophisch gibt es ebenfalls erhebliche Unterschiede(Philosophie: Grundlegende Ideen und Konzepte der Sprache)

    Java: Sicherheit und Portabilitt durch Maschinenfernebersetzung fr virtuelle Maschine (JVM)Umfangreiche berprfung von Programmfehlern zur Laufzeit

    Bereichsberschreitungen, Division durch 0, . . .

    Problemnahes SpeichermodellNur typsichere Speicherzugriffe, automatische Bereinigung zur Laufzeit

    C: Effizienz und Leichtgewichtigkeit durch Maschinennhebersetzung fr konkrete HardwarearchitekturKeine berprfung von Programmfehlern zur Laufzeit

    Einige Fehler werden vom Betriebssystem abgefangen falls vorhanden

    Maschinennahes SpeichermodellDirekter Speicherzugriff durch ZeigerGrobgranularer Zugriffsschutz und automatische Bereinigung(auf Prozessebene) durch das Betriebssystem falls vorhanden

    c kls SPiC (Teil B, SS 18) 3 Java versus C Erstes Fazit 314

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • Ein erstes Fazit: -Controller-Programmierung

    C 7 Maschinennhe 7 C-ProgrammierungDie Maschinennhe von C zeigt sich insbesondereauch bei der -Controller-Programmierung!

    Es luft nur ein ProgrammWird bei RESET direkt aus dem Flash-Speicher gestartet

    Muss zunchst die Hardware initialisieren

    Darf nie terminieren (z. B. durch Endlosschleife in main())

    Die Problemlsung ist maschinennah implementiertDirekte Manipulation von einzelnen Bits in Hardwareregistern

    Detailliertes Wissen ber die elektrische Verschaltung erforderlich

    Keine Untersttzung durch Betriebssystem (wie etwa Linux)

    Allgemein geringes Abstraktionsniveau ; fehleranfllig, aufwndig

    Ansatz: Mehr Abstraktion durch problemorientierte Bibliotheken

    c kls SPiC (Teil B, SS 18) 3 Java versus C Erstes Fazit 315

    03-J

    ava-

    vs-C

    :20

    18-0

    2-21

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor04-

    Abs

    trak

    tion

    :20

    18-0

    4-05

  • Abstraktion durch Softwareschichten: SPiCboard

    Hardwaresicht Softwareschichten

    ATmega32 ATmega64

    abstractATmega

    SPiCboard

    LED Button

    8 2

    ATmega32Register, . . .

    ATmega64Register, . . .

    Register, . . .

    avr-libc: abstrahiert von ATmega-Ausprgung und Register-Adressen

    ...

    libspicboard: abstrahiertvon C und Verschaltung ...

    c kls SPiC (Teil B, SS 18) 4 Softwareschichten und Abstraktion Funktionsbibliotheken 41

    04-A

    bstr

    aktion

    :20

    18-0

    4-05

    Pro

    blem

    nhe

    Maschinennhe

  • Abstraktion durch Softwareschichten: LED on im Vergleich

    ATmega32Register, . . .

    ATmega64Register, . . .

    Register, . . .

    avr-libc: abstrahiert von ATmega-Ausprgung und Register-Adressen

    ...

    libspicboard: abstrahiertvon C und Verschaltung ...

    ATmega32-Programm

    ATmega-Programm

    SPiCboard-Programm

    Ziel: Schalte LED RED0 aufSPiCboard an:

    Programm luft nur auf ATmega32. Esverwendet ATmega32-spezifische Regis-teradressen (wie 0x12) und Merkmale:

    ...

    (*(unsigned char*)(0x11)) |= (1

  • Abstraktion durch Softwareschichten: Vollstndiges Beispiel

    Bisher: Entwicklung mit avr-libc

    #include

    void main(void) {// initialize hardware

    // button0 on PD2DDRD &= ~(1

  • Abstraktionen der libspicboard: Kurzberblick

    Ausgabe-Abstraktionen (Auswahl)LED-Modul (#include )

    LED einschalten: sb_led_on(BLUE0) ;R0 Y0 G0 B0 R1 Y1 G1 B1

    LED ausschalten: sb_led_off(BLUE0) ;

    Alle LEDs ein-/ausschalten:sb_led_set_all_leds(0x0f) ;

    0 1 2 3 4 5 6 7

    7-Seg-Modul (#include )Ganzzahl n {9 . . . 99} ausgeben:sb_7seg_showNumber(47) ;

    Eingabe-Abstraktionen (Auswahl)Button-Modul (#include )

    Button-Zustand abfragen:sb_button_getState(BUTTON0) 7 BUTTONSTATE_{PRESSED,RELEASED}

    ADC-Modul (#include )Potentiometer-Stellwert abfragen:sb_adc_read(POTI) 7 {0. . . 1023}

    c kls SPiC (Teil B, SS 18) 4 Softwareschichten und Abstraktion Funktionsbibliotheken 44

    04-A

    bstr

    aktion

    :20

    18-0

    4-05

  • Softwareschichten im Allgemeinen

    Diskrepanz: Anwendungsproblem Ablufe auf der Hardware

    Grafik-Workstation

    Klassenbibliotheken

    Java Byte-Code

    Assemblerprogr.

    CAD-System

    JVM

    Maschinenprogr.

    bersetzung

    Interpretation

    C-Programm

    Java-Programm

    bersetzung

    bersetzung

    AusfhrungProzessor

    Funktionsbibliotheken

    Betriebssystem

    Interpretation von Systemaufrufen

    C-Programm

    Ziel: Ausfhrbarer Maschinencode

    c kls SPiC (Teil B, SS 18) 4 Softwareschichten und Abstraktion Allgemein 45

    04-A

    bstr

    aktion

    :20

    18-0

    4-05

    Pro

    blem

    nhe

    Maschinennhe

  • Die Rolle des Betriebssystems

    Anwendersicht: Umgebung zum Starten, Kontrollieren undKombinieren von Anwendungen

    Shell, grafische Benutzeroberflchez. B. bash, Windows

    Datenaustausch zwischen Anwendungen und Anwendernz. B. ber Dateien

    Anwendungssicht: Funktionsbibliothek mit Abstraktionen zurVereinfachung der Softwareentwicklung

    Generische Ein-/Ausgabe von Datenz. B. auf Drucker, serielle Schnittstelle, in Datei

    Permanentspeicherung und bertragung von Datenz. B. durch Dateisystem, ber TCP/IP-Sockets

    Verwaltung von Speicher und anderen Betriebsmittelnz. B. CPU-Zeit

    c kls SPiC (Teil B, SS 18) 4 Softwareschichten und Abstraktion Allgemein 46

    04-A

    bstr

    aktion

    :20

    18-0

    4-05

  • Die Rolle des Betriebssystems (Forts.)

    Systemsicht: Softwareschicht zum Multiplexen derHardware ( Mehrbenutzerbetrieb)

    Parallele Abarbeitung von Programminstanzen durch ProzesskonzeptVirtueller Speicher eigener 32-/64-Bit-AdressraumVirtueller Prozessor wird transparent zugeteilt und entzogenVirtuelle Ein-/Ausgabe-Gerte umlenkbar in Datei, Socket, . . .

    Isolation von Programminstanzen durch ProzesskonzeptAutomatische Speicherbereinigung bei ProzessendeErkennung/Vermeidung von Speicherzugriffen auf fremde Prozesse

    Partieller Schutz vor schwereren ProgrammierfehlernErkennung einiger ungltiger Speicherzugriffe (z. B. Zugriff auf Adresse 0)Erkennung einiger ungltiger Operationen (z. B. div/0)

    C-Programmierung ohne Betriebssystemplattform ; kein SchutzEin Betriebssystem schtzt weit weniger vor Programmierfehlern als z. B. Java.

    Selbst darauf mssen wir jedoch bei der C-Programmierung i. a. verzichten.

    Bei 8/16-Bit-C fehlt i. a. die fr Schutz erforderliche Hardware-Untersttzung.

    c kls SPiC (Teil B, SS 18) 4 Softwareschichten und Abstraktion Allgemein 47

    04-A

    bstr

    aktion

    :20

    18-0

    4-05

  • Beispiel: Fehlererkennung durch Betriebssystem

    Linux: Division durch 0

    1 #include 23

    4 int main(int argc, char** argv) {5 int a = 23;6 int b = 0;7

    8 b = 4711 / (a-23);9 printf("Ergebnis: %d\n", b);

    10

    11 return 0;12 }

    SPiCboard: Division durch 0

    #include #include

    void main() {int a = 23;int b = 0;sei();b = 4711 / (a-23);sb_7seg_showNumber(b);

    while(1){}}

    bersetzen und Ausfhren ergibt:gcc error-linux.c -o error-linux./error-linuxFloating point exception

    ; Programm wird abgebrochen.

    Ausfhren ergibt:

    ; Programm setztBerechnung fort

    mit falschen Daten.

    c kls SPiC (Teil B, SS 18) 4 Softwareschichten und Abstraktion Allgemein 48

    04-A

    bstr

    aktion

    :20

    18-0

    4-05

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor05-

    Spr

    achu

    eber

    blic

    k:20

    18-0

    2-21

  • Struktur eines C-Programms allgemein

    1 // include files2 #include . . .3

    4 // global variables5 . . . variable1 = . . .6

    7 // subfunction 18 . . . subfunction_1(. . .) {9 // local variables

    10 . . . variable1 = . . .11 // statements12 . . .13 }

    14 // subfunction n15 . . . subfunction_n(. . .) {1617 . . .18

    19 }20

    21 // main function22 . . . main(. . .) {2324 . . .25

    26 }

    Ein C-Programm besteht (blicherweise) ausMenge von globalen VariablenMenge von (Sub-)Funktionen

    Menge von lokalen VariablenMenge von Anweisungen

    Der Funktion main(), in der die Ausfhrung beginnt

    c kls SPiC (Teil B, SS 18) 5 Sprachberblick Grundstruktur eines C-Programms 51

    05-S

    prac

    hueb

    erbl

    ick:

    2018

    -02-

    21

  • Struktur eines C-Programms am Beispiel

    1 // include files2 #include 3

    4 // global variables5 LED nextLED = RED0;6

    7 // subfunction 18 LED lightLED(void) {9 if (nextLED

  • Bezeichner [=Java]

    1 // include files2 #include 3

    4 // global variables5 LED nextLED = RED0;6

    7 // subfunction 18 LED lightLED(void) {9 if (nextLED

  • Schlsselwrter [Java]

    1 // include files2 #include 3

    4 // global variables5 LED nextLED = RED0;6

    7 // subfunction 18 LED lightLED(void) {9 if (nextLED

  • Schlsselwrter in C99 [Handout]

    Referenz: Liste der Schlsselwrter (bis einschlielich C99)auto, _Bool, break, case, char, _Complex, const, continue, default,do, double, else, enum, extern, float, for, goto, if, _Imaginary,inline, int, long, register, restrict, return, short, signed,sizeof, static, struct, switch, typedef, union, unsigned, void,volatile, while

    c kls SPiC (Teil B, SS 18) 5 Sprachberblick Syntaktische Grundelemente 55

    05-S

    prac

    hueb

    erbl

    ick:

    2018

    -02-

    21

  • Literale [=Java]

    1 // include files2 #include 3

    4 // global variables5 LED nextLED = RED0;6

    7 // subfunction 18 LED lightLED(void) {9 if (nextLED

  • Anweisungen [=Java]

    1 // include files2 #include 3

    4 // global variables5 LED nextLED = RED0;6

    7 // subfunction 18 LED lightLED(void) {9 if (nextLED

  • Ausdrcke [=Java]

    1 // include files2 #include 3

    4 // global variables5 LED nextLED = RED0;6

    7 // subfunction 18 LED lightLED(void) {9 if (nextLED

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor06-

    Dat

    enty

    pen:

    2018

    -02-

    21

  • Was ist ein Datentyp? [ GDI, 03-2]

    Datentyp := (, )Literal Wert im Quelltext 56Konstante Bezeichner fr einen WertVariable Bezeichner fr Speicherplatz,

    der einen Wert aufnehmen kannFunktion Bezeichner fr Sequenz von Anweisungen,

    die einen Wert zurckgibt

    ; Literale, Konstanten, Variablen, Funktionen haben einen (Daten-)Typ

    Datentyp legt festReprsentation der Werte im SpeicherGre des Speicherplatzes fr VariablenErlaubte Operationen

    Datentyp wird festgelegtExplizit, durch Deklaration, Typ-Cast oder Schreibweise (Literale)Implizit, durch Auslassung (; int schlechter Stil!)

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Einfhrung 61

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Primitive Datentypen in C

    Ganzzahlen/Zeichen char, short, int, long, long long (C99)Wertebereich: implementierungsabhngig [ 6=Java]Es gilt: char short int long long long

    Jeweils als signed- und unsigned-Variante verfgbar

    Fliekommazahlen float, double, long doubleWertebereich: implementierungsabhngig [ 6=Java]Es gilt: float double long doubleAb C99 auch als _Complex-Datentypen verfgbar (fr komplexe Zahlen)

    Leerer Datentyp voidWertebereich:

    Boolescher Datentyp _Bool (C99)Wertebereich: {0, 1} ( letztlich ein Integertyp)Bedingungsausdrcke (z. B. if(. . .)) sind in C vom Typ int! [ 6=Java]

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Einfhrung 62

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Integertypen [Java][ GDI, 03-2]

    Integertyp Verwendung Literalformenchar kleine Ganzzahl oder Zeichen A, 65, 0x41, 0101short [int] Ganzzahl (int ist optional) s. o.int Ganzzahl natrlicher Gre s. o.long [int] groe Ganzzahl 65L, 0x41L, 0101Llong long [int] sehr groe Ganzzahl 65LL, 0x41LL, 0101LL

    Typ-Modifizierer werden vorangestellt Literal-Suffixsigned Typ ist vorzeichenbehaftet (Normalfall) -unsigned Typ ist vorzeichenlos Uconst Variable des Typs kann nicht verndert werden -

    Beispiele (Variablendefinitionen)char a = A; // char-Variable, Wert 65 (ASCII: A)const int b = 0x41; // int-Konstante, Wert 65 (Hex: 0x41)long c = 0L; // long-Variable, Wert 0unsigned long int d = 22UL; // unsigned-long-Variable, Wert 22

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Ganzahltypen: int und Co 63

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Integertypen: Gre und Wertebereich [ 6=Java]

    Die interne Darstellung (Bitbreite) ist implementierungsabhngig

    Datentyp-Breite in BitJava C-Standard gccIA32 gccIA64 gccAVR

    char 16 8 8 8 8short 16 16 16 16 16int 32 16 32 32 16long 64 32 32 64 32long long - 64 64 64 64

    Der Wertebereich berechnet sich aus der Bitbreitesigned (2Bits11) +(2Bits1 1)unsigned 0 +(2Bits 1)

    Hier zeigt sich die C-Philosophie: Effizienz durch Maschinennhe 314

    Die interne Reprsentation der Integertypen ist definiert durch die Hardware(Registerbreite, Busbreite, etc.). Das fhrt im Ergebnis zu effizientem Code.

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Ganzahltypen: int und Co 64

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Integertypen: Maschinennhe Problemnhe

    Problem: Breite (; Wertebereich) der C-Standardtypen istimplementierungsspezifisch 7 Maschinennhe

    Oft bentigt: Integertyp definierter Gre 7 ProblemnheWertebereich sicher, aber mglichst kompakt darstellen

    Register definierter Breite n bearbeiten

    Code unabhngig von Compiler und Hardware halten (; Portierbarkeit)

    Lsung: Modul stdint.hDefiniert Alias-Typen: intn_t und uintn_t fr n {8, 16, 32, 64}Wird vom Compiler-Hersteller bereitgestellt

    Wertebereich stdint.h-Typenuint8_t 0 255 int8_t 128 +127uint16_t 0 65.535 int16_t 32.768 +32.767uint32_t 0 4.294.967.295 int32_t 2.147.483.648 +2.147.483.647uint64_t 0 > 1, 8 1019 int64_t < 9, 2 1018 > +9, 2 1018

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Ganzahltypen: int und Co 65

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Typ-Aliase mit typedef [ 6=Java]

    Mit dem typedef-Schlsselwort definiert man einen Typ-Alias:typedef Typausdruck Bezeichner;

    Bezeichner ist nun ein alternativer Name fr TypausdruckKann berall verwendet werden, wo ein Typausdruck erwartet wird

    // stdint.h (avr-gcc)typedef unsigned char uint8_t;typedef unsigned int uint16_t;

    // stdint.h (x86-gcc, IA32)typedef unsigned char uint8_t;typedef unsigned short uint16_t;

    // main.c#include

    uint16_t counter = 0; // global 16-bit counter, range 0-65535 typedef uint8_t Register; // Registers on this machine are 8-bit

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Typ-Pseudonyme: typedef 66

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Typ-Aliase mit typedef (Forts.) [ 6=Java]

    Typ-Aliase ermglichen einfache problembezogene AbstraktionenRegister ist problemnher als uint8_t; Sptere nderungen (z. B. auf 16-Bit-Register) zentral mglichuint16_t ist problemnher als unsigned charuint16_t ist sicherer als unsigned char

    Definierte Bitbreiten sind bei der C-Entwicklung sehr wichtig!Groe Unterschiede zwischen Plattformen und Compilern; Kompatibilittsprobleme

    Um Speicher zu sparen, sollte immer der kleinstmglicheIntegertyp verwendet werden

    Regel: Bei der systemnahen Programmierung werdenTypen aus stdint.h verwendet!

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Typ-Pseudonyme: typedef 67

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Aufzhlungstypen mit enum [Java]

    Mit dem enum-Schlsselwort definiert man einen Aufzhlungstypber eine explizite Menge symbolischer Werte:

    enum Bezeichneropt { KonstantenListe } ;

    Beispiel

    Definition: enum eLED {RED0, YELLOW0, GREEN0, BLUE0,RED1, YELLOW1, GREEN1, BLUE1};

    Verwendung:enum eLED myLed = YELLOW0; // enum necessary here! sb_led_on(BLUE1);

    Vereinfachung der Verwendung durch typedef

    Definition: typedef enum eLED {RED0, YELLOW0, GREEN0, BLUE0,RED1, YELLOW1, GREEN1, BLUE1} LED;

    Verwendung: LED myLed = YELLOW0; // LED --> enum eLED

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Aufzhlungstypen: enum 68

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • enum 7 int [ 6=Java]

    Technisch sind enum-Typen Integers (int)enum-Konstanten werden von 0 an durchnummeriert

    typedef enum { RED0, // value: 0YELLOW0, // value: 1GREEN0, // value: 2 } LED;

    Es ist auch mglich, Werte direkt zuzuweisen

    typedef enum { BUTTON0 = 4, BUTTON1 = 8 } BUTTON;

    Man kann sie verwenden wie ints (z. B. mit ihnen rechnen)

    sb_led_on(RED0 + 2); // -> LED GREEN0 is onsb_led_on(1); // -> LED YELLOW0 is onfor( int led = RED0, led

  • Fliekommatypen [Java]

    Fliekommatyp Verwendung Literalformenfloat einfache Genauigkeit ( 7 St.) 100.0F, 1.0E2Fdouble doppelte Genauigkeit ( 15 St.) 100.0, 1.0E2long double erweiterte Genauigkeit 100.0L 1.0E2L

    Genauigkeit / Wertebereich sind implementierungsabhngig [6=Java]Es gilt: float double long doublelong double und double sind auf Effizienz durch

    Maschinennhe 314vielen Plattformen identisch

    Fliekommazahlen + C-Plattform = $$$Oft keine Hardwareuntersttzung fr float-Arithmetik; sehr teure Emulation in Software (langsam, viel zustzlicher Code)

    Speicherverbrauch von float- und double-Variablen ist sehr hoch; mindestens 32/64 Bit (float/double)

    Regel: Bei der -Controller-Programmierung istauf Fliekommaarithmetik zu verzichten!

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Fliekommazahltypen: float und double 610

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Zeichen 7 Integer [Java]

    Zeichen sind in C ebenfalls Ganzzahlen (Integers) 63char gehrt zu den Integer-Typen (blicherweise 8 Bit = 1 Byte)

    Reprsentation erfolgt durch den ASCII-Code 6127-Bit-Code 7 128 Zeichen standardisiert(die verbleibenden 128 Zeichen werden unterschiedlich interpretiert)Spezielle Literalform durch HochkommataA 7 ASCII-Code von ANichtdruckbare Zeichen durch Escape-Sequenzen

    Tabulator \tZeilentrenner \nBackslash \\

    Zeichen 7 Integer ; man kann mit Zeichen rechnenchar b = A + 1; // b: B

    int lower(int ch) { // lower(X): xreturn ch + 0x20;

    }

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Zeichen und Zeichenketten 611

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • ASCII-Code-Tabelle (7 Bit)

    ASCII 7 American Standard Code for Information InterchangeSPiC

    NUL00

    SOH01

    STX02

    ETX03

    EOT04

    ENQ05

    ACK06

    BEL07

    BS08

    HT09

    NL0A

    VT0B

    NPOC

    CR0D

    SO0E

    SI0F

    DLE10

    DC111

    DC212

    DC313

    DC414

    NAK15

    SYN16

    ETB17

    CAN18

    EM19

    SUB1A

    ESC1B

    FS1C

    GS1D

    RS1E

    US1F

    SP20

    !21

    "22

    #23

    $24

    %25

    &26

    27

    (28

    )29

    *2A

    +2B

    ,2C

    -2D

    .2E

    /2F

    030

    131

    232

    333

    434

    535

    636

    737

    838

    939

    :3A

    ;3B

    3E

    ?3F

    @40

    A41

    B42

    C43

    D44

    E45

    F46

    G47

    H48

    I49

    J4A

    K4B

    L4C

    M4D

    N4E

    O4F

    P50

    Q51

    R52

    S53

    T54

    U55

    V56

    W57

    X58

    Y59

    Z5A

    [5B

    \5C

    ]5D

    ^5E

    _5F

    60

    a61

    b62

    c63

    d64

    e65

    f66

    g67

    h68

    i69

    j6A

    k6B

    l6C

    m6D

    n6E

    o6F

    p70

    q71

    r72

    s73

    t74

    u75

    v76

    w77

    x78

    y79

    z7A

    {7B

    |7C

    }7D

    ~7E

    DEL7F

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Zeichen und Zeichenketten 612

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • Zeichenketten (Strings) [ 6=Java]

    Ein String ist in C ein Feld (Array) von ZeichenReprsentation: Folge von Einzelzeichen, terminiert durch

    (letztes Zeichen): NUL (ASCII-Wert 0)Speicherbedarf: (Lnge + 1) Bytes

    Spezielle Literalform durch doppelte Hochkommata:

    "Hi!" 7 H i ! 0 abschlieendes 0-Byte

    Beispiel (Linux)

    #include

    char string[] = "Hello, World!\n";

    int main(void) {printf("%s", string);return 0;

    }

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Zeichen und Zeichenketten 613

    06-D

    aten

    type

    n:20

    18-0

    2-21

    Zeichenketten brauchen vergleichswei-se viel Speicher und grere Ausga-begerte (z. B. LCD-Display).; Bei der C-Programmierung spie-len sie nur eine untergeordnete Rolle.

  • Ausblick: Komplexe Datentypen

    Aus einfachen Datentypen lassen sich (rekursiv) auchkomplexe(re) Datentypen bilden

    Felder (Arrays) Sequenz von Elementen gleichen Typs [Java]

    int intArray[4]; // allocate array with 4 elementsintArray[0] = 0x4711; // set 1st element (index 0)

    Zeiger vernderbare Referenzen auf Variablen [ 6=Java]

    int a = 0x4711; // a: 0x4711int *b = &a; // b: -->a (memory location of a)int c = *b; // pointer dereference (c: 0x4711)

    *b = 23; // pointer dereference (a: 23)

    Strukturen Verbund von Elementen bel. Typs [ 6=Java]

    struct Point { int x; int y; };struct Point p; // p is Point variablep.x = 0x47; // set x-componentp.y = 0x11; // set y-component

    Wir betrachten diese detailliert in spteren Kapiteln

    c kls SPiC (Teil B, SS 18) 6 Einfache Datentypen Ausblick: Felder und Zeiger, Verbundtypen 614

    06-D

    aten

    type

    n:20

    18-0

    2-21

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor07-

    Ope

    rato

    ren:

    2018

    -02-

    21

  • Arithmetische Operatoren [=Java]

    Stehen fr alle Ganzzahl- und Fliekommatypen zur Verfgung

    + Addition Subtraktion Multiplikation/ Divisionunres negatives Vorzeichen (z. B. a) ; Multiplikation mit 1unres + positives Vorzeichen (z. B. +3) ; kein Effekt

    Zustzlich nur fr Ganzzahltypen:

    % Modulo (Rest bei Division)

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Arithmetische Operatoren 71

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Inkrement-/Dekrement-Operatoren [=Java][ GDI, 07-02]

    Stehen fr Ganzzahltypen und Zeigertypen zur Verfgung

    ++ Inkrement (Erhhung um 1) Dekrement (Verminderung um 1)

    Linksseitiger Operator (Prfix) ++x bzw. --xErst wird der Inhalt von x verndertDann wird der (neue) Inhalt von x als Ergebnis geliefert

    Rechtsseitiger Operator (Postfix) x++ bzw. x--Erst wird der (alte) Inhalt von x als Ergebnis geliefertDann wird der Inhalt von x verndert

    Beispielea = 10;b = a++; // b: 10, a: 11c = ++a; // c: 12, a: 12

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Arithmetische Operatoren 72

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Vergleichsoperatoren [=Java][ GDI, 03-09]

    Vergleichen von zwei Ausdrcken

    < kleiner grer>= grer gleich== gleich (zwei Gleichheitszeichen!)! = ungleich

    Beachte: Ergebnis ist vom Typ int [ 6=Java]Ergebnis: falsch 7 0

    wahr 7 1Man kann mit dem Ergebnis rechnen

    Beispieleif (a >= 3) { }if (a == 3) { }return a * (a > 0); // return 0 if a is negative

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Relationale Operatoren 73

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Logische Operatoren [Java][ GDI, 03-10]

    Verknpfung von Wahrheitswerten (wahr / falsch), kommutativ

    && und wahr && wahr wahr(Konjunktion) wahr && falsch falsch

    falsch && falsch falsch

    || oder wahr || wahr wahr(Disjunktion) wahr || falsch wahr

    falsch || falsch falsch

    ! nicht ! wahr falsch(Negation, unr) ! falsch wahr

    Beachte: Operanden und Ergebnis sind vom Typ int [ 6=Java]Operanden(Eingangsparameter):

    0 7 falsch6=0 7 wahr

    Ergebnis: falsch 7 0wahr 7 1

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Relationale Operatoren 74

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Logische Operatoren Auswertung [=Java]

    Die Auswertung eines logischen Ausdrucks wird abgebrochen,sobald das Ergebnis feststeht

    Sei int a = 5; int b = 3; int c = 7;

    a > b

    1

    || a > c

    ?

    1

    wird nicht ausgewertet, da dererste Term bereits wahr ergibt

    a > c

    0

    && a > b

    ?

    0

    wird nicht ausgewertet, da dererste Term bereits falsch ergibt

    Kann berraschend sein, wenn Teilausdrcke Nebeneffekte haben

    int a = 5; int b = 3; int c = 7;if ( a > c && !func(b) ) { } // func() will not be called

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Relationale Operatoren 75

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Zuweisungsoperatoren [=Java]

    Allgemeiner Zuweisungsoperator (=)

    Zuweisung eines Wertes an eine Variable

    Beispiel: a = b + 23

    Arithmetische Zuweisungsoperatoren (+=, =, . . . )

    Abgekrzte Schreibweise zur Modifikation des Variablenwerts

    Beispiel: a += 23 ist quivalent zu a = a + 23

    Allgemein: a op= b ist quivalent zu a = a op b

    fr op { +,, , %, ,&, , | }Beispiele

    int a = 8;a += 8; // a: 16a %= 3; // a: 1

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Zuweisungsoperatoren 76

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Zuweisungen sind Ausdrcke!

    Zuweisungen knnen in komplexere Audrcke geschachtelt werdenDas Ergebnis eines Zuweisungsausdrucks ist der zugewiesene Wert

    int a, b, c;a = b = c = 1; // c: 1, b: 1, a: 1

    Die Verwendung von Zuweisungen in beliebigen Ausdrcken fhrtzu Nebeneffekten, die nicht immer offensichtlich sind

    a += b += c; // Value of a and b?

    Besonders gefhrlich: Verwendung von = statt ==

    In C sind Wahrheitswerte Integers: 0 7 falsch, /0 7 wahr

    Typischer Anfngerfehler in Kontrollstrukturen:if (a = 6) { } else { } // BUG: if-branch is always taken!!!

    Compiler beanstandet das Konstrukt nicht, es handelt sich umeinen gltigen Ausdruck! ; Fehler wird leicht bersehen!

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Zuweisungsoperatoren 77

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Bitoperationen [=Java]

    Bitweise Verknpfung von Ganzzahltypen, kommutativ

    & bitweises Und 1& 1 1(Bit-Schnittmenge) 1& 0 0

    0& 0 0

    | bitweises Oder 1 | 1 1(Bit-Vereinigungsmenge) 1 | 0 1

    0 | 0 0

    bitweises Exklusiv-Oder 1 1 0(Bit-Antivalenz) 1 0 1

    0 0 0

    bitweise Inversion 1 0(Einerkomplement, unr) 0 1

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Bitoperatoren 78

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Bitoperationen (Forts.) [=Java]

    Schiebeoperationen auf Ganzzahltypen, nicht kommutativ

    > bitweises Rechtsschieben (links werden 0-Bits nachgefllt)

    Beispiele (x sei vom Typ uint8_t)

    Bit# 7 6 5 4 3 2 1 0

    x=156 1 0 0 1 1 1 0 0 0x9c

    ~x 0 1 1 0 0 0 1 1 0x63

    7 0 0 0 0 0 1 1 1 0x07

    x | 7 1 0 0 1 1 1 1 1 0x9f

    x & 7 0 0 0 0 0 1 0 0 0x04

    x ^ 7 1 0 0 1 1 0 1 1 0x9B

    x > 1 0 1 0 0 1 1 1 0 0x4e

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Bitoperatoren 79

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Bitoperationen Anwendung

    Durch Verknpfung lassen sich gezielt einzelne Bits setzen/lschen

    Bit# 7 6 5 4 3 2 1 0

    PORTD ? ? ? ? ? ? ? ? Bit 7 soll verndert werden, dieanderen Bits jedoch erhalten bleiben!

    0x80 1 0 0 0 0 0 0 0 Setzen eines Bits durch Ver-odern mitMaske, in der nur das Zielbit 1 istPORTD |= 0x80 1 ? ? ? ? ? ? ?

    ~0x80 0 1 1 1 1 1 1 1 Lschen eines Bits durch Ver-undenmit Maske, in der nur das Zielbit 0 istPORTD &= ~0x80 0 ? ? ? ? ? ? ?

    0x08 0 0 0 0 1 0 0 0 Invertieren eines Bits durch Ver-xodernmit Maske, in der nur das Zielbit 1 istPORTD ^= 0x08 ? ? ? ? ? ? ?

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Bitoperatoren 710

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Bitoperationen Anwendung (Forts.)

    Bitmasken werden gerne als Hexadezimal-Literale angegeben

    Bit# 7 6 5 4 3 2 1 0

    0x8f 1 0 0 0

    8

    1 1 1 1

    f

    Jede Hex-Ziffer reprsentiert genau einHalb-Byte (Nibble) ; Verstndlichkeit

    Fr Dezimal-Denker bietet sich die Linksschiebe-Operation an

    PORTD |= (1

  • Bedingte Auswertung [Java][ GDI, 07-10]

    Formulierung von Bedingungen in AusdrckenAusdruck1 ? Ausdruck2 : Ausdruck3

    Zunchst wird Ausdruck1 ausgewertetAusdruck1 6= 0 (wahr) ; Ergebnis ist Ausdruck2Ausdruck1 = 0 (falsch) ; Ergebnis ist Ausdruck3

    ?: ist der einzige ternre (dreistellige) Operator in C

    Beispiel

    int abs(int a) {// if (a

  • Sequenzoperator [ 6=Java]

    Reihung von AusdrckenAusdruck1 , Ausdruck2

    Zunchst wird Ausdruck1 ausgewertet; Nebeneffekte von Ausdruck1 werden sichtbarErgebnis ist der Wert von Ausdruck2

    Verwendung des Komma-Operators ist selten erforderlich!(Prprozessor-Makros mit Nebeneffekten)

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Weitere Operatoren 713

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Vorrangregeln bei Operatoren [Java][ GDI, 03-07]

    Klasse Operatoren Assoziativitt

    1 Funktionsaufruf, FeldzugriffStrukturzugriffPost-Inkrement/-Dekrement

    x() x[]

    x.y x->y

    x++ x--

    links rechts

    2 Pr-Inkrement/-Dekrementunre OperatorenAdresse, Verweis (Zeiger)Typkonvertierung (cast)Typgre

    ++x --x

    +x -x ~x !x

    & *()x

    sizeof(x)

    rechts links

    3 Multiplikation, Division, Modulo * / % links rechts4 Addition, Subtraktion + - links rechts5 Bitweises Schieben >> = links rechts7 Gleichheitsoperatoren == != links rechts8 Bitweises UND & links rechts9 Bitweises OR | links rechts

    10 Bitweises XOR ^ links rechts11 Konjunktion && links rechts12 Disjunktion || links rechts13 Bedingte Auswertung ?:= rechts links14 Zuweisung = op= rechts links15 Sequenz , links rechts

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Ausdrcke 714

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Typumwandlung in Ausdrcken

    Eine Operation wird mindestens mit int-Wortbreite berechnetshort- und signed char-Operanden werden implizit aufgewertet( Integer Promotion)Erst das Ergebnis wird auf den Zieldatentyp abgeschnitten/erweitert

    int8_t a=100, b=3, c=4, res; // range: -128 --> +127

    res

    int8_t: 75

    = a

    int: 100

    * b

    int: 3

    int: 300

    / c

    int: 4

    ;

    int: 75

    // promotion to int: 300 fits in!

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Ausdrcke 715

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Typumwandlung in Ausdrcken (Forts.)

    Generell wird die grte beteiligte Wortbreite verwendet 63

    int8_t a=100, b=3, res; // range: -128 --> +127int32_t c=4; // range: -2147483648 --> +2147483647

    res

    int8_t: 75

    = a

    int: 100

    * b

    int: 3

    int: 300

    int32_t: 300

    / c;

    int32_t: 75

    // promotion to int32_t

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Ausdrcke 716

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Typumwandlung in Ausdrcken (Forts.)

    Fliekomma-Typen gelten dabei als grer als Ganzzahl-Typen

    Alle Fliekomma-Operationen werden mindestens mitdouble-Wortbreite berechnet

    int8_t a=100, b=3, res; // range: -128 --> +127

    res

    int8_t: 75

    = a

    int: 100

    * b

    int: 3

    int: 300

    double: 300.0

    / 4.0f

    double 4.0

    ;

    double: 75.0

    // promotion to double

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Ausdrcke 717

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Typumwandlung in Ausdrcken (Forts.)

    unsigned-Typen gelten dabei als grer als signed-Typen

    int s = -1, res; // range: -32768 --> +32767unsigned u = 1; // range: 0 --> 65535

    res

    int: 0

    = s

    unsigned: 65535

    < u;

    unsigned: 0

    // promotion to unsigned: -1 --> 65535

    ; berraschende Ergebnisse bei negativen Werten!; Mischung von signed- und unsigned-Operanden vermeiden!

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Ausdrcke 718

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • Typumwandlung in Ausdrcken Typ-Casts

    Durch den Typ-Cast-Operator kann man einen Ausdruckgezielt in einen anderen Typ konvertieren

    (Typ) Ausdruck

    int s = -1, res; // range: -32768 --> +32767unsigned u = 1; // range: 0 --> 65535

    res

    int: 1

    = s < (int) u

    int: 1

    ;

    int: 1

    // cast u to int

    c kls SPiC (Teil B, SS 18) 7 Operatoren und Ausdrcke Ausdrcke 719

    07-O

    pera

    tore

    n:20

    18-0

    2-21

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor08-

    Kon

    trol

    lstr

    uktu

    ren:

    2018

    -04-

    05

  • Bedingte Anweisung [=Java][ GDI, 07-02]

    if-Anweisung (bedingte Anweisung)

    if (Bedingung)Anweisung;

    ja nein

    Bedingung

    Anweisung

    if-else-Anweisung (einfache Verzweigung)

    if (Bedingung)Anweisung1;

    else

    Anweisung2;

    ja nein

    Bedingung

    Anweisung_1 Anweisung_2

    if-else-if-Kaskade (mehrfache Verzweigung)

    if (Bedingung1)Anweisung1;

    else if (Bedingung2)Anweisung2;

    else

    Anweisung3;Anweisung_2

    Bedingung_2

    Bedingung_1

    ja nein

    ja nein

    Anweisung_3Anweisung_1

    c kls SPiC (Teil B, SS 18) 8 Kontrollstrukturen Verzweigungen 81

    08-K

    ontr

    ollstr

    uktu

    ren:

    2018

    -04-

    05

  • Fallunterscheidung [=Java]

    switch-Anweisung (Fallunterscheidung)Alternative zur if-Kaskade bei Test auf Ganzzahl-Konstanten

    verschiedene Flle in Abhngigkeit von einem ganzzahligen Ausdruck

    Wert1 Wert2

    Anw. 1 Anw. 2 Anw. n

    sonst

    Anw. x

    ganzzahliger Ausdruck = ?

    switch (Ausdruck) {case Wert1:

    Anweisung1;break;

    case Wert2:Anweisung2;break;

    case Wertn:

    Anweisungn;break;

    default:

    Anweisungx;}

    c kls SPiC (Teil B, SS 18) 8 Kontrollstrukturen Verzweigungen 82

    08-K

    ontr

    ollstr

    uktu

    ren:

    2018

    -04-

    05

  • Abweisende und nicht-abweisende Schleife [=Java]

    Abweisende Schleife[ GDI, 08-05]

    while-SchleifeNull- oder mehrfach ausgefhrt

    Bedingung

    Anweisung

    Nicht-abweisende Schleife[ GDI, 08-07]

    do-while-SchleifeEin- oder mehrfach ausgefhrt

    Bedingung

    Anweisung

    while(Bedingung)Anweisung;

    do

    Anweisung;while(Bedingung);

    while (sb_button_getState(BUTTON0)

    == BUTTONSTATE_RELEASED) { // do unless button press.

    }

    do { // do at least once

    } while (sb_button_getState(BUTTON0)

    == BUTTONSTATE_RELEASED);

    c kls SPiC (Teil B, SS 18) 8 Kontrollstrukturen Schleifen 83

    08-K

    ontr

    ollstr

    uktu

    ren:

    2018

    -04-

    05

  • Zhlende Schleife [=Java][ GDI, 08-02]

    for-Schleife (Laufanweisung)

    for (Startausdruck;Endausdruck;InkrementAusdruck)

    Anweisung;

    v Startausdruck (Inkrement) Endausdruck

    Anweisung

    Beispiel (bliche Verwendung: n Ausfhrungen mit Zhlvariable)

    uint8_t sum = 0; // calc sum 1+...+10for (uint8_t n = 1; n < 11; n++) {

    sum += n;}sb_7seg_showNumber( sum );

    AnmerkungenDie Deklaration von Variablen (n) im Startausdruckist erst ab C99 mglich

    Die Schleife wird wiederholt, solange Endausdruck 6= 0 (wahr); die for-Schleife ist eine verkappte while-Schleife

    c kls SPiC (Teil B, SS 18) 8 Kontrollstrukturen Schleifen 84

    08-K

    ontr

    ollstr

    uktu

    ren:

    2018

    -04-

    05

  • Schleifensteuerung [=Java][ GDI, 08-09]

    Die continue-Anweisung beendet den aktuellen Schleifendurchlauf; Schleife wird mit dem nchsten Durchlauf fortgesetzt

    for( uint8_t led=0; led < 8; ++led ) {if( led == RED1 ) {continue; // skip RED1

    }sb_led_on(led);

    }

    0

    R0

    1

    Y0

    2

    G0

    3

    B0

    4

    R1

    5

    Y1

    6

    G1

    7

    B1

    Die break-Anweisung verlsst die (innerste) Schleife; Programm wird nach der Schleife fortgesetzt

    for( uint8_t led=0; led < 8; ++led ) {if( led == RED1 ) {break; // break at RED1

    }sb_led_on(led);

    }

    0

    R0

    1

    Y0

    2

    G0

    3

    B0

    4

    R1

    5

    Y1

    6

    G1

    7

    B1

    c kls SPiC (Teil B, SS 18) 8 Kontrollstrukturen Schleifen 85

    08-K

    ontr

    ollstr

    uktu

    ren:

    2018

    -04-

    05

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor09-

    Funk

    tion

    en:20

    18-0

    2-21

  • Was ist eine Funktion?

    Funktion := Unterprogramm [ GDI, 11-01]Programmstck (Block) mit einem BezeichnerBeim Aufruf knnen Parameter bergeben werdenBei Rckkehr kann ein Rckgabewert zurckgeliefert werden

    Funktionen sind elementare ProgrammbausteineGliedern umfangreiche Aufgaben in kleine, beherrschbare KomponentenErmglichen die einfache Wiederverwendung von KomponentenErmglichen den einfachen Austausch von KomponentenVerbergen Implementierungsdetails (Black-Box-Prinzip)

    Funktion 7 Abstraktion 41Bezeichner und Parameter abstrahieren

    Vom tatschlichen ProgrammstckVon der Darstellung und Verwendung von Daten

    Ermglicht schrittweise Abstraktion und Verfeinerung

    c kls SPiC (Teil B, SS 18) 9 Funktionen Einfhrung 91

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Beispiel

    Funktion (Abstraktion) sb_led_set_all_leds()#include void main() {sb_led_set_all_leds( 0xaa );

    0 1 2 3 4 5 6 7

    while(1) {}}

    Implementierung in der libspicboardvoid sb_led_set_all_leds(uint8_t setting) Sichtbar: Bezeichner und

    formale Paramter

    {uint8_t i = 0;for (i = 0; i < 8; i++) {if (setting & (1

  • Funktionsdefinition [Java]

    Syntax: Typ Bezeichner ( FormaleParamopt ) {Block}Typ Typ des Rckgabewertes der Funktion, [=Java]

    void falls kein Wert zurckgegeben wird

    Bezeichner Name, unter dem die Funktion 53aufgerufen werden kann [=Java]

    FormaleParamopt Liste der formalen Parameter:Typ1 Bez1 opt , . . ., Typn Bezn opt [=Java](Parameter-Bezeichner sind optional)void, falls kein Parameter erwartet wird [ 6=Java]

    {Block} Implementierung; formale Parameterstehen als lokale Variablen bereit [=Java]

    Beispiele:

    int max(int a, int b) {if (a > b) return a;return b;

    }

    void wait(void) {volatile uint16_t w;for (w = 0; w < 0xffff; w++) {}

    }

    c kls SPiC (Teil B, SS 18) 9 Funktionen Definition 93

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Funktionsaufruf [=Java]

    Syntax: Bezeichner ( TatParam )Bezeichner Name der Funktion,

    in die verzweigt werden soll [=Java]

    TatParam Liste der tatschlichen Parameter (bergebene [=Java]Werte, muss anzahl- und typkompatibel seinzur Liste der formalen Parameter)

    Beispiele:

    int x = max(47, 11);

    Aufruf der max()-Funktion. 47 und 11 sinddie tatschlichen Parameter, welche nunden formalen Parametern a und b der max()-Funktion ( 93 ) zugewiesen werden.

    char text[] = "Hello, World";int x = max(47, text);

    Fehler: text ist nicht int-konvertierbar (tatschlicher Parameter 2 passt nicht zuformalem Parameter b 93 )

    max(48, 12); Der Rckgabewert darf ignoriert werden(was hier nicht wirklich Sinn ergibt)

    c kls SPiC (Teil B, SS 18) 9 Funktionen Aufruf 94

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Funktionsaufruf Parameterbergabe [ 6=Java]

    Generelle Arten der Parameterbergabe [ GDI, 14-01]Call-by-value Die formalen Parameter sind Kopien der tatschli-

    chen Parameter. nderungen in den formalen Para-metern gehen mit Verlassen der Funktion verloren.Dies ist der Normalfall in C.

    Call-by-reference Die formalen Parameter sind Verweise (Referenzen)auf die tatschlichen Parameter. nderungen in denformalen Parametern betreffen auch die tatschli-chen Parameter.In C nur indirekt ber Zeiger mglich. 135

    Des weiteren giltArrays werden in C immer by-reference bergeben [=Java]

    Die Auswertungsreihenfolge der Parameter ist undefiniert! [6=Java]

    c kls SPiC (Teil B, SS 18) 9 Funktionen Aufruf 95

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Funktionsaufruf Rekursion [=Java]

    Funktionen knnen sich auch selber aufrufen (Rekursion)int fak(int n) {if (n > 1)return n * fak(n - 1);

    return 1;}

    Rekursive Definition der Fakulttsfunktion.

    Ein anschauliches, aber mieses Beispielfr den Einsatz von Rekursion!

    Rekursion 7 $$$Rekursion verursacht erhebliche Laufzeit- und Speicherkosten!Pro Rekursionsschritt muss:

    Speicher bereit gestellt werden fr Rcksprungadresse,Parameter und alle lokalen Variablen

    Parameter kopiert und ein Funktionsaufruf durchgefhrt werden

    Regel: Bei der systemnahen Softwareentwicklung wirdmglichst auf Rekursion verzichtet!

    c kls SPiC (Teil B, SS 18) 9 Funktionen Aufruf 96

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Funktionsdeklaration [ 6=Java]

    Funktionen mssen vor ihrem ersten Aufruf im Quelltextdeklariert ( 7 bekannt gemacht) worden sein

    Eine voranstehende Definition beinhaltet bereits die DeklarationAnsonsten (falls die Funktion weiter hinten im Quelltext oder in einemanderen Modul definiert wird) muss sie explizit deklariert werden

    Syntax: Bezeichner ( FormaleParam ) ;

    Beispiel:// Deklaration durch Definitionint max(int a, int b) {if (a > b) return a;return b;

    }

    void main(void) {int z = max(47, 11);

    }

    // Explizite Deklarationint max(int, int);

    void main(void) {int z = max(47, 11);

    }

    int max(int a, int b) {if (a > b) return a;return b;

    }

    c kls SPiC (Teil B, SS 18) 9 Funktionen Deklaration 97

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Funktionsdeklaration (Forts.) [ 6=Java]

    Funktionen mssen sollten vor ihrem ersten Aufruf im Quelltextdeklariert ( 7 bekannt gemacht) worden sein

    Achtung: C erzwingt dies nicht!Es ist erlaubt nicht-deklarierte Funktionen aufzurufen( implizite Deklaration)Derartige Aufrufe sind jedoch nicht typsicher

    Compiler kennt die formale Parameterliste nicht; kann nicht prfen, ob die tatschlichen Parameter passenMan kann irgendwas bergeben

    Moderne Compiler generieren immerhin eine Warnung; Warnungen des Compilers immer ernst nehmen!

    c kls SPiC (Teil B, SS 18) 9 Funktionen Deklaration 98

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Funktionsdeklaration (Forts.) [ 6=Java]

    Funktionen mssen sollten vor ihrem ersten Aufruf im Quelltextdeklariert ( 7 bekannt gemacht) worden sein

    Beispiel:

    1 #include 2

    3 int main(void) {4 double d = 47.11;5 foo(d);6 return 0;7 }8

    9 void foo(int a, int b) {10 printf("foo: a:%d, b:%d\n", a, b);11 }

    5 Funktion foo() ist nicht deklariert ; der Compiler warnt, aber akzeptiertbeliebige tatschliche Parameter

    9 foo() ist definiert mit den formalen Parmetern (int, int). Was immer antatschlichen Parametern bergeben wurde, wird entsprechend interpretiert!

    10 Was wird hier ausgegeben?

    c kls SPiC (Teil B, SS 18) 9 Funktionen Deklaration 98

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • Funktionsdeklaration (Forts.) [ 6=Java]

    Funktionen mssen sollten vor ihrem ersten Aufruf im Quelltextdeklariert ( 7 bekannt gemacht) worden sein

    Eine Funktion, die mit leerer formaler Parameterliste deklariertwurde, akzeptiert ebenfalls beliebige Parameter ; keine TypsicherheitIn diesem Fall warnt der Compiler nicht! Die Probleme bleiben!

    Beispiel:

    #include

    void foo(); // "open" declaration

    int main(void) {double d = 47.11;foo(d);return 0;

    }

    void foo(int a, int b) {printf("foo: a:%d, b:%d\n", a, b);

    }

    c kls SPiC (Teil B, SS 18) 9 Funktionen Deklaration 99

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

    Funktion foo wurde mit leererformaler Parameterliste deklariert; dies ist formal ein gltigerAufruf!

  • Funktionsdeklaration (Forts.) [ 6=Java]

    Funktionen mssen sollten vor ihrem ersten Aufruf im Quelltextdeklariert ( 7 bekannt gemacht) worden sein

    Eine Funktion, die mit leerer formaler Parameterliste deklariertwurde, akzeptiert ebenfalls beliebige Parameter ; keine TypsicherheitIn diesem Fall warnt der Compiler nicht! Die Probleme bleiben!

    Achtung: VerwechslungsgefahrIn Java deklariert void foo() eine parameterlose Methode

    In C muss man dafr void foo(void) schreiben 93

    In C deklariert void foo() eine offene FunktionDas macht nur in (sehr seltenen) Ausnahmefllen Sinn!Schlechter Stil ; Punktabzug

    Regel: Funktionen werden stets vollstndig deklariert!

    c kls SPiC (Teil B, SS 18) 9 Funktionen Deklaration 99

    09-F

    unkt

    ione

    n:20

    18-0

    2-21

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor10-

    Var

    iabl

    en:20

    18-0

    2-21

  • Variablendefinition [Java]

    Variable := Behlter fr Werte (7 Speicherplatz)

    Syntax (Variablendefinition):SKopt Typopt Bez1 [ = Ausdr1]opt [, Bez2 [ = Ausdr2]opt , . . .]opt ;

    SKopt Speicherklasse der Variable, [Java]auto, static, oder leer

    Typ Typ der Variable, [=Java]int falls kein Typ angegeben wird [ 6=Java]( 7 schlechter Stil!)

    Bezi Name der Variable [=Java]

    Ausdri Ausdruck fr die initiale Wertzuweisung;wird kein Wert zugewiesen so ist der Inhaltvon nicht-static-Variablen undefiniert [ 6=Java]

    c kls SPiC (Teil B, SS 18) 10 Variablen Einfhrung 101

    10-V

    aria

    blen

    :20

    18-0

    2-21

  • Variablendefinition (Forts.)

    Variablen knnen an verschiedenen Positionen definiert werdenGlobal auerhalb von Funktionen,

    blicherweise am Kopf der Datei

    Lokal zu Beginn eines { Blocks }, C89direkt nach der ffnenden Klammer

    Lokal berall dort, wo eine Anweisung stehen darf C99

    int a = 0; // a: globalint b = 47; // b: global

    void main() {int a = b; // a: local to function, covers global aprintf("%d", a);int c = 11; // c: local to function (C99 only!)for(int i=0; i

  • berblick: Teil B Einfhrung in C

    3 Java versus C

    4 Softwareschichten und Abstraktion

    5 Sprachberblick

    6 Einfache Datentypen

    7 Operatoren und Ausdrcke

    8 Kontrollstrukturen

    9 Funktionen

    10 Variablen

    11 Prprozessor11-

    Pra

    epro

    zess

    or:20

    18-0

    2-21

  • Der C-Prprozessor [6=Java]

    Bevor eine C-Quelldatei bersetzt wird, wird sie zunchst durcheinen Makro-Prprozessor bearbeitet

    Historisch ein eigenstndiges Programm (CPP = C PreProcessor)Heutzutage in die blichen Compiler integriert

    Der CPP bearbeitet den Quellcode durch TexttransformationAutomatische Transformationen (Aufbereiten des Quelltextes)

    Kommentare werden entferntZeilen, die mit \ enden, werden zusammengefgt

    Steuerbare Transformationen (durch den Programmierer)Prprozessor-Direktiven werden evaluiert und ausgefhrtPrprozessor-Makros werden expandiert

    c kls SPiC (Teil B, SS 18) 11 Prprozessor Einfhrung 111

    11-P

    raep

    roze

    ssor

    :20

    18-0

    2-21

  • Prprozessor-Direktiven [ 6=Java]

    Prprozessor-Direktive := Steueranweisung an den Prprozessor#include Inklusion: Fgt den Inhalt von Datei an der aktuellen

    Stelle in den Token-Strom ein.

    #define Makro Ersetzung Makrodefinition: Definiert ein Prprozessor-MakroMakro. In der Folge wird im Token-Strom jedesAuftreten des Wortes Makro durch Ersetzungsubstituiert. Ersetzung kann auch leer sein.

    #if(Bedingung),#elif, #else, #endif

    Bedingte bersetzung: Die folgenden Code-Zeilen werdenin Abhngigkeit von Bedingung dem Compiler berreichtoder aus dem Token-Strom entfernt.

    #ifdef Makro,#ifndef Makro

    Bedingte bersetzung in Abhngigkeit davon, ob Makro(z. B. mit #define) definiert wurde.

    #error Text Abbruch: Der weitere bersetzungsvorgang wird mit derFehlermeldung Text abgebrochen.

    Der Prprozessor definiert letztlich eine eingebettete Meta-Sprache.Die Prprozessor-Direktiven (Meta-Programm) verndern dasC-Programm (eigentliches Programm) vor dessen bersetzung.

    c kls SPiC (Teil B, SS 18) 11 Prprozessor Einfhrung 112

    11-P

    raep

    roze

    ssor

    :20

    18-0

    2-21

  • Prprozessor Verwendungsbeispiele [ 6=Java]

    Einfache Makro-DefinitionenLeeres Makro (Flag) #define USE_7SEG

    Quelltext-Konstante #define NUM_LEDS (4)

    Prprozessor-Anweisungenwerden nicht mit einemStrichpunkt abgeschlossen!

    Inline-Funktion #define SET_BIT(m, b) (m | (1 (4)mask = SET_BIT(mask, i); // SET_BIT(mask, i) --> (mask | (1

    #ifdef USE_7SEGsb_show_HexNumber(mask); // -->

    #endif

    }

    c kls SPiC (Teil B, SS 18) 11 Prprozessor Verwendung 113

    11-P

    raep

    roze

    ssor

    :20

    18-0

    2-21

  • Prprozessor Gefahren [6=Java]

    Funktionshnliche Makros sind keine Funktionen!Parameter werden nicht evaluiert, sondern textuell eingefgtDas kann zu unangenehmen berraschungen fhren#define POW2(a) 1

  • Systemnahe Programmierungin C (SPiC)

    Teil C Systemnahe Softwareentwicklung

    Jrgen Kleinder, Daniel Lohmann, Volkmar Sieh

    Lehrstuhl fr Informatik 4Verteilte Systeme und Betriebssysteme

    Friedrich-Alexander-UniversittErlangen-Nrnberg

    Sommersemester 2018

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

    V_

    SPIC

    _ha

    ndou

    t

    http://www4.cs.fau.de/Lehre/SS18/V_SPIC

  • berblick: Teil C Systemnahe Softwareentwicklung

    12 Programmstruktur und Module

    13 Zeiger und Felder

    14 C-Systemarchitektur

    12-M

    odul

    e:20

    18-0

    2-21

  • Softwareentwurf

    Softwareentwurf: Grundstzliche berlegungen ber die Struktureines Programms vor Beginn der Programmierung

    Ziel: Zerlegung des Problems in beherrschbare Einheiten

    Es gibt eine Vielzahl von Softwareentwurfs-MethodenObjektorientierter Entwurf [ GDI, 01-01]

    Stand der KunstDekomposition in Klassen und ObjekteAn Programmiersprachen wie C++ oder Java ausgelegt

    Top-Down-Entwurf / Funktionale DekompositionBis Mitte der 80er Jahre fast ausschlielich verwendetDekomposition in Funktionen und FunktionsaufrufeAn Programmiersprachen wie Fortran, Cobol, Pascal oder C orientiert

    Systemnahe Software wird oft(noch) mit Funktionaler Dekompo-sition entworfen und entwickelt.

    c kls SPiC (Teil C, SS 18) 12 Programmstruktur und Module Einfhrung 121

    12-M

    odul

    e:20

    18-0

    2-21

  • Beispiel-Projekt: Eine Wetterstation

    Typisches eingebettetes SystemMehrere Sensoren 0+&1

    2#$3

    45676

    -)#''8)#

    95:

    ;?4@

    ;#' 4?)-9 4?)-9; 4?)-9< 4?)-9& 4?)-9= 4?)-9" 4?)-9> 4?)-96 4?)-97 9996 9997 4,096 4,097 #' (49) $(4,$9JHJ$)BK@LHBC 6=&

    [1, S. 327]

    c kls SPiC (Teil C, SS 18) 14 C-Systemarchitektur Peripherie 147

    14-M

    C:20

    18-0

    2-21

  • Peripheriegerte Register (Forts.)

    Memory-mapped Register ermglichen einen komfortablen ZugriffRegister 7 Speicher 7 Variable

    Alle C-Operatoren stehen direkt zur Verfgung (z. B. PORTD++)

    Syntaktisch wird der Zugriff oft durch Makros erleichtert:

    #define PORTD ( * (volatile uint8_t *) 0x12

    Adresse: int

    Adresse: volatile uint8_t *(Cast 719 )

    Wert: volatile uint8_t (Dereferenzierung 134 )

    ) PORTD ist damit(syntaktisch)quivalent zueiner volatileuint8_t-Variablen,die an Adresse0x12 liegtBeispiel

    #define PORTD (*(volatile uint8_t *) 0x12)

    PORTD |= (1

  • Registerzugriff und Nebenlufigkeit

    Peripheriegerte arbeiten nebenlufig zur Software; Wert in einem Hardwareregister kann sich jederzeit ndernDies widerspricht einer Annahme des Compilers

    Variablenzugriffe erfolgen nur durch die aktuell ausgefhrte Funktion; Variablen knnen in Registern zwischengespeichert werden

    // C code#define PIND (*(uint8_t*) 0x10)void foo(void) { if (! (PIND & 0x2)) {

    // button0 pressed

    }if (! (PIND & 0x4)) {

    // button 1 pressed

    }}

    // Resulting assembly code

    foo:lds r24, 0x0010 // PIND->r24sbrc r24, 1 // test bit 1rjmp L1// button0 pressed

    L1:sbrc r24, 2 // test bit 2rjmp L2

    PIND wird nicht erneut ausdem Speicher geladen. DerCompiler nimmt an, dassder Wert in r24 aktuell ist.

    L2:ret

    c kls SPiC (Teil C, SS 18) 14 C-Systemarchitektur Exkurs: volatile 149

    14-M

    C:20

    18-0

    2-21

  • Der volatile-Typmodifizierer

    Lsung: Variable volatile (flchtig, unbestndig) deklarierenCompiler hlt Variable nur so kurz wie mglich im Register; Wert wird unmittelbar vor Verwendung gelesen; Wert wird unmittelbar nach Vernderung zurckgeschrieben

    // C code#define PIND \(*(volatile uint8_t*) 0x10)

    void foo(void) { if (! (PIND & 0x2)) {

    // button0 pressed

    }

    if (! (PIND & 0x4)) {

    // button 1 pressed

    }}

    // Resulting assembly code

    foo:lds r24, 0x0010 // PIND->r24sbrc r24, 1 // test bit 1rjmp L1// button0 pressed

    L1:lds r24, 0x0010 // PIND->r24sbrc r24, 2 // test bit 2rjmp L2

    PIND ist volatile und wirddeshalb vor dem Test er-neut aus dem Speichergeladen.

    L2:ret

    c kls SPiC (Teil C, SS 18) 14 C-Systemarchitektur Exkurs: volatile 1410

    14-M

    C:20

    18-0

    2-21

  • Der volatile-Typmodifizierer (Forts.)

    Die volatile-Semantik verhindert viele Code-Optimierungen(insbesondere das Entfernen von scheinbar unntzem Code)

    Kann ausgenutzt werden, um aktives Warten zu implementieren:

    // C codevoid wait(void) {for (uint16_t i = 0; i < 0xffff; i++);

    volatile!}

    // Resulting assembly codewait:// compiler has optimized// "unneeded" loopret

    Achtung: volatile 7 $$$Die Verwendung von volatile verursacht erhebliche Kosten

    Werte knnen nicht mehr in Registern gehalten werden

    Viele Code-Optimierungen knnen nicht durchgefhrt werden

    Regel: volatile wird nur in begrndeten Fllen verwendet

    c kls SPiC (Teil C, SS 18) 14 C-Systemarchitektur Exkurs: volatile 1411

    14-M

    C:20

    18-0

    2-21

  • Peripheriegerte: Ports

    Port := Gruppe von (blicherweise 8) digitalen Ein-/AusgngenDigitaler Ausgang: Bitwert 7 Spannungspegel an C-PinDigitaler Eingang: Spannungspegel an C-Pin 7 BitwertExterner Interrupt:(bei Pegelwechsel)

    Spannungspegel an C-Pin 7 Bitwert; Prozessor fhrt Interruptprogramm aus

    Die Funktion ist blicherweise pro Pin konfigurierbarEingangAusgangExterner Interrupt (nur bei bestimmten Eingngen)Alternative Funktion (Pin wird von anderem Gert verwendet)

    c kls SPiC (Teil C, SS 18) 14 C-Systemarchitektur Ports 1412

    14-M

    C:20

    18-0

    2-21

  • Beispiel ATmega328PB: Port/Pin-Belegung5. Pin Configurations

    Figure 5-132 TQFP Pinout ATmega328PB

    1

    2

    3

    4

    32 31 30 29 28 27 26

    5

    6

    7

    8

    24

    23

    22

    21

    20

    19

    18

    1725

    9 10 11 12 13 14 15 16

    PD0

    (PTC

    XY/O

    C3A

    /RXD

    0)

    PD1

    (PTC

    XY/O

    C4A

    /TXD

    0)

    PD2

    (PTC

    XY/IN

    T0/O

    C3B

    /OC

    4B)

    PC6

    (RES

    ET)

    PC2

    (AD

    C2/

    PTC

    Y)

    PC3

    (AD

    C3/

    PTC

    Y)

    PC4

    (AD

    C4/

    PTC

    Y/SD

    A0)

    PC5

    (AD

    C5/

    PTC

    Y/SC

    L0)

    PC0 (ADC0/PTCY/MISO1)

    PC1 (ADC1/PTCY/SCK1)

    GND

    PE2 (ADC6/PTCY/ICP3/SS1)

    AVCC

    PB5 (PTCXY/XCK0/SCK0)

    AREF

    PE3 (ADC7/PTCY/T3/MOSI1)

    (XCK0/T0/PTCXY) PD4

    GND

    VCC

    (SDA1/ICP4/ACO/PTCXY) PE0

    (SCL1/T4/PTCXY) PE1

    (XTAL1/TOSC1) PB6

    (XTAL2/TOSC2) PB7

    (PTC

    XY/A

    IN1)

    PD

    7

    (OC

    1A/P

    TCXY

    ) PB1

    (SS0

    /OC

    1B/P

    TCXY

    ) PB2

    (MIS

    O0/

    RXD

    1/PT

    CXY

    ) PB4

    (OC2B/INT1/PTCXY) PD3(O

    C0B

    /T1/

    PTC

    XY) P

    D5

    (OC

    0A/P

    TCXY

    /AIN

    0) P

    D6

    (ICP1

    /CLK

    O/P

    TCXY

    ) PB0

    (MO

    SI0/

    TXD

    1/O

    C2A

    /PTC

    XY) P

    B3

    Power

    Ground

    Programming/debug

    Digital

    Analog

    Crystal/CLK

    Atmel ATmega328PB [DATASHEET]Atmel-42397C-8-bit AVR-ATmega328PB_Datasheet_Complete-10/2015

    13

    Aus Kostengrnden istnahezu jeder Pin doppeltbelegt, die Konfigurationder gewnschten Funk-tion erfolgt durch dieSoftware.

    Beim SPiCboard werdenz. B. Pins 2324 alsADCs konfiguriert, umPoti und Photosensoranzuschlieen.

    PORTC steht daherfr diese Pins nicht zurVerfgung.

    c kls SPiC (Teil C, SS 18) 14 C-Systemarchitektur Ports 1413

    14-M

    C:20

    18-0

    2-21

  • Beispiel ATmega32: Port-Register

    Pro Port x sind drei Register definiert (Beispiel fr x = D)

    DDRx Data Direction Register: Legt fr jeden Pin i fest, ob er als Eingang(Bit i=0) oder als Ausgang (Bit i=1) verwendet wird.

    18.4.9. Port D Data Direction RegisterWhen addressing I/O Registers as data space using LD and ST instructions, the provided offset must beused. When using the I/O specific commands IN and OUT, the offset is reduced by 0x20, resulting in anI/O address offset within 0x00 - 0x3F.

    Name: DDRDOffset: 0x2AReset: 0x00Property:

    When addressing as I/O Register: address offset is 0x0A

    Bit 7 6 5 4 3 2 1 0 DDRD7 DDRD6 DDRD5 DDRD4 DDRD3 DDRD2 DDRD1 DDRD0

    Access R/W R/W R/W R/W R/W R/W R/W R/W Reset 0 0 0 0 0 0 0 0

    Bits 7:0 DDRDn:Port D Data Direction [n = 7:0]

    Atmel ATmega328PB [DATASHEET]Atmel-42397C-8-bit AVR-ATmega328PB_Datasheet_Complete-10/2015

    121

    PORTx Data Register: Ist Pin i als Ausgang konfiguriert, so legt Bit i den Pegelfest (0=GND sink, 1=Vcc source). Ist Pin i als Eingang konfiguriert, soaktiviert Bit i den internen Pull-Up-Widerstand (1=aktiv).

    18.4.8. Port D Data RegisterWhen addressing I/O Registers as data space using LD and ST instructions, the provided offset must beused. When using the I/O specific commands IN and OUT, the offset is reduced by 0x20, resulting in anI/O address offset within 0x00 - 0x3F.

    Name: PORTDOffset: 0x2BReset: 0x00Property:

    When addressing as I/O Register: address offset is 0x0B

    Bit 7 6 5 4 3 2 1 0 PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0

    Access R/W R/W R/W R/W R/W R/W R/W R/W Reset 0 0 0 0 0 0 0 0

    Bits 7:0 PORTDn:Port D Data [n = 7:0]

    Atmel ATmega328PB [DATASHEET]Atmel-42397C-8-bit AVR-ATmega328PB_Datasheet_Complete-10/2015

    120

    PINx Input Register: Bit i reprsentiert den Pegel an Pin i (1=high, 0=low),unabhngig von der Konfiguration als Ein-/Ausgang.

    18.4.10. Port D Input Pins AddressWhen addressing I/O Registers as data space using LD and ST instructions, the provided offset must beused. When using the I/O specific commands IN and OUT, the offset is reduced by 0x20, resulting in anI/O address offset within 0x00 - 0x3F.

    Name: PINDOffset: 0x29Reset: N/AProperty:

    When addressing as I/O Register: address offset is 0x09

    Bit 7 6 5 4 3 2 1 0 PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0

    Access R/W R/W R/W R/W R/W R/W R/W R/W Reset x x x x x x x x

    Bits 7:0 PINDn:Port D Input Pins Address [n = 7:0]Writing to the pin register provides toggle functionality for IO. Refer to Toggling the Pin on page 93.

    Atmel ATmega328PB [DATASHEET]Atmel-42397C-8-bit AVR-ATmega328PB_Datasheet_Complete-10/2015

    122

    Verwendungsbeispiele: 35 und 38 [1, S. 92]

    c kls SPiC (Teil C, SS 18) 14 C-Systemarchitektur Ports 1414

    14-M

    C:20

    18-0

    2-21

  • Strukturen: Motivation

    Jeder Port wird durch drei globale Variablen verwaltetEs wre besser diese zusammen zu fassenproblembezogene Abstraktionen 41Trennung der Belange 124

    Dies geht in C mit Verbundtypen (Strukturen)

    // Structure declarationstruct Student {char lastname[64];char firstname[64];long matnum;int passed;

    };

    // Variable definitionstruct Student stud;

    Ein Strukturtyp fasst eine Menge von Daten zueinem gemeinsamen Typ zusammen.

    Die Datenelemente w