10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 MIKROPROZESSOR PROGRAMMIERUNG 8. VORLESUNG BIT LV-Nr. 439.026 SS2007 1 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Datendefinitionen b) Unterteilung nach Typen: (Teil 2) • void … leer • Pointer 2/4 Bytes Adresse von Objekten • Arrays bei allen Datentypen außer „bit“ möglich Dimension (n) in eckiger Klammer [n] Struktur • Strukturen mehrere Variablen werden zusammengefasst im Gegensatz zu Arrays können diese verschiedene Datentypen beinhalten • Unions Es können verschiedene Datentypen in einer union Platz finden. Sie werden dann ab der gleichen Speicheradresse abgelegt. Der größte Datentyp bestimmt die Größe der union. 2 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Datendefinitionen Beispiele : Variablen unsigned char idata var1,var2; bit secflag; const unsigned char text[5]; unsigned long far temp[100]; unsigned char *ptr; signed char test_tab [4] [3]; float idata x,y,z; Struktur struct { unsigned int day; unsigned int month; unsigned int year; } d; d.year = 2000; Union union { unsigned char access_byte[2]; unsigned int access_int; } measure; Zugriff: measure.access_byte[0] = 0x21; measure.access_byte[1] = 0x43; a = measure.access_int ergibt für das unsigned int a gleich 0x4321. Mit dieser Definition kann auf zwei Bytes als integer zugegriffen werden und man erspart sich die Umrechnung 256*high byte + low byte 3 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Funktionen (Functions) „Tätigkeiten“, die an mehreren Stellen im Programm abgearbeitet werden sollten, sind als so genannte Funktionen „Functions“ zusammengefasst. Die Definition für eine Funktion muss sich vor dem Aufruf befinden. Befindet sich die Funktion in einem anderen Modul, muss sie als Prototyp (1. Zeile der Funktionsdefinition) deklariert werden. Struktur einer Function: Rückgabetyp Function-Name ( Übergabevariablen mit Typendeklaration) { Definition lokaler Function-Variablen Realisierung der Function-Tätigkeit eventuelle Wertrückgabe } Function-Name: beliebig 4 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Funktionen (Functions) Übergabevariablen: Liste von Werten, die an die Function übergeben werden sollen. Die Übergabewerte werden an lokale Variablen übergeben, die in der Function definiert werden müssen. Die Function arbeitet nur mit lokalen Kopien der Übergabevariablen, d.h. nach Beendigung der Function sind diese Variablen im aufrufenden Programm unverändert. Will man eine Veränderung, so kann man an die Function einen Pointer auf die Variable übergeben oder einfach mit globalen Variablen arbeiten. Wertrückgaben: Jede Function kann durch den 'return(Variable)'-Befehl einen Wert zurückgeben. Beispiele von Functions und ihrem Aufruf: input=getkey(); pointerset(anfang); value=select(digit); /* function getkey() liefert einen Wert */ /* An die function pointerset() wird ein Wert übergeben */ /* An die function select() wird ein Wert */ /* übergeben, und ein entsprechender Wert */ /* wird von der function zurückgeliefert */ 5 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Funktionen (Functions) Variablendefinitionen: static: Eine static-Variable verhält sich teils wie eine globale und teils wie eine lokale Variable. Lokal ist sie, weil der Gültigkeitsbereich nicht über den zugehörigen Block hinausgeht. Von einer globalen Variablen hat sie, dass der ihr zugewiesene Wert auch außerhalb der Gültigkeitsgrenzen erhalten bleibt. Eine globale Variable als static zu definieren, führt zu einem besonderen Verhalten. Diese Variable verhält sich für das Modul, in dem sie definiert wurde, genau wie eine globale Variable, für andere Module ist diese Variable aber nicht sichtbar. Normale globale Variablen hingegen sind von anderen Modulen aus les- und schreibbar. volatile: Volatile wird in Embedded-Systemen häufig verwendet. Dieses Schlüsselwort teilt dem Compiler mit, dass die entsprechende Variable außerhalb der Kontrolle des Programms (z.B. über Assemblerprogramme, Interrupte oder externe Beschaltung) verändert werden kann. Jeder Zugriff auf diese Variable erfolgt deshalb durch direktes Lesen des Speichers. Von vorherigen Operationen noch vorhandene Registerinhalte werden ignoriert. Bezüglich einer mit „volatile“ versehenen Variablen finden keine Optimierungen seitens des Compilers statt. 6 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Funktionen (Functions) Variablendefinitionen: register: const: Das Schlüsselwort gibt die Anweisungen an den Compiler, diese Variable möglichst als Prozessorregister auszuführen. Sind keine Register mehr frei, so wird die Anweisung ignoriert. Der Programmierer hat mit diesem Schlüsselwort die Möglichkeit einer Laufzeitoptimierung. Hiermit versehene Typen können nicht mehr verändert werden und gelten als konstant. Bei vielen Compilern für die hier besprochenen Embedded-Systems hat das Schlüsselwort const noch eine Besonderheit. Es sorgt dafür, dass Konstanten (wenn möglich) im billigen Programmspeicher (ROM) anstatt im teureren (knapperen) Arbeitsspeicher (RAM) des Systems abgelegt werden. Das funktioniert bei Konstanten, die feste Werte haben, beispielsweise bei Timerwerten oder Schleifendurchläufen. Bekommt jedoch eine Konstante beim Anlegen derselben einen Wert aus z.B. einer Funktion zurückgeliefert, so kann der Compiler diese Konstante natürlich nicht im ROM ablegen. 7 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Interrupt- Functions: Allgemeine Form: function_name () interrupt x using y { Interrupt- Behandlung; } Function Name beliebig An interrupt functions können keine Werte übergeben werden und sie liefern keinen Wert zurück ! Interruptquellen x: x bestimmt den Einsprungsvektor (aus dem User Manual des Controllers zu entnehmen) z. B 0x20 für den Timer 0 Registerbank y : Name der Registerbank Beispiel: void periodint(void) interrupt 0x11 using period_bank 8 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Hauptprogramm (main): Das Hauptprogramm: main() stellt den Kern jedes C-Programms dar. Das Hauptprogramm beginnt mit der Initialisierung und setzt dann mit dem abzuarbeitenden Programm fort. Beispiel: void main(void) { S0CON=0x8011; T0IC=0x44; while(1) { } /* Initialisierung */ /* Serielle 10-Bit-Rahmen */ /* Timer0 Interrupt erlauben und Priorität */ /* setzen */ /* Rest des Hauptprogrammes */ /*Endlosschleife */ } 9 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Typwandlung: automatisch, mittels CAST Eine automatische Typwandlung auch „arithmetische“ oder „implizite“ Typwandlung genannt, wird vom C-Compiler durchgeführt, wenn bei Operationen die Operanden unterschiedlichen Typs sind oder auf Grund der Operation Wertebereiche überschritten werden. Dabei gilt die Regel, dass Operanden mit kleinerem Wertebereich in einen Typ mit größerem Wertebereich gewandelt werden. Zunächst wird char und short in int bzw. unsigned char und unsigned short in unsigned int umgewandelt. Die weitere Rangfolge ist dann unsigned int, long, unsigned long sowie double. Ist also ein Operand vom Typ double so wird auch der beteiligte andere Operand in den Typ double umgewandelt. 10 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Typwandlung: mittels CAST Wenn man den Datentyp einer Variablen verändern will, kann man das mit einer expliziten Typumwandlung (castOperator) erreichen. Wenn man z.B. eine Variable vom Typ int in eine vom Typ float umwandeln will, würde man schreiben: main() { int var1; float var2; var2 = (float)var1; } cast- Operator Die Umwandlung müsste man in diesem Fall allerdings nicht explizit angeben, weil C automatische Typumwandlungen durchführt. Das Beispiel zeigt aber die Syntax einer Typumwandlung mit dem cast-Operator. Man drückt damit aus, dass eine Variable [hier var1] vom Typ (datentyp) [hier ( float )] sein soll, wenn der Ausdruck ausgewertet wird. Diese Typwandlung mittels cast- Operator kommt in der Praxis recht häufig vor. Sie kann in beide Richtungen angewandt werden: a) von kleinerem Typ zum größeren ohne Datenverluste b) von großem zu kleinerem Typ mit Datenverlust. z.B. bei Integertypen in einen char werden dabei immer die höherwertigen Bytes abgeschnitten. Bei float nach integer wird der Dezimalbruch abgeschnitten. 11 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Operatoren: C erkennt mehr Operatoren als C-Schlüsselwörter = 12 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Zuweisungen und Arithmetische Operatoren (Teil 1): 13 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Zuweisungen und Arithmetische Operatoren (Teil 2): 14 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Vergleichende und Logische Operatoren: Vergleichende Operatoren werden in if- Bedingungen, while-Schleifen oder in for-Schleifen zur Entscheidung für den weiteren Programmablauf bzw. zur Programmverzweigung genutzt. Mit den Operatoren logisch UND / ODER können mehrere Vergleichsausdrücke zu einen Ausdruck verknüpft werden: 15 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Bitweise Operatoren (Teil 1): Diese Operatoren sind nur für die Datentypen char, int, short, long (signed oder unsigned) erlaubt. Mit ihnen ist eine direkte Manipulation einzelner Bits möglich. Je nach µC und Compiler werden diese Befehle auf entsprechende effiziente Maschinenbefehle abgebildet. Anwendungen finden diese hardwarenahe Bitsteuerung oft beim Zugriff auf spezielle µC-Peripherie Register 16 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Bitweise Operatoren (Teil 2): >>…011101000…<< Bit 7 … Bit 0 17 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Programmsteuerung: C-Anweisung: Eine C-Anweisung besteht aus einem Ausdruck (expression statement) dem ein Semikolon folgt. Diese Anweisung kann ein komplexer Zuweisungsausdruck, eine einfache Wertzuweisung, ein Operationsausdruck, ein Funktionsaufruf oder sogar eine leere Anweisung sein (z.B. while() ) Beispiele: Block { } : x = 0; einfache Werte Zuweisung printf(„hallo welt“); Funktionsaufruf z = (x > y); Operationsausdruck: Entscheidungsergebnis TRUE oder FALSE wird z zugewiesen Als Block werden alle durch geschweifte Klammern zusammengefasste Vereinbarungen und Anweisungen bezeichnet. Mit der öffnenden linken geschweiften Klammer { beginnt dieser Block und nach der schließenden rechten geschweiften Klammer } endet er wieder. Der schließenden Klammer } folgt kein Semikolon Nach außen wirkt der Block syntaktisch wie eine einzige Anweisung, deshalb kann der Block an allen Stellen verwendet werden, an denen nicht mehr als eine Anwendung stehen darf, wie nach if, else, for, while usw. Auch bei den Funktionen haben wir den Block kennen gelernt, denn jede Funktion besitzt mindestens einen derartigen Block, den Funktionsblock 18 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Programmsteuerung: if-else-Anweisung: if (Testausdruck) { Anweisung1; } else { Anweisung 2; } Die if-else Anweisung dient der Auswertung eines in runde Klammern gestellten Vergleichsausdruckes (Testausdruck) für eine boolsche Entscheidung. Ist das Ergebnis des Vergleiches TRUE so wird Anweisung1 ausgeführt oder ein an dieser Stelle stehender Block von Anweisungen (in geschweiften Klammern). Bei FALSE wird dagegen der Zweig mit Anweisung2 ausgeführt, der aber auch fehlen darf. Wichtig ist, dass TRUE ein beliebiger Wert ungleich Null ist. Bei FALSE dagegen ist er genau Null ! Für Mehrwege Entscheidungen kann eine mehrfach verschachtelte if-else-if Konstruktion verwendet werden. Es sind beliebige if-else-if Schachtelungen erlaubt. if ( x != 0) { if (x<20) y = x*z; } if (x != 0) y = x*z; else if (z!=0) y = x*a; else if (u != 0) y = x*b; else y = 0; 19 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Programmsteuerung: while-Schleifen: while-Schleifen dienen der zyklischen Ausführungen eines Anweisungsblockes, solange ein Testausdruck den Wert TRUE (ungleich Null) ergibt. Es werden zwei Arten von whileSchleifen unterschieden: • while (Test-Ausdruck) { Anweisung; } • do { Anweisung; } while (Test-Ausdruck); Bei ersterer Variante wird im Unterschied zur zweiten erst der Test-Ausdruck ausgewertet und dann der Block Anweisung abgearbeitet. D.h. wenn diese erste Auswertung den Wert FALSE ergibt wird der Anweisungsblock gar nicht abgearbeitet. Bei der zweiten Variante (do…while) würde in diesem Fall von dem Test schon einmal der Anweisungsblock Anweisung abgearbeitet worden sein. Erst dann erfolgt eine Auswertung von dem Test-Ausdruck 20 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Programmsteuerung: switch-case-Anweisung: switch (Ausdruck) { case Konstante1: Anweisungen; break; case Konstante2: Anweisungen; break; ... case KonstanteN: Anweisungen; break; default: Anweisungen; } Die switch-Anweisung wird für die Entscheidung von Mehrwegeauswahl einer Variablen verwendet. Das switch-Statement ermittelt den Wert und vergleicht diesen mit der dazugehörigen case-Liste. Bei Übereinstimmung mit einer zwischen case und dem Doppelpunkt stehenden Konstante werden die Anweisung dieses case-Zweiges abgearbeitet bis ein break gefunden wird. Ist kein break angegeben, werden die Anweisungen des nächsten case- Zweiges ebenso abgearbeitet. 21 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Programmsteuerung: for-Anweisung: Die for-Anweisung dient der Realisierung von iterativen Schleifen. In runden Klammern eingeschlossen sind die 3 Ausdrücke Initialisierung (Init), Wiederholungstest (Test), Wiederinitialisierung (Neu-Init) anzugeben. for (Init ; Test; Neu-Init) z.B. for ( i=0 ; i<5 ; i++) { Anweisungen; { Anweisungen; } } Zuerst wird die for-Schleife initalisiert, indem der Ausdruck <Init> ausgeführt wird. Dies können eine oder mehrere Zuweisungen bzw. Funktionsaufrufe sein, die durch Komma getrennt werden. Anschließend erfolgt die Prüfung des Ausdruckes <Test>. Ist das Ergebnis TRUE, wird der Anweisungs-Block (Anweisungen) abgearbeitet, bei FALSE dagegen wird die Schleife verlassen. Nach Abarbeitung des Anweisungs-Blockes wird der Ausdruck <Neu-Init> ausgeführt. In der Regel werden dort die Schleifenvariablen aktualisiert. Es können aber auch eine oder mehrere Zuweisungen oder Funktionsaufrufe sein. Dann wird wiederum der Ausdruck <Test> geprüft und das Szenario wiederholt sich. Also ein leicht verständliches Prinzip. Die 3 Ausdrücke <Init>, <Test>, <Neu-Init> sowie der Anweisungsblock dürfen auch leer sein. Allerdings sollten dabei nicht die trennenden Semikolon < ; > vergessen werden, sie müssen in jedem Fall angegeben werden. Der Ausdruck for(; ;) ohne jede Angabe ist ebenso zulässig und stellt eine Endlosschleife dar. 22 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Mathematische Funktionen (Teil1): 23 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Mathematische Funktionen (Teil2): 24 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Detaillierte Analyse eines 16-Bit Mikrocontrollers C167CR 25 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK