Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
grundstruktur [2012/04/15 17:30]
huwaldt
grundstruktur [2019/07/27 16:41]
huwi
Zeile 2: Zeile 2:
 Die Grundstruktur einer objektorientierten Anwendung erfordert eine Applikationsklasse oder auch Hauptklasse,​ welche als erstes gestartet wird. Das ist vergleichbar mit der Hauptfunktion in strukturierten Programmiersprachen. Bei Mikrocontrolleranwendungen repräsentiert die Instanz dieser Hauptklasse letztlich die Firmware des Controllers. Dieser Sachverhalt wird in myAVR C++ wie folgt abgebildet: Die Grundstruktur einer objektorientierten Anwendung erfordert eine Applikationsklasse oder auch Hauptklasse,​ welche als erstes gestartet wird. Das ist vergleichbar mit der Hauptfunktion in strukturierten Programmiersprachen. Bei Mikrocontrolleranwendungen repräsentiert die Instanz dieser Hauptklasse letztlich die Firmware des Controllers. Dieser Sachverhalt wird in myAVR C++ wie folgt abgebildet:
  
->>><​code cpp>+><​code cpp>
 // Deklaration der Hauptklasse // Deklaration der Hauptklasse
 class Application { class Application {
Zeile 14: Zeile 14:
 Weil Programmierer <​del>​von Natur aus faul sind</​del>​ gern auf Zeiteffizienz achten, möchten sie möglichst viel wiederverwenden was sie selbst oder auch andere schon programmiert haben. Weil Programmierer <​del>​von Natur aus faul sind</​del>​ gern auf Zeiteffizienz achten, möchten sie möglichst viel wiederverwenden was sie selbst oder auch andere schon programmiert haben.
  
->>><​code cpp>+><​code cpp>
 // Deklaration der Hauptklasse // Deklaration der Hauptklasse
 class Application : public Controller { class Application : public Controller {
Zeile 24: Zeile 24:
 Der Ausdruck **: public** weist den Kompiler an, das die Klasse **Applikation** alle Merkmale der Klasse **Controller** öffentlich,​ also für alle sichtbar, erben soll. Diese Klasse ist im myAVR C++ Framework schon vorhanden. Besonders interessant ist jetzt, was die Klasse Controller bereits kann. Dazu eine kurze Übersicht. Der Ausdruck **: public** weist den Kompiler an, das die Klasse **Applikation** alle Merkmale der Klasse **Controller** öffentlich,​ also für alle sichtbar, erben soll. Diese Klasse ist im myAVR C++ Framework schon vorhanden. Besonders interessant ist jetzt, was die Klasse Controller bereits kann. Dazu eine kurze Übersicht.
  
->>>​{{:​controller.jpg?​500|}}+>​{{:​controller.jpg?​500|}}
  
 Nicht gruseln! Das ist nur ein etwas vereinfachter Ausschnitt aus dem entsprechenden [[http://​de.wikipedia.org/​wiki/​Unified_Modeling_Language|UML]] Klassendiagramm des myAVR C++ Framework. Was wir dort sehen ist, das die Klasse Controller offensichtlich alle Eigenschaften des //ATmega8// besitzt und einen //​AppKernel//​ realisiert. Das Klassetemplate **AppKernel** stellt wesentliche Basisfunktionalitäten zur Verfügung. Diese finden sich als Operationen,​ wie zum Beispiel **onStart**,​ **onWork** oder **onTimer10ms**,​ in der Klasse Controller wieder. Wir erkennen Funktionen für das Hochfahren und den Betrieb des Controllers. An diese Funktionen werden wir uns sehr bald "​ranhängen",​ indem wir selber gleichnamige Operationen schreiben. Der Fachmann bezeichnet das, wie bereits erwähnt, als überschreiben der Operationen. ​ Interessant ist auch die Schnittstellenklasse **AppModul**. Der Controller kennt eine Liste von //​AppModulen//​ und diese verfügen auch über die gleichen Basisfunktionen. Die //​AppModule//​ können ihrerseits Ereignisse an den Controller melden. Nicht gruseln! Das ist nur ein etwas vereinfachter Ausschnitt aus dem entsprechenden [[http://​de.wikipedia.org/​wiki/​Unified_Modeling_Language|UML]] Klassendiagramm des myAVR C++ Framework. Was wir dort sehen ist, das die Klasse Controller offensichtlich alle Eigenschaften des //ATmega8// besitzt und einen //​AppKernel//​ realisiert. Das Klassetemplate **AppKernel** stellt wesentliche Basisfunktionalitäten zur Verfügung. Diese finden sich als Operationen,​ wie zum Beispiel **onStart**,​ **onWork** oder **onTimer10ms**,​ in der Klasse Controller wieder. Wir erkennen Funktionen für das Hochfahren und den Betrieb des Controllers. An diese Funktionen werden wir uns sehr bald "​ranhängen",​ indem wir selber gleichnamige Operationen schreiben. Der Fachmann bezeichnet das, wie bereits erwähnt, als überschreiben der Operationen. ​ Interessant ist auch die Schnittstellenklasse **AppModul**. Der Controller kennt eine Liste von //​AppModulen//​ und diese verfügen auch über die gleichen Basisfunktionen. Die //​AppModule//​ können ihrerseits Ereignisse an den Controller melden.
Zeile 30: Zeile 30:
 ====== Das erste myAVR C++ Programm ====== ====== Das erste myAVR C++ Programm ======
 Für diesen Schritt müssen Sie SiSy installiert und ein myAVR-Board mit ATmega8 an Ihrem PC angeschlossen haben. Starten Sie SiSy und legen Sie ein neues Projekt mit dem Namen "//​Tutorial//"​ an. Wählen Sie das **AVR-Vorgehensmodell** Dann laden Sie bitte **keine Vorlagen** sondern [[kleines Programm anlegen|legen]] ein **kleines Programm** mit dem Namen "//​test1//"​ an, indem sie das entsprechende Objekt per Drag & Drop aus der Objektbibliothek in das Diagramm ziehen. Beachten Sie die korrekten Einstellungen für das myAVR Board. ​ Für diesen Schritt müssen Sie SiSy installiert und ein myAVR-Board mit ATmega8 an Ihrem PC angeschlossen haben. Starten Sie SiSy und legen Sie ein neues Projekt mit dem Namen "//​Tutorial//"​ an. Wählen Sie das **AVR-Vorgehensmodell** Dann laden Sie bitte **keine Vorlagen** sondern [[kleines Programm anlegen|legen]] ein **kleines Programm** mit dem Namen "//​test1//"​ an, indem sie das entsprechende Objekt per Drag & Drop aus der Objektbibliothek in das Diagramm ziehen. Beachten Sie die korrekten Einstellungen für das myAVR Board. ​
->>>​{{:​mcueinstellungen.jpg?​700|}}+ 
 +>​{{:​mcueinstellungen.jpg?​700|}}
  
 Für das kleine Programm ist es wichtig, dass Sie als Zielsprache AVR C++ ausgewählt haben. Sind die Board- und Spracheinstellungen korrekt, könnnen Sie im Dialog zum kleinen Programm die Grundstruktur für ein AVR C++ Programm laden. Dazu wählen Sie im Dialog **Programmgerüst** die entsprechende Vorlage und die Schaltfläche "​**Struktur laden**"​. ​ Für das kleine Programm ist es wichtig, dass Sie als Zielsprache AVR C++ ausgewählt haben. Sind die Board- und Spracheinstellungen korrekt, könnnen Sie im Dialog zum kleinen Programm die Grundstruktur für ein AVR C++ Programm laden. Dazu wählen Sie im Dialog **Programmgerüst** die entsprechende Vorlage und die Schaltfläche "​**Struktur laden**"​. ​
  
->>>​{{:​spracheinstellung.jpg?​340|}} {{:​strukturladen.jpg?​300|}}+>​{{:​spracheinstellung.jpg?​340|}} {{:​strukturladen.jpg?​300|}}
  
 Ihnen sollte jetzt ein kleines Programm mit geladenem Programmgerüst vorliegen. Der Bildschirm von SiSy teilt sich in Navigator (links, im Bild unten ausgeblendet),​ Diagrammfenster mit Objektbibliothek (unten) und den Quelltexteditor (oben). Im Quelltexteditor können Sie den Programmcode des im Diagrammfenster jeweis selektierten Elementes bearbeiten. Alle Übungen dieses Tutorials können in ein und demselben Projekt bearbeitet werden. Es ist lediglich nötig, die Schritte für das Anlegen eines neuen kleinen Programms durchzuführen. Ihnen sollte jetzt ein kleines Programm mit geladenem Programmgerüst vorliegen. Der Bildschirm von SiSy teilt sich in Navigator (links, im Bild unten ausgeblendet),​ Diagrammfenster mit Objektbibliothek (unten) und den Quelltexteditor (oben). Im Quelltexteditor können Sie den Programmcode des im Diagrammfenster jeweis selektierten Elementes bearbeiten. Alle Übungen dieses Tutorials können in ein und demselben Projekt bearbeitet werden. Es ist lediglich nötig, die Schritte für das Anlegen eines neuen kleinen Programms durchzuführen.
  
-{{:​erstesprog.jpg|}}+>{{:​erstesprog.jpg|}}
  
 Die geladene Vorlage enthält folgende Quelltextteile:​ Die geladene Vorlage enthält folgende Quelltextteile:​
Zeile 48: Zeile 49:
     * onWork()     * onWork()
  
->>><​code cpp>+><​code cpp>
 //​---------------------------------------------------------------------- //​----------------------------------------------------------------------
 // Titel     : Grundgerüst einer AVR C++ Anwendung // Titel     : Grundgerüst einer AVR C++ Anwendung
Zeile 90: Zeile 91:
 Attribute müssen zwar nicht, aber sollten als Erstes in der Applikation deklariert werden. Dabei ist empfehlenswert diszipliniert die Schreibweise einzuhalten und jedes Attribut in der Operation //onStart// zu initialisieren. Ein Attribut wird korrekt deklariert, indem die **Sichtbarkeit** gefolgt von einem **Doppelpunkt**,​ der **Typ** und ein **Name** für das Attribut festgelegt werden. Die Deklaration wird mit einem **Semikolon** abgeschlossen. Der Name des Attributes sollte klein geschrieben werden. Attribute müssen zwar nicht, aber sollten als Erstes in der Applikation deklariert werden. Dabei ist empfehlenswert diszipliniert die Schreibweise einzuhalten und jedes Attribut in der Operation //onStart// zu initialisieren. Ein Attribut wird korrekt deklariert, indem die **Sichtbarkeit** gefolgt von einem **Doppelpunkt**,​ der **Typ** und ein **Name** für das Attribut festgelegt werden. Die Deklaration wird mit einem **Semikolon** abgeschlossen. Der Name des Attributes sollte klein geschrieben werden.
  
->>><​code cpp>+><​code cpp>
     // Sichtbarkeit:​ Typ name;     // Sichtbarkeit:​ Typ name;
     protected: uint8_t wert;     protected: uint8_t wert;
Zeile 97: Zeile 98:
 Ähnliches gilt für die Schreibweise von Operationen. Diese besitzen ebenfalls eine Sichtbarkeit,​ einen Typ, einen Namen, der klein beginnen sollte, zusätzlich eine Parameterliste in runden Klammern und den eigentlichen Funktionskörper in geschweifter Klammer. Wenn die Operation keinen Rückgabewert liefert, wird der Typ als //void// (leer) angegeben. Wenn keine Parameter übergeben werden, sind in C und C++ trotzdem die leeren Klammern zu notieren oder eben auch als void zu deklarieren. Ähnliches gilt für die Schreibweise von Operationen. Diese besitzen ebenfalls eine Sichtbarkeit,​ einen Typ, einen Namen, der klein beginnen sollte, zusätzlich eine Parameterliste in runden Klammern und den eigentlichen Funktionskörper in geschweifter Klammer. Wenn die Operation keinen Rückgabewert liefert, wird der Typ als //void// (leer) angegeben. Wenn keine Parameter übergeben werden, sind in C und C++ trotzdem die leeren Klammern zu notieren oder eben auch als void zu deklarieren.
  
->>><​code cpp>+><​code cpp>
     // Sichtbarkeit:​ Typ name ( Parameter ) { Funktionskörper }     // Sichtbarkeit:​ Typ name ( Parameter ) { Funktionskörper }
     public: bool meineOperationX ( char parameter1, int parameter2 )      public: bool meineOperationX ( char parameter1, int parameter2 ) 
Zeile 113: Zeile 114:
 Die Operationen **onStart()** und **onWork()** sind genau dieselben wie die in der Basisklasse bereits vorhandenen. Sie wurden durch uns **überschrieben**,​ was soviel bedeutet wie dem Kompiler mitzuteilen,​ dass unsere Operationen und nicht die der Basisklasse die gültigen sind. Diese auf den ersten Blick etwas eigenwillige Vorgehensweise dient dazu, vorweg vereinbarte bzw. definierte Namen von Operationen (Nachrichten) zur Verfügung zu haben. Da die Namen der Operationen schon bekannt sind bevor wir als Programmierer diese überschrieben haben, kann der Entwickler von anderen Klassen, zum Beispiel aus einem anderen Teilprojekt oder wie in unserem Fall der Entwickler des myAVR Frameworks, diese Operationen aufrufen bevor sie programmiert wurden. Diese vorab vereinbarten Operationen bilden die Schnittstelle zwischen dem Entwickler des Framework und uns. Im Framework wurde so programmiert,​ dass die Operation //onStart// genau einmal nach dem Einschalten des Controllers und die Operation //onWork// ständig wiederholend,​ so lange der Controller arbeitet, aufgerufen wird. Vergleichen Sie dazu das folgende Sequenzdiagramm. Die Operationen **onStart()** und **onWork()** sind genau dieselben wie die in der Basisklasse bereits vorhandenen. Sie wurden durch uns **überschrieben**,​ was soviel bedeutet wie dem Kompiler mitzuteilen,​ dass unsere Operationen und nicht die der Basisklasse die gültigen sind. Diese auf den ersten Blick etwas eigenwillige Vorgehensweise dient dazu, vorweg vereinbarte bzw. definierte Namen von Operationen (Nachrichten) zur Verfügung zu haben. Da die Namen der Operationen schon bekannt sind bevor wir als Programmierer diese überschrieben haben, kann der Entwickler von anderen Klassen, zum Beispiel aus einem anderen Teilprojekt oder wie in unserem Fall der Entwickler des myAVR Frameworks, diese Operationen aufrufen bevor sie programmiert wurden. Diese vorab vereinbarten Operationen bilden die Schnittstelle zwischen dem Entwickler des Framework und uns. Im Framework wurde so programmiert,​ dass die Operation //onStart// genau einmal nach dem Einschalten des Controllers und die Operation //onWork// ständig wiederholend,​ so lange der Controller arbeitet, aufgerufen wird. Vergleichen Sie dazu das folgende Sequenzdiagramm.
  
->>>>​>​{{:​seq_grundstruktur.jpg?​300|}}+>​{{:​seq_grundstruktur.jpg?​300|}}
  
 Obwohl das Programm noch gar nichts tut wollen wir erst einmal sehen, ob die Programmierung des Controllers funktioniert. Dazu lösen wir über die Schaltflächen im oberen Bereich des Quelltextfensters nacheinander folgende Aktionen aus: Obwohl das Programm noch gar nichts tut wollen wir erst einmal sehen, ob die Programmierung des Controllers funktioniert. Dazu lösen wir über die Schaltflächen im oberen Bereich des Quelltextfensters nacheinander folgende Aktionen aus:
Zeile 120: Zeile 121:
   * Brennen, //Das lauffähige Programm (*.elf) wird über den Programmer oder den Bootloader in den Programmspeicher (FLASH) des Controllers übertragen //   * Brennen, //Das lauffähige Programm (*.elf) wird über den Programmer oder den Bootloader in den Programmspeicher (FLASH) des Controllers übertragen //
  
->>>​{{:​brennen.jpg?​700|}}+>​{{:​brennen.jpg?​700|}}
  
 Sie können das Protokoll für die ausgeführten Aktionen im Ausgabefenster einsehen. Sollten Fehler aufgetreten sein, werden diese hier angezeigt. Sie können das Protokoll für die ausgeführten Aktionen im Ausgabefenster einsehen. Sollten Fehler aufgetreten sein, werden diese hier angezeigt.
  
->>>>​>​{{:​ausgabefenster.jpg?​400|}}+>​{{:​ausgabefenster.jpg?​400|}}
  
 Glückwunsch! Sie haben das erste AVR C++ Programm auf ihren Controller //​geflasht//​. ​ Glückwunsch! Sie haben das erste AVR C++ Programm auf ihren Controller //​geflasht//​. ​
Zeile 131: Zeile 132:
 Und weil es so schön war hier das Ganze noch mal als Video. Und weil es so schön war hier das Ganze noch mal als Video.
  
->>><flashplayer ​width="​700"​ height="​550" ​position="0">​file=http://youtu.be/​fvtB9LE9P5c</​flashplayer> +><html><iframe ​width="​700"​ height="​550" ​src="https://www.youtube.com/​embed/​fvtB9LE9P5c" frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen>​</iframe></html>
- +
->>>​[[http:​//​youtu.be/​fvtB9LE9P5c|besser auf youTube]]+
  
 ====== Nächstes Thema ====== ====== Nächstes Thema ======
 [[Hallo C++|Hallo myAVR C++]] [[Hallo C++|Hallo myAVR C++]]