technische universität dortmund Software ubiquitärer Systeme 2. Übung http://ess.cs.uni-dortmund.de/DE/Teaching/SS2014/SuS Christoph Borchert http://ess.cs.tu-dortmund.de/~chb AG Eingebettete Systemsoftware Informatik 12, TU Dortmund technische universität dortmund embedded system software Überblick ● C++ Crashkurs (Teil 2) ● MSP430 Architektur ● Button-Ansteuerung Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software C++-Konzepte (Crashkurs Teil 2) ● Übersetzungs- und Bindevorgang ● Präprozessor ● Vererbung und Mehrfachvererbung ● Virtuelle Funktionen Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software C++ - Übersetzungsprozess Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Sourcecode - Präprozessor ● ● Zwei Dateiendungen: – .cc — C++ Source Code – .h — „Header Files“ mit Definitionen von Datentypen, Konstanten, Präprozessor-Makros etc. Die Endungen sind Konvention, aber nicht zwingend – ● oft z.B. auch .cpp, .hpp o.ä. Header-Files werden mit Hilfe des Präprozessors textuell in .cc-Files integriert – #include – Anweisung: ● #include <iostream> für System-Headerfiles ● #include "device.h" für eigene Headerfiles Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Sourcecode - Präprozessor ● Weitere Präprozessorfunktionen: – Makrodefinition, z.B. für Konstanten: ● ohne Semikolon am Ende! #define pi 3.1415926 #define LCD_BASE 0x0a00 – Bedingte Übersetzung: #ifdef DEBUG … #endif ● #ifndef LCD_BASE #define LCD_BASE 0x0a000 #endif Der Präprozessor expandiert Makros im Source Code, fügt Header-Files ein und erzeugt eine neue Textdatei, die der Compiler vorgesetzt bekommt Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Sourcecode - Präprozessor ● Wichtige Anwendung für #define und #ifndef: – Verhindern von mehrfacher Inklusion von Header-Dateien ● Header-Dateien dürfen wiederum Header-Dateien inkludieren -> Ringschluss... #ifndef LCD_H #define LCD_H class LCD { /* Hier muesst ihr selbst Code vervollstaendigen */ }; #endif Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Sourcecode - Compiler ● Erzeugt aus vom Präprozessor vorverarbeitetem Source Code eine Objektdatei (.o) – ● ● Diese ist i.a. nicht direkt ausführbar, da noch Referenzen auf Funktionen oder Variablen in anderen Objektdateien enthalten sein können Der Compiler überprüft den Source Code auf Syntaxfehler und erzeugt ggf. – Fehlermeldungen (errors) – Warnungen (warnings) Eine Objektdatei wird nur bei fehlerfreier Übersetzung erzeugt – Warnungen führen nicht zum Abbruch des Übersetzungsvorgangs! Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Sourcecode - Linker ● ● Fasst eine Menge an Objektdateien (.o) sowie ggf. Libraries (.a, .so) zu einem ausführbaren Programm zusammen: – Auflösung von Referenzen – Sortierung der einzelnen Teile der Objektdateien im Speicherabbild der ausführbaren Datei „Normalerweise“ gibt es zwei Link-Modi: – dynamisch: Libraries werden erst zur Zeit der Ausführung des Programms zum Objektcode geladen und Referenzen darin aufgelöst – statisch: Libraries werden zur Link-Zeit in ein komplett ausführbares Programm integriert Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Einfache Vererbung ● Klasse Derived erbt von Klasse Base ● Vererbungsoperator “:” (entspricht “extends” in Java) Base Derived Base.h: Derived.h class Base { … }; #include "Base.h" class Derived : public Base { public: Derived(); ~Derived(); }; Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Mehrfachvererbung ● Klasse Derived erbt von den Klassen Base1 und Base2: Base2 Base1 Derived Derived.h: #include "Base1.h" #include "Base2.h" class Derived : public Base1, public Base2 { public: Derived(); ~Derived(); }; Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Vererbung: Konstruktoren ● Abgeleitete Klassen müssen im Konstruktor immer zuerst die Basisklassenkonstruktoren aufrufen – Implizit bei Basisklassenkonstruktoren ohne Parameter – Explizit: Initialisierungsliste ● Wird vor dem eigentlichen Konstruktor ausgeführt #include "Base1.h" #include "Base2.h" class Derived : public Base1, public Base2 { public: Derived() : Base1(42), Base2(4711) {} }; Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Virtuelle Funktionen ● ● Virtuelle Funktionen sind Funktionen einer Basisklasse. Eine abgeleitete Klasse kann sie überschreiben und übernimmt damit die Ausführung der Funktion für ihre Klassenmitglieder. – ● ● das funktioniert auch mit nicht virtuellen Klassen... Das Besondere an virtuellen Funktionen ist, dass das Objekt selbst weiss, zu welcher abgeleiteten Klasse es gehört und seine zugehörige Klassenfunktion ruft. Nicht jede Funktion ist standardmäßig virtuell, es muss explizit das Schlüsselwort „virtual“ verwendet werden! (im Gegensatz zu Java) Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Virtuelle Funktionen #include <iostream> ● class base { public: virtual void display() { cout << ”Base”; } }; Ausgabe: „Derived“ ● ohne das virtual vor void base::display(): „Base“ class derived : public base { public: void display() { cout << ”Derived”; } }; void main() { base *ptr = new derived; ptr->display(); } Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Virtuelle Destruktoren ● ● Es gibt eine Faustregel, die besagt, dass jede Klasse mit virtuellen Funktionen auch einen virtuellen Destruktor haben soll. Da ein nicht virtueller Destruktor nicht gewährleistet, dass abgeleitete Klassen ordnungsgemäß abgebaut werden, kann ein nicht virtueller Destruktor sogar so interpretiert werden, dass der Autor ein Ableiten seiner Klasse nicht vorgesehen hat und wohl auch nicht empfiehlt. Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Überblick ● C++ Crashkurs (Teil 2) ● MSP430 Architektur ● Button-Ansteuerung Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software EZ430-Chronos ● Entwicklungskit von Texas Instruments – Display mit 7-Segment- und Spezialanzeigen – 5 Bedienknöpfe – Sensoren für Luftdruck, 3-Achsen-Beschleunigung, Temperatur und Batteriespannung – „RF“-Funk im 868MHz-Frequenzband (lizenzfrei) – TI CC430F6137 System-on-Chip ● 16-Bit-Mikrocontroller (MSP430) und Funkchip (CC1101) ● 27 MHz (max.), bei uns mit 12 MHz ● 32 KiB Flash, 4 KiB RAM ● Peripherie: A/D, D/A, SPI, I2C, Timer, UART, Watchdog, ... Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software System-on-Chip (hier: msp430f1611) ● Alle Komponenten auf einem Stück Silizium → geringe Produktionskosten Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software CC430F6137 µController Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software MSP430 Speicheraufbau ● Ein Speicherbereich – RAM – Flash – Peripherie ● z.B. LCD (0x0a00...) ● Adressierung in Bytes (8 Bit) oder Words (16 Bit) Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software MSP430-Architektur (CPU) ● ● 16 Register zu je 16 Bit – R0: Program Counter (PC) – R1: Stack Pointer (SP) – R2: Status Register (SR) – R3: Constant Generator (CG2) – R4–R15: Allzweckregister 16-Bit ALU – ● 16-Bit-Adressen – ● Zusätzlich: Multiplikatoreinheit RAM, Flash, Memory-Mapped I/O MSP430X: 20 Bit Adressen/Register Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software MSP430 Instruction Set Architecture ● 27 CPU Instruktionen – 24 „emulierte“ Instruktionen (Assembler Makros) ● 3 stufige Pipeline (Fetch/Decode/Execute) ● 7 Adressierungsarten ● – Bestimmen Instruktionslänge (16, 32, 48 Bit) – Bestimmen Taktzyklen (1-6) der Instruktionen RISC (Reduced Instruction Set Computing) – Warum? Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software MSP430-Instruktionsformate ● Jump Instruktionen ● Single-Operand (Format II) Instruktionen ● Double-Operand (Format I) Instruktionen Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software MSP430-Adressierungsarten Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software MSP430-Betriebsmodi 160 µA/MHz 1.0 µA 2.0 µA Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Überblick ● C++ Crashkurs (Teil 2) ● MSP430 Architektur ● Button-Ansteuerung Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software EZ430-Chronos: Buttons ● ● Vier frei definierbare Buttons – „*“, „#“, „Up“, „Down“ – An GPIO-Pins angeschlossen – Nicht entprellt Der „Light“-Button startet das Hauptprogramm bzw. den Bootloader – Darf nicht verändert werden! Software ubiquitärer Systeme: 2. Übung technische universität dortmund embedded system software Pull-Up vs. Pull-Down Software ubiquitärer Systeme: 2. Übung