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