Software ubiquitärer Systeme (SuS): 1. Übung
Transcription
Software ubiquitärer Systeme (SuS): 1. Übung
Software ubiquitärer Systeme 1. Übung http://ess.cs.unidortmund.de/DE/Teaching/SS2013/SuS/index.html Christoph Borchert http://ess.cs.tu-dortmund.de/~chb AG Eingebettete Systemsoftware Informatik 12, TU Dortmund Überblick ● Organisatorisches ● Mark Weiser ● C++ Crashkurs ● LCD-Programmierung Software ubiquitärer Systeme: 1. Übung Übungen zu SuS ● 1 SWS „Tafel“übung (hier :-)) und 1 SWS Rechnerübung – ● ● wöchentlich abwechselnd (je 2 SWS) Die Tafelübung vermittelt... – Grundlagen der MSP430-Hardware-Architektur – Grundwissen zur Bearbeitung der Rechnerübungen – C++-Programmierkenntnisse Die Rechnerübung (OH16 E07) ... – dient zum Bearbeiten der Rechneraufgaben – ist zum Fragen stellen da Software ubiquitärer Systeme: 1. Übung SuS: Aufgaben ● ● ● Rechneraufgaben – alle 2 Wochen, insgesamt 6 Aufgaben – Bearbeitung in Dreiergruppen – MSP430-Microcontroller programmieren Theoretische Aufgabe – alle 2 Wochen, insgesamt 5 Aufgaben – Lesen von Papers – Verstehen von Konzepten (vorlesungsbegleitend) Jede Woche eine neue Aufgabe! Software ubiquitärer Systeme: 1. Übung Überblick ● Organisatorisches ● Mark Weiser ● C++ Crashkurs ● LCD-Programmierung Software ubiquitärer Systeme: 1. Übung Ubiquitous Computing ● Mark Weiser: Pionier des Ubiquitous Computing – Erste Ideen Anfang der 90er Jahre – Wissenschaftler bei Xerox PARC, der Heimat von... ● – Grafischen Benutzeroberflächen, Ethernet, Aspektorientierter Programmierung, … Wegweisendes Paper: “The Computer for the 21st Century” ● Wird permanent zitiert Software ubiquitärer Systeme: 1. Übung The Computer for the 21st Century ● Was sind die wesentlichen Thesen des Papers? ● Was ist der status quo? ● Was waren die Visionen für „heute“ (2013)? ● Welche Klassen von Geräten werden vorgestellt? ● Fallbeispiel für Ubiquitous Computing? Software ubiquitärer Systeme: 1. Übung Überblick ● Organisatorisches ● Mark Weiser ● C++ Crashkurs ● LCD-Programmierung Software ubiquitärer Systeme: 1. Übung SuS: Einführung C++ ● Grundlage für die Rechnerübungen ● Voraussetzungen: – ● Programmierkenntnisse in einer objektorientierten Sprache (z.B. Java) Wir konzentrieren uns auf die Unterschiede zwischen Java und C++ – ...und die kleinen Eigenheiten, auf die man achten muss, wenn man C++ für Systemprogrammierung einsetzt... Software ubiquitärer Systeme: 1. Übung Literatur ● Es gibt jede Menge Bücher und Tutorials zu C++... ● Eine gute Einführung (€ 17,95) ist – ● Kostenlos und gut – Folien und Skript von Prof. Ring, Uni Siegen: – ● Marko Meyer: „C++ programmieren im Klartext“ Pearson Verlag, ISBN 3-8273-7093-0 http://www.math.uni-siegen.de/ring/cpp.html ...und außerdem der Kurs „Von Java nach C++“ von Prof. Müller und Frank Weichert – die Basis für diese Folien – http://ess.cs.tudortmund.de/Teaching/WS2012/BSB/Downloads/Java2C.pdf Software ubiquitärer Systeme: 1. Übung C++ ● Wie so üblich: „Hello, World“ in C++ #include <iostream> int main() { std::cout << "Hello, world" << std::endl; return 0; } ● Java-Version: import whatever.u.like.*; class Test { public static void main(String[] argv) { System.out.println("Hello, world"); } } Software ubiquitärer Systeme: 1. Übung C++-Konzepte ● Kontrollstrukturen und Variablentypen in C++ ● Komplexe Datentypen (structs) ● Zeiger (Pointer) und Referenzen ● Quelltextorganisation ● Vererbung und Mehrfachvererbung ● Virtuelle Funktionen Software ubiquitärer Systeme: 1. Übung Kontrollstrukturen und Variablentypen ● bedingte Anweisungen, Schleifen, Verbundanweisungen (Blöcke) – ● sind identisch in C++ und Java! In C++ sind „globale“ Funktionen möglich, in Java dagegen müssen Methoden immer innerhalb einer Klasse stehen – insbesondere lassen sich in C++ auch „normale“ C- und Assembler-Funktionen aufrufen – ...und man kann C++-Funktionen als von C und Assembler aufrufbar deklarieren mittels extern „C“ (wird für die Rechnerübungen aber nicht benötigt) – eine wichtige globale Funktion ist die „main“-Funktion :-) Software ubiquitärer Systeme: 1. Übung Kontrollstrukturen und Variablentypen ● ● Arrays (Felder) werden in C++ wie folgt definiert: Es findet keine Überprüfung der Array-Grenzen statt! – ● ● int a[4]; // oder mit Initialisierung int a[] = { 1, 2, 3 }; Potentiell großes Sicherheitsproblem: „Buffer Overflows“, bei denen z.B. über die Grenzen von Arrays hinaus Werte (andere Variableninhalte, Rücksprungadressen auf dem Stack etc.) überschrieben werden Variablen haben keine Default-Werte, müssen also immer explizit initialisiert werden. Erfolgt das nicht, generiert der Compiler eine warning (aber keinen error!) Die Speicherverwaltung muss durch den Programmierer erfolgen. Ein Garbage Collector wie in Java ist nicht vorhanden Software ubiquitärer Systeme: 1. Übung Typwandlung (type casting) ● In C++ können Typen – wie in Java – explizit gewandelt werden: – (Typ) Ausdruck, z.B.: int a=3; double b=(double)a/2; // b==1.5 ● Eine weitere Möglichkeit, die nur in C++ verfügbar ist: – Typ(Ausdruck), z.B.: int a=3; double b=double(a)/2; // b==1.5 Software ubiquitärer Systeme: 1. Übung Wertebereiche ● ● ● In C++ existieren vorzeichenbehaftete und nicht vorzeichenbehaftete Typen (char, short, int, long), z.B.: – int von -2^15 bis 2^15-1 – unsigned int von 0 bis 2^16-1 Bei arithmetischen Operationen erfolgt keine Überprüfung auf Overflow bzw. Underflow! → Sicherheitsproblem! Die Wertebereiche sind maschinenabhängig! – ● unsigned int i=0; i = i – 1; // i==65535 z.B. kann ein int 16, 32 oder 64 Bit „lang“ sein Mittels typedef lassen sich neue Namen für Datentypen definieren: typedef int Index; Index a = 3; Software ubiquitärer Systeme: 1. Übung Komplexe Datentypen ● enums: Aufzählungstypen enum { BUTTON_DOWN = (1<<0), BUTTON_UP = (1<<4) }; Oft Alternative zu #defines ● structs: Benutzerdefinierte zusammengesetzte Datentypen struct Rechteck { int xp, yp; int width, height; int color; ... }; ● Verwendung: Rechteck r; r.xp = 100; r.yp = 200; r.width = 20; r.height = 40; Software ubiquitärer Systeme: 1. Übung Klassen in C++ ● Eine Klasse in C++ besteht aus – Deklaration in Headerdatei (z.B. lcd.h) class LCD { ... }; – und Implementierungsdatei (lcd.cc) #include “machine/lcd.h“ ... – Name der .h/.cc-Files und Name der Klasse müssen nicht übereinstimmen! Software ubiquitärer Systeme: 1. Übung Aufbau der Headerdatei ● Ausschnitt aus lcd.h: class LCD { private: unsigned char mode; // Attribute ... public: LCD (); // Konstruktor ~LCD (); // Destruktor void clear(); // Methoden void show_number(int line, int number); }; Software ubiquitärer Systeme: 1. Übung Aufbau der Headerdatei ● Beginn der Klassendefinition mit Schlüsselwort „class“ ● Klassen sind immer public ● Attribute – ● (Instanz-)Variablen dürfen bei der Deklaration nicht initialisiert werden Konstruktoren und Destrukturen – Konstruktoren: Instanziierung von Objekten – Destruktoren: Löschen instanziierter Objekte ● Deklaration von Methoden ● Klassendefinition wird mit Semikolon beendet! Software ubiquitärer Systeme: 1. Übung Aufbau der Implementierungsdatei ● ● Einbinden der Header-Datei mit #include Durch den Klassennamen und den Bereichsoperator „::“ wird die Zugehörigkeit zur Klasse gekennzeichnet: #include “lcd.h“ LCD::LCD () { ... } LCD::~LCD () {} void LCD::clear () { ... } Software ubiquitärer Systeme: 1. Übung Pointer (Zeiger) ● Jede Speicherstelle, die einem Objekt (einer Variablen) zugeordnet ist, hat eine eindeutige Adresse – ● Bei der Systemprogrammierung kann dies auch die Speicherstelle sein, an der ein bestimmtes Gerät Speicher oder Kontrollregister einblendet — z.B. der Bildschirmspeicher Ein Pointer ist eine Variable, deren Wert die Speicheradresse einer Variablen, einer Struktur oder eines Objekts ist ● Pointer sind typisiert, z.B. Typ “Zeiger auf int” ● Zeiger-Typen sind durch das Symbol „*“ gekennzeichnet: int a; // kein Pointer int *int_zeiger; // Zeiger auf Integer-Variable Software ubiquitärer Systeme: 1. Übung Pointer (Zeiger) ● ● Der Inhalt eines Zeigers ist der Wert, der an einer referenzierten Speicherstelle gespeichert ist Die Größe des Inhalts (in Bytes) ist vom jeweiligen zugeordneten Datentyp abhängig – z.B. 1 Byte für char, 2 Byte für short usw. – Diese Größen sind in C/C++ architektur- und compilerabhängig, also nicht portabel !!! Software ubiquitärer Systeme: 1. Übung Pointer (Zeiger) Es existieren zwei Operatoren zu Pointern: ● Adressoperator „&“ – ● Liefert die zu einer Variablen gehörende Speicheradresse int_zeiger = &a; Dereferenzierungsoperator „*“ – Gibt den Wert zurück, der an der Adresse gespeichert ist, auf die die Pointervariable zeigt (den Inhalt) *int_zeiger = 42; Software ubiquitärer Systeme: 1. Übung Pointer (Zeiger): Beispiel Anlegen einer Zeigervariablen LCD_BASE (Zeiger auf char) Umwandlung einer konstanten Adresse in einen Zeiger char *LCD_BASE = (char *)0x0a00; char *pos; int offset=0x20, x=1; pos = LCD_BASE + offset + x; *pos = 0; Dereferenzierung: Das Zeichen an Position x wird durch eine 0 überschrieben. Zeigerarithmetik: 'pos' zeigt nun auf die Speicherstelle, in der der Zeichencode des Zeichens an Position x abgelegt ist. Software ubiquitärer Systeme: 1. Übung Referenzen als Parameter ● Neben den Zeigern gibt es in C++ auch “Referenzen”. Diese werden häufig für Funktionsparameter benutzt: int& max(int& a, int& b) { if (a>b) return a; else return b; } ● Dies entspricht einem „call by reference“, d.h. es wird eine Referenz auf die entsprechende Variable übergeben und auch zurückgegeben. Der Aufruf erfolgt dann so: int a=5, b=7; max(a,b)++; // erhöht b um 1! Software ubiquitärer Systeme: 1. Übung Systemprogrammierung in C++ ● Keine Laufzeitumgebung vorhanden! – ● ● Damit sind auch keine Objekte dynamisch instanziierbar! – kein „new“ und „delete“ möglich... – ...woher soll auch die passende Speicherverwaltung dazu kommen? Für Spezialisten... das geht auch nicht: – ● man muss alles selber von Hand bauen... Exceptions, Assertions, runtime type information Ein falscher Pointer kann das Ende sein... – der Microcontroller hängt und das war's – keine „segmentation violation“, keine core dumps Software ubiquitärer Systeme: 1. Übung Überblick ● Organisatorisches ● Mark Weiser ● C++ Crashkurs ● LCD-Programmierung Software ubiquitärer Systeme: 1. Übung LCD-Controller ● Direkte Kontrolle von LCDs ● Anzeigespeicher ● Autom. Signalerzeugung und -wiederholung ● Autom. Blinken ● Software-Kontrastkontrolle Software ubiquitärer Systeme: 1. Übung LCD-Controller (2) ● „Bildschirm-“Speicher für Segmentinhalte – Kein permanenter Refresh in Software notwendig! – Memory-mapped I/O char *LCD_BASE = (char *)0x0a00; char *pos; int offset=0x20, x=1; pos = LCD_BASE + offset + x; *pos = 0; Software ubiquitärer Systeme: 1. Übung