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
hallo_uml [2019/02/04 14:10]
127.0.0.1 Externe Bearbeitung
hallo_uml [2019/07/25 17:26] (aktuell)
huwi
Zeile 10: Zeile 10:
 Falls Sie jetzt noch das Klassendiagramm geöffnet haben wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt nach oben. Falls das Projekt nicht mehr geöffnet ist, öffnen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache //ARM C++//. Beachten Sie die Einstellungen für die Zielplattform STM32F407-Discovery. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie aus dem SiSy LibStore die Diagrammvorlage //​Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR)//. Weisen Sie das Treiberpaket für //STM32F4// zu.  Falls Sie jetzt noch das Klassendiagramm geöffnet haben wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt nach oben. Falls das Projekt nicht mehr geöffnet ist, öffnen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache //ARM C++//. Beachten Sie die Einstellungen für die Zielplattform STM32F407-Discovery. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie aus dem SiSy LibStore die Diagrammvorlage //​Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR)//. Weisen Sie das Treiberpaket für //STM32F4// zu. 
  
->>​{{:​neueskldhallo.jpg?​350|}}{{:​pecapplication.jpg?​310|}}+>​{{:​neueskldhallo.jpg?​350|}}{{:​pecapplication.jpg?​310|}}
  
->>​{{:​umlprojekt7gg.jpg?​350|}}+>​{{:​umlprojekt7gg.jpg?​350|}}
  
  
Zeile 19: Zeile 19:
 Die Aufgabe besteht darin eine LED anzusteuern. Folgen wir der objektorientierten Sichtweise, ist die //Led// unser Klassenkandidat. Eine Klasse //Led// soll die spezifische Initialisierung und Programmierung eines GPIO Pin auf der Anwenderebene abstrahieren. Also fragen wir uns, was eine LED denn aus Anwendersicht so tut. Sie kann an oder aus sein, vielleicht blinkt sie ja auch.  Die Aufgabe besteht darin eine LED anzusteuern. Folgen wir der objektorientierten Sichtweise, ist die //Led// unser Klassenkandidat. Eine Klasse //Led// soll die spezifische Initialisierung und Programmierung eines GPIO Pin auf der Anwenderebene abstrahieren. Also fragen wir uns, was eine LED denn aus Anwendersicht so tut. Sie kann an oder aus sein, vielleicht blinkt sie ja auch. 
  
->>>​{{:​anwendersichtledan.jpg?​400|}}+>​{{:​anwendersichtledan.jpg?​400|}}
  
 Die Abbildung genau dieser Verhaltensmerkmale fordern wir von der Klasse //Led//. Sich mit //​GPIO_OTYP_PP//​ und //​AHB1PeriphCmd//​ herumzuschlagen ist mit Sicherheit wichtig, um zu erlernen, wie ARM Controller intern funktionieren und um ggf. eigene Klassen für die Erweiterung der Bibliothek zu realisieren. Aber es ist für die Lösung eines konkreten Anwendungsproblems eher zeitfressend und vielleicht sogar kontraproduktiv. Welcher GUI-Entwickler kümmert sich noch wie vor 25 Jahren von Hand um //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644943(v=vs.85).aspx|Peek-]]//,​ //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644936(v=vs.85).aspx|Get-]]//,​ //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644955(v=vs.85).aspx|Translate-]]//​ und //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644934(v=vs.85).aspx|DispatcheMessage]]//,​ nur weil es grundlegende und extrem wichtige Funktionen in einer grafischen Benutzeroberfläche sind. Er möchte eine konkrete Anwendung schreiben. Dazu reicht das Grundverständnis der Funktionsweise einer GUI und eine leistungsfähige Klassenbibliothek. Die Abbildung genau dieser Verhaltensmerkmale fordern wir von der Klasse //Led//. Sich mit //​GPIO_OTYP_PP//​ und //​AHB1PeriphCmd//​ herumzuschlagen ist mit Sicherheit wichtig, um zu erlernen, wie ARM Controller intern funktionieren und um ggf. eigene Klassen für die Erweiterung der Bibliothek zu realisieren. Aber es ist für die Lösung eines konkreten Anwendungsproblems eher zeitfressend und vielleicht sogar kontraproduktiv. Welcher GUI-Entwickler kümmert sich noch wie vor 25 Jahren von Hand um //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644943(v=vs.85).aspx|Peek-]]//,​ //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644936(v=vs.85).aspx|Get-]]//,​ //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644955(v=vs.85).aspx|Translate-]]//​ und //​[[http://​msdn.microsoft.com/​en-us/​library/​windows/​desktop/​ms644934(v=vs.85).aspx|DispatcheMessage]]//,​ nur weil es grundlegende und extrem wichtige Funktionen in einer grafischen Benutzeroberfläche sind. Er möchte eine konkrete Anwendung schreiben. Dazu reicht das Grundverständnis der Funktionsweise einer GUI und eine leistungsfähige Klassenbibliothek.
Zeile 39: Zeile 39:
 Wir könnten die eine einfachere Klasse benutzen, die einen simplen IO-Pin abbildet, aber was soll's ... nehmen wir die sexy Led. Dazu ziehen wir die Led aus dem Navigator bzw. Explorer per Drag & Drop in das Klassendiagramm. Wir könnten die eine einfachere Klasse benutzen, die einen simplen IO-Pin abbildet, aber was soll's ... nehmen wir die sexy Led. Dazu ziehen wir die Led aus dem Navigator bzw. Explorer per Drag & Drop in das Klassendiagramm.
  
->>>​>​{{:​dragdropled.png?​500|}} ​+>​{{:​dragdropled.png?​500|}} ​
  
 Wenn wir die Led hereingezogen haben müssen wir diese mit der Anwendung verbinden. Vergleichen Sie dazu die Ausführungen zur Aggregation im Grundlagenteil dieses Tutorials. Selektieren Sie dazu die Klasse //​Controller//​. Am unteren Rand erscheint eine große, rote Selektionsmarke. Das ist der //​Verteiler//​. Ziehen Sie von hier aus per Drag & Drop eine Verbindung von der Klasse //​Controller//​ zur Klasse //Led//. Wählen Sie als Verbindungstyp die Aggregation und als Rollenbezeichner //+led//. Der Controller hat jetzt eine Led.  Wenn wir die Led hereingezogen haben müssen wir diese mit der Anwendung verbinden. Vergleichen Sie dazu die Ausführungen zur Aggregation im Grundlagenteil dieses Tutorials. Selektieren Sie dazu die Klasse //​Controller//​. Am unteren Rand erscheint eine große, rote Selektionsmarke. Das ist der //​Verteiler//​. Ziehen Sie von hier aus per Drag & Drop eine Verbindung von der Klasse //​Controller//​ zur Klasse //Led//. Wählen Sie als Verbindungstyp die Aggregation und als Rollenbezeichner //+led//. Der Controller hat jetzt eine Led. 
  
->>>​>​{{:​ledaggregieren.png?​500|}}+>​{{:​ledaggregieren.png?​500|}}
  
  
Zeile 57: Zeile 57:
   * Das Attribut //led// der Klasse Controller ist öffentlich   * Das Attribut //led// der Klasse Controller ist öffentlich
  
->>>​{{:​uml:​umlhalloarm.jpg|}}+>​{{:​uml:​umlhalloarm.jpg|}}
  
 Die Aufgabenstellung fordert, dass die blaue LED einzuschalten ist. Diese ist bekanntlich an Pin D15 angeschlossen. Für die Initialisierung von Geräten steht die Operation //onStart// zur Verfügung. Selektieren Sie diese Operation und geben im Quelltexteditor folgenden Code ein: Die Aufgabenstellung fordert, dass die blaue LED einzuschalten ist. Diese ist bekanntlich an Pin D15 angeschlossen. Für die Initialisierung von Geräten steht die Operation //onStart// zur Verfügung. Selektieren Sie diese Operation und geben im Quelltexteditor folgenden Code ein:
  
->>>​**Controller::​onStart:​** +>​**Controller::​onStart:​** 
->>><​code cpp>+><​code cpp>
 led.config(GPIOD,​BIT15);​ led.config(GPIOD,​BIT15);​
 </​code>​ </​code>​
Zeile 68: Zeile 68:
 Beobachten Sie gleichzeitig das rechts neben dem Quelltexteditor befindliche Sequenzdiagramm. Dies wird automatisch aus dem von Ihnen eingegebenen Code erzeugt. Das Sequenzdiagramm kann zum einen für Dokumentationszwecke genutzt werden zum anderen soll es gleichzeitig als Review für den Quellcode dienen. ​ Beobachten Sie gleichzeitig das rechts neben dem Quelltexteditor befindliche Sequenzdiagramm. Dies wird automatisch aus dem von Ihnen eingegebenen Code erzeugt. Das Sequenzdiagramm kann zum einen für Dokumentationszwecke genutzt werden zum anderen soll es gleichzeitig als Review für den Quellcode dienen. ​
  
->>>​{{:​ledconfig.jpg?​250|}}+>​{{:​ledconfig.jpg?​250|}}
  
 Selektieren sie danach die Operation //onWork// und geben den folgenden Code ein: Selektieren sie danach die Operation //onWork// und geben den folgenden Code ein:
  
->>>​**Controller::​onWork:​** +>​**Controller::​onWork:​** 
->>><​code cpp>+><​code cpp>
 led.on(); led.on();
 </​code>​ </​code>​
  
->>>​{{:​ledon.jpg?​250|}}+>​{{:​ledon.jpg?​250|}}
  
  
Zeile 99: Zeile 99:
 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.
  
->>><​html><​iframe width="​640"​ height="​440"​ src="​https://​www.youtube.com/​embed/​GNvT2T8sD6I"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​+><​html><​iframe width="​640"​ height="​440"​ src="​https://​www.youtube.com/​embed/​GNvT2T8sD6I"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​
  
 ====== Übung ====== ====== Übung ======