Erste Schritte der Programmierung in C C versus C++ Anatomie von C-Programmen für AVR- Mikrocontroller Unterschiede zwischen C++ und C 1
Grundlegende Unterschiede File-Extensions (Header und Quellcode) - C++:.h und.cpp - C:.h und.c C++ unterstützt objektorientierte Programmierung - Klassen, Objekte (Attribute, Methoden, Kapselung, Vererbung, Polymorphie, ) C unterstützt strukturierte Programmierung - Variablen, Strukturen, Funktionen C = (C++) - (OOP) - (ein paar syntaktische Features) ISO-Standard C99 ist etwas näher an C++ Syntax als ältere C-Standards - Einstellung der Option std=c99 (oder std=gnu99) in AVR- Studio-C-Projekten Variablen-Definitionen C (älterer Standard) nur zu Beginn eines Blockes möglich - ergibt Compiler-Fehler : for(int i = 0; i < n; i++) {} - korrekt: { /*irgendein Block beginnt*/ int i; for(i = 0; i < n; i++) {} } C++ und C99 an beinahe beliebiger Stelle im Quellcode - korrekt: for(int i = 0; i < n; i++) {} 2
Einstellungen in AVR-Studio Compiler Option: -std=c99 für neuen Standard Compiler Option: O0 für die ersten Versuche sollte die Optimierung des Compilers ausgeschaltet werden Project -> Configuration options Type-Casting C++ zwei Varianten möglich (double) x; double (x); C und C99 nur eine Variante möglich (double) x; 3
Kommentare C (ältere Standards): gleiche Kennzeichnung für einzeilige ili und mehrzeilige Kommentare: /* einzeiliger Kommentar */ /* mehrzeiliger Kommentar */ C++ und C99 // einzeiliger Kommentar /* mehrzeiliger Kommentar */ Boolscher Typ C++ bool b=true; b=false; C und C99: Typ bool ist unbekannt int b=1; b=0; 4
Funktionen Parameter Über- und Rückgabe bei Funktionsaufruf - C++ Call by Value Call by Reference (Referenz, Zeiger) - C und C99 Call by Value Call by Reference (nur Zeiger) Polymorphie - C++: Funktionen dürfen gleichen Namen haben, wenn ihre Parameterliste t unterschiedlich h ist: float mean(int min, int max); // Prototyp 1 float mean(int* parray, unsigned int len); // Prototyp 2 - C: Funktionen müssen unterschiedliche Namen haben float mean(int min, int max); float mean_a (int* parray, unsigned int len); Dynamisches Allokieren von Speicherplatz C++ unsigned int M=2; // Array-Größe int* p=new int[m]; p[0]=1; // irgend ein Programm delete [] p; C und C99 unsigned int M=2; int* p= malloc(sizeof(int)* M) p[0]=1; // irgend ein Programm free(p); // Array-Größe // Anzahl der Bytes 5
Tastatur-Eingabe und Bildschirm-Anzeige C++ cin/cout C und C99 scanf/printf Tastatur und Bildschirm gehören nicht zur Standard-Ausstattung eines Mikrocontrollers! C++ Strukturen - kennt Klassen und Strukturen class A A myobj(1,-1); // Objekt erzeugen { private: int m_x; int m_y; public: A(int x=0, y=0); }; - Strukturen werden behandelt wie Klassen ohne Methoden und mit public deklarierten Attributen struct A A mystruct; // Strukturvariable { mystruct.m_x=1; int m_x mystruct.m_y=-1; int m_y; }; 6
C - kennt nur Strukturen struct A { int m_x int m_y; }; Strukturen struct A mystruct; mystruct.m_x=1; mystruct.m_y=-1; // Schlüsselwort struct ist // notwendig - oder neuer Typ muss definiert werden typedef struct A t_a; // t_a ist neuer Typ t_a mystruct={1,-1}; const Weist den Compiler an, Variablen und Parameter von Funktionen als read-only, d.h. nicht veränderbar zu deklarieren const int A=10; A=-2; // Compiler-Fehler void foo(const int* p) { int x=*p; *p=10; // Compiler-Fehler } kein Unterschied zwischen C++ und C/C99! 7
Standard-Definitionsdateien in C (Beispiele) <stdio.h> Dateioperationen, o e Formatierte te Ausgabe, Formatierte te Eingabe, Ein- und Ausgabe von Zeichen, Positionieren in Dateien, Fehlerbehandlung <string.h> Funktionen für Zeichenketten <math.h> Mathematische Funktionen <stdlib.h> Hilfsfunktionen <limits.h> Definiert Konstanten und den Wertumfang von ganzzahligen Typen Funktionsbibliothek für ATMEL-Controller Name der Bibliothek: avr-libc Download der Dokumentation ab MIT-Download-Seite: immer die aktuelle Version der Dokumentation (online, als pdf....) 8
Dokumentation avr-libc Für den Schnellzugriff auf die Dokumentation der verfügbaren Funktionen im pdf-dokument, z.b. über den Module index Anatomie von C-Programmen für AVR-Mikrocontroller 9
Programmablauf für Mikrocontroller Definieren und Initialisieren der benötigten Variablen Initialisieren der benötigten Komponenten Mikrocontroller- Programme laufen in endlosen Schleifen! Programm, das mit Komponenten und Variablen arbeitet C-Programme für Mikrocontroller // bindet ein h-file ein, in dem alle IO-Adressen und // Konstanten für den eingestellten Mikrocontroller-Typ // definiert sind #include <avr\io.h> #define F_CPU 1e6 // eingestellte Prozessor-Taktfrequenz // weitere include-anweisungen für benötigte Funktionen der // avr-libc oder eigene Include-Files // Funktionsprototypen für eigene Funktionen int main(void) { // Definieren & Initialisieren der benötigten Variablen // Initialisieren der benötigten Komponenten while(1) // Endlosschleife { // Programm, das mit Komponenten arbeitet } } // eigene Funktionen 10
Wahl des Mikrocontroller-Typs Einstellung der Prozessor-Taktfrequenz F_CPU gleicher Wert! 11