10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 MIKROPROZESSOR PROGRAMMIERUNG 7. VORLESUNG BIT LV-Nr. 439.026 SS2007 1 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 SOFTWAREENTWICKLUNG FÜR µC Übersicht - Prinzipdarstellung Der Weg zu einem lauffähigen Maschinenprogramm Vergleich von Programmiersprachen Ein µC-Anwenderprogramm generieren Demonstration einer µC Entwicklungsumgebung Einführung in die „Embedded Systems“ C - Programmierung 2 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Praktisches Problem für µC- Experten … 3 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 SOFTWAREENTWICKLUNG FÜR µC PRINZIPDARSTELLUNG ENTWICKLUNGSUMGEBUNG Quelldateien Versions-Verwaltung freigegebene Quelldateien integrierte Entwicklungsumgebung Editor geänderte Quelldateien Übersetzer Compiler Objekt-Dateien Symbole Binder Test Debugger Anwendungsprogramm Linker Ausführbare Datei Entwicklungssystem: PC Download PROGRAMMENTWICKLUNG PersonalComputer Zielsystem: Mikrocontroller µC-System µC-Applikation 4 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 PROGRAMMIERSPRACHEN FÜR µC: • (früher) Assembler • heute meist C, nur zeitkritische Teile in Assembler • bei leistungsfähigeren Mikrocontrollern auch C++ & erfordert aber mehr Ressourcen & und erzeugt mehr Dynamik • Java in der Regel zu ressourcen- intensiv • es existieren jedoch einige Forschungsbemühungen in diese Richtung • weiche Echtzeit: Java, C#, VB u.a. PROGRAMMGENERATOREN FÜR µC: • UML (Unified Modeling Language) • Blockschaltbild (Matlab/Simulink) • DAVE (Digital Application virtual Engineer ) •… UML 5 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 MASCHINENSPRACHE - ASSEMBLER Ein Assembler in der Informatik ist ein spezieller Compiler, das ein in einer maschinennahen Assemblersprache geschriebenes Programm in Maschinensprache übersetzt. Oft wird der Ausdruck Assembler auch als Abkürzung oder Synonym für Assemblersprache verwendet. ASSEMBLER: Für jeden Computertyp gibt es spezielle, auf den Befehlsvorrat des Computers zugeschnittene Assemblersprache. Der Prozess der 1:1 Übersetzung dieser Assemblersprache in die Maschinensprache heißt „Assemblieren“. HINWEIS: Assemblersprache wird immer seltener eingesetzt. Der Möglichkeit der Erstellung effizienter Programme steht die erschwerte Wartbarkeit von Assemblerprogrammen gegenüber. Maschinennahe Programmierung – die Domäne von Assembler – kann heute fast vollständig durch höhere Programmiersprachen abgedeckt werden. Auch ist die Programmierung heutiger Prozessoren in Assemblersprache zur Geschwindigkeitsoptimierung schwierig, da zahlreiche Nebenbedingungen eingehalten werden müssen, damit der Prozessor in optimaler Geschwindigkeit läuft, während auf der anderen Seite optimierende Compiler für Hochsprachen immer besseren Code erzeugen und diese Bedingungen automatisch erfüllen können 6 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 COMPILER Allgemein: Ein Compiler erzeugt aus einem Quellprogramm, das in einer Quellsprache geschrieben ist, ein Zielprogramm in einer Zielsprache (z.B. C) Aufgaben • Hochsprache wird durch Übersetzer (Compiler) in Maschinensprache übersetzt • Das erzeugte Programm wir dann auf die Zielmaschine geladen und ausgeführt • Die Interpretation der Befehle erfolgt direkt durch die Hardware / Betriebssystem der Zielmaschine (µC) • Jede Zielsprache benötigt eigenen Übersetzer (Compiler) • Weiterhin Laufzeitsystem, Speicherverwaltung, Typprüfung … • Betriebssystembibliotheken müssen dazu gebunden werden (Linker) Laufzeitssystem: Bereitstellung aller Routinen, die zur Ausführung eines Programms in einer Programmiersprache erforderlich sind (Interaktionen mit dem Betriebssystem, Speicheranforderungen, Prüfungen der dynamischen Semantik, Fehlerroutinen usw.) Hinweis: Semantik (Bedeutungslehre) Linken: .hex Überführung des vorliegenden Maschinencodes in ein ausführbares Programm Binden aller Teile des Programms (getrennt übersetzte Dateien, Bibliotheksfunktionen, Fehler- und Speicherverwaltungsroutinen des Laufzeitsystems) zu einem lauffähigen Programm 7 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 VERGLEICH VON PROGRAMMIERSPRACHEN: Sprache Quelltext C #include <stdio.h> main() { printf ( "hello, world\n"); } C++ #include <iostream> main() {std::cout << "hello, world" << std::endl;} Pascal program hallop; {$APPTYPE CONSOLE} begin writeln ('hello, world') end. Assembler 0100: mov dx, 010a 0103: mov ah, 09 0105: int 21 0107: jmp 0000 010a: db 'hello world' 0d 0a '$' Ein Assembler-Programm kommt mit einem winzigen Bruchteil der Bytes aus, die beim Übersetzen durch C++Entwicklungssysteme belegt werden, und C++-Compilate machen sich auf der Festplatte und im Speicher unverschämt breit. Obgleich sich solche Beobachtungen an Miniprogrammen nur höchst eingeschränkt auf reale Software-Produkte üblichen Umfangs übertragen lassen, so sagen sie doch eines: Besonders wirtschaftlich geht C/C++ beim Linken nicht vor, die ausführbare Datei ist mit hunderttausenden ungenutzter Bytes aufgeplustert. Übersetzer C-Programm C++-Programm Pascal-Programm AssemblerProgramm Pascal — — 29 116 byte — C 45 000 byte 12 006 byte — — GCC 3.2 11 000 byte 562 928 byte — — Debug — — — 24 byte 8 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 SPEICHERBEDARF: • hier liegt ein wesentlicher Unterschied zur Programmentwicklung auf dem PC • bei Mikrocontrollern ist Speicher eine knappe Ressource (z.B. 6KB RAM, 128KB FLASH) • Übersetzer optimieren meist in Richtung Speicherbedarf (selten Geschwindigkeit) • Speichersparende Algorithmen sind gefragt • Algorithmen, die vor 10-20 Jahren für den PC entwickelt wurden, können hier interessant werden (zu dieser Zeit hatten PCs etwa den Speicherumfang heutiger Mikrocontroller) Überlegungen: • wie viel Programm- und Datenspeicher benötigt die Anwendung? • Reicht die Größe des internen Daten- und Programmspeichers? • Ist ein externer Busanschluss vorhanden? • max. externe Speichergröße? 9 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 ADRESSFESTLEGUNG BEIM BINDEN (LINKEN): Memory Map: Fujitsu Mikrocontroller • bei PCs: dynamische Adressfestlegung zur Laufzeit - nur so können mehrere Programme gleichzeitig bearbeitet werden • bei Mikrocontrollern: statische Festlegung der Adressen beim Binden (Locator) • Die Adressen müssen an das Speicherabbild (Memory Map) des Mikrocontrollers angepasst werden & Programm -> Festwertspeicher & Daten -> Schreiblesespeicher • erste Programm-Instruktion, Interrupttabellen, ... , müssen an die richtige Stelle gelegt werden 10 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Ein Mikrocontroller-Anwenderprogramm generieren: COMPILER Quellcode & ProgrammBibliotheken FLASH-Programmer-TOOL: .hex z.B. JTAG RS232 Maschinensprache µC-Anwendung 11 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 LADEN, SIMULIEREN UND TESTEN: Simulator auf dem Entwicklungssystem • grober Test, da Zeitverhalten anders und Zielperipherie nicht vorhanden Test auf dem Zielsystem mittels Download und Monitor • näher am Zielsystem (Zeitverhalten, Peripherie) • immer noch komfortables Testen • Monitor verändert Systemverhalten (Initialisierungen, Speichertypen, ...) Test auf dem Zielsystem ohne Monitor • endgültige Zielumgebung • Programm im Festwertspeicher (ext. Programmieren oder Flash-Code-Loader) • Ladezeiten lang • Test schwierig Entwicklungsumgebung µVision3 IDE & Debugger IDE … Integrated Development Environment 12 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 DEMONSTRATION EINER µC- ENTWICKLUNGSUMGEBUNG 13 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 DEMONSTRATION EINER µC- ENTWICKLUNGSUMGEBUNG 14 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Empfohlene Literatur Softwareentwicklung in C für Mikroprozessoren und Mikrocontroller Softwareentwicklung, Programmiersprache C, Embedded Systems, Mikroprozessor/Mikroprozessor/-controller Jörg Wiegelmann, 2. Auflage Hüthnig ISBN 33-77857785-28242824-6 C für Mikrocontroller ANSIANSI-C, CC-Compiler/Linker, Echtzeitbetriebssysteme, CC-Programmierbeispiele, Tools für die Programmierung, Tipps und Tricks Burkhard Mann, 2. Auflage Franzis ISBN 33-77237723-41564156-X C166 Compiler - µVision 3 Manual LV Homepage http://www.keil.com http://www.keil.com 15 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung µC-Programm Gliederung : • Compiler – Steueranweisungen • Datendefinitionen • Funktionen (Functions) • Interrupt – Functions • Main - Programm 16 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Compiler - Steueranweisung Der Aufruf von Compiler-Steueranweisungen ist natürlich nicht ausschließlich auf den Programmbeginn beschränkt. Normalerweise befinden sich am Programmanfang aber eine Reihe von diesen Befehlen. Sie werden auch durch die Programmieroberfläche eingefügt. Der Präprozessor ist ein wichtiges Werkzeug zur Vorverarbeitung von C-Texten vor ihrer Übersetzung durch den Compiler. Er erledigt folgende Aufgaben: • Ersetzen von Makros • Einfügen von Dateien • bedingtes Übersetzen Der Präprozessor wird durch folgende Anweisungen gesteuert, die alle mit dem #Zeichen beginnen: #define, #undef, #if, #endif, #ifdef, #ifndef, #else, #include, #pragma, #line, #error , … 17 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Compiler - Steueranweisung #define Mit define-Anweisungen können häufig verwendete Konstanten durch Namen ersetzt werden. Beispiel: #define DIGIT 0x34 #undef Mit der undef-Anweisung kann ein Makro wieder gelöscht werden #ifdef #ifndef Hiermit kann abgetestet werden, ob ein Makro überhaupt definiert ist. #ifdef ist wahr, wenn ein Makro vorhanden ist, #ifndef ist wahr, wenn ein Makro nicht vorhanden ist. #include Diese Anweisung ist besonders wichtig. Mit ihr können ganze Dateien in einen C-Text eingefügt werden. #pragma Mit #pragma werden compilerspezifische Ausnahmen definiert #error Diese Anweisung löst einen schweren Compilerfehler aus und gibt den nachgestellten Text an ; Bei allen Präprozessoranweisungen gilt es zu beachten, dass sie nicht mit Semikolon ; abgeschlossen werden dürfen ! 18 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Datendefinitionen In diesem Abschnitt des Programms werden Variable definiert und dafür Speicherstellen reserviert. Unterteilung nach: 1. Verfügbarkeit 2. Speicherort 3. Type Nicht vergessen Variablen zu initialisieren! a.) Unterteilung nach der Verfügbarkeit: • Globale Variablen (extern) Diese müssen außerhalb aller Funktionen definiert werden und gelten ab diesem Zeitpunkt im ganzen Programm. Falls sie zusätzlich static definiert werden, gelten sie nur in diesem Modul. • Lokale Variablen (static, automatic) Diese werden in der jeweiligen Funktion definiert und stehen nur innerhalb der jeweiligen Funktion zur Verfügung. Der Linker überlagert, nachdem er überprüft hat, ob sich zwei Funktionen gegenseitig nicht aufrufen, diese Variablen, um Platz speziell im kleinen internen RAM des Controllers zu sparen. Mit der zusätzlichen Deklaration "static" kann dies verhindert werden, sodass die jeweilige Variable ihren Wert behält. Wichtig für Interrupts, hier kann keine Überprüfung zur Linkzeit erfolgen!!! 19 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Datendefinitionen b) Unterteilung nach dem Speicherort: Der Compiler unterstützt mehrere Speichermodelle, die den Speicherort automatisch bestimmen. Man kann aber auch den Speicherort definieren, um eine für die Applikation optimale Speicherverteilung zu erreichen. near idata bdata sdata far huge xhuge 16 bit pointer; 16 bit Adressenberechnung 16 KB für Variable in der NDATA Gruppe, 16 KB für constants in der NCONST Gruppe, 16 KB für die system area in der SDATA Gruppe. On-chip RAM ; schnellster Zugriff. bit-adressierbares On-chip RAM. SYSTEM area ( Adressenbereich 0C000h-0FFFFh); PEC adressierbar. 32 bit pointer; gesamter Adressenbereich Das einzelne Objekt (array oder structure) ist auf 16 KB limitiert. 32 bit pointer; gesamter Adressenbereich Das einzelne Objekt (array oder structure) ist auf 64 KB limitiert. 32 bit pointer; 32 bit Adressen für Objekte, die innerhalb des Speichers unlimitiert sind. 20 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK 10101010101110101010101010101010101010010101010101010101010101001010101010101010101010101010101010101010101010101011111010100010101010101 01010101010101010101011011010101010101010101010101010101010101010101010101010101010101010101011010100100010101010110101010101010101010101 10010101010110101010111110101010101010101010101010101010111110101010101001010101011110110111110100101010100000110101111111011010101011011 Einführung in die „Embedded Systems“ C - Programmierung Datendefinitionen b) Unterteilung nach Typen: (Teil 1) 21 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] • 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. 22 HINTERBERGER M. 2007 INSTITUT FÜR ELEKTRONIK