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
systemtickuml [2019/02/04 14:10]
127.0.0.1 Externe Bearbeitung
systemtickuml [2019/07/25 21:42] (aktuell)
huwi [Realisierung]
Zeile 5: Zeile 5:
 Diese Übung wird wiederum eine einfache Verwendung der //​SysTickFunction//​ zur Generierung zyklischer Ausgaben demonstrieren. Wir lassen die LEDs auf dem Board unterschiedlich blinken. Das folgende Blockbild verdeutlicht,​ welche Bausteine bei dieser Aufgabe eine Rolle spielen. Vergleichen Sie diese vereinfachte Darstellung mit dem [[http://​www.mystm32.de/​lib/​exe/​detail.php?​id=systemtickc&​cache=cache&​media=blockbildstm32f4.jpg|Blockbild]] aus dem Datenblatt. Diese Übung wird wiederum eine einfache Verwendung der //​SysTickFunction//​ zur Generierung zyklischer Ausgaben demonstrieren. Wir lassen die LEDs auf dem Board unterschiedlich blinken. Das folgende Blockbild verdeutlicht,​ welche Bausteine bei dieser Aufgabe eine Rolle spielen. Vergleichen Sie diese vereinfachte Darstellung mit dem [[http://​www.mystm32.de/​lib/​exe/​detail.php?​id=systemtickc&​cache=cache&​media=blockbildstm32f4.jpg|Blockbild]] aus dem Datenblatt.
  
->>>​{{:​hallosystickblockbild.jpg?​650|}}+>​{{:​hallosystickblockbild.jpg?​650|}}
  
 Die vier LEDs auf dem STM32F4 Discovery sind immer noch fest mit den Pins D12 bis D15 verbunden. Der SystemTick soll so konfiguriert werden, dass dieses Ereignis alle 10 Millisekunden eintritt. Die Takt-Versorgung des GPIO Ports D erfolgt, wie wir wissen, über AHB1. Fassen wir die Aufgaben zusammen: Die vier LEDs auf dem STM32F4 Discovery sind immer noch fest mit den Pins D12 bis D15 verbunden. Der SystemTick soll so konfiguriert werden, dass dieses Ereignis alle 10 Millisekunden eintritt. Die Takt-Versorgung des GPIO Ports D erfolgt, wie wir wissen, über AHB1. Fassen wir die Aufgaben zusammen:
Zeile 21: Zeile 21:
 Die Aufgabe besteht darin die vier Led's anzusteuern. Folgen wir der objektorientierten Sichtweise sind die rote, blaue, grüne und orange LED Objekte und können über eine Klasse mit dem Namen //Led// abstrahiert werden. Die Klasse //Led// soll die spezifischen Merkmale (Struktur und Verhalten) von typischen LEDs auf der Anwenderebene abstrahieren. Also fragen wir uns was die vier LEDs denn aus Anwendersicht so tun sollen. Diese können an oder aus sein, sie können ihren Zustand wechseln, also umschalten. Tun die LEDs das zyklisch, blinken sie. Die Aufgabe besteht darin die vier Led's anzusteuern. Folgen wir der objektorientierten Sichtweise sind die rote, blaue, grüne und orange LED Objekte und können über eine Klasse mit dem Namen //Led// abstrahiert werden. Die Klasse //Led// soll die spezifischen Merkmale (Struktur und Verhalten) von typischen LEDs auf der Anwenderebene abstrahieren. Also fragen wir uns was die vier LEDs denn aus Anwendersicht so tun sollen. Diese können an oder aus sein, sie können ihren Zustand wechseln, also umschalten. Tun die LEDs das zyklisch, blinken sie.
  
->>>​{{:​anwendersichtsystick.jpg?​500|}}+>​{{:​anwendersichtsystick.jpg?​500|}}
  
 Schauen wir uns noch mal kurz die Systemarchitektur des Framework an. Unsere Klasse //​Controller//​ hat alle Eigenschaften des //​PecAppKernel//​ und dieser wiederum alle Merkmale eines //​PecAppModul//​. ​ Schauen wir uns noch mal kurz die Systemarchitektur des Framework an. Unsere Klasse //​Controller//​ hat alle Eigenschaften des //​PecAppKernel//​ und dieser wiederum alle Merkmale eines //​PecAppModul//​. ​
Zeile 29: Zeile 29:
 Die Klasse //​Controller//​ überschreibt die virtuellen Operationen //onStart// und //onWork// des //​PecAppModul//​. Es ist zu erkennen, dass der //​PecAppKernel//​ bereits über einen SysTick-Ereignishandler verfügt. Diesen könnten wir überschreiben,​ um das SysTick-Ereignis zu empfangen. Schauen wir uns vorher aber noch mal das folgende Sequenzdiagramm an. Die Klasse //​Controller//​ überschreibt die virtuellen Operationen //onStart// und //onWork// des //​PecAppModul//​. Es ist zu erkennen, dass der //​PecAppKernel//​ bereits über einen SysTick-Ereignishandler verfügt. Diesen könnten wir überschreiben,​ um das SysTick-Ereignis zu empfangen. Schauen wir uns vorher aber noch mal das folgende Sequenzdiagramm an.
  
->>>​{{:​systickseq.jpg?​300|}}+>​{{:​systickseq.jpg?​300|}}
  
 Der SysTick wird demzufolge an den PecAppKernel und alle PecAppModule verteilt. Dabei werden aus dem SysTick-Ereignis die Ereignisse für 10 Millisekunden,​ 100 Millisekunden und 1 Sekunde generiert. ​ Der SysTick wird demzufolge an den PecAppKernel und alle PecAppModule verteilt. Dabei werden aus dem SysTick-Ereignis die Ereignisse für 10 Millisekunden,​ 100 Millisekunden und 1 Sekunde generiert. ​
Zeile 43: Zeile 43:
 Wenn wir die Led hereingezogen haben verbinden wir diese mit der Anwendung. 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// mit der Multiplizität //4//. Die Anwendung hat jetzt vier Leds.  Wenn wir die Led hereingezogen haben verbinden wir diese mit der Anwendung. 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// mit der Multiplizität //4//. Die Anwendung hat jetzt vier Leds. 
  
->>>​{{:​ledaggregierensystick.png?​500|}}+>​{{:​ledaggregierensystick.png?​500|}}
  
  
Zeile 53: Zeile 53:
   - Bestätigen Sie Ihre Auswahl.   - Bestätigen Sie Ihre Auswahl.
  
->>​{{:​on10msueberschreiben.png?​750|}}+>​{{:​on10msueberschreiben.png?​750|}}
  
  
Zeile 59: Zeile 59:
  
  
->>>​{{:​systickuml.png?​500|}}+>​{{:​systickuml.png?​500|}}
  
 ===== Realisierung ===== ===== Realisierung =====
Zeile 65: Zeile 65:
  
 **Controller::​onStart:​** **Controller::​onStart:​**
->>><​code cpp>+><​code cpp>
 led[0].config(GPIOD,​BIT12);​ led[0].config(GPIOD,​BIT12);​
 led[1].config(GPIOD,​BIT13);​ led[1].config(GPIOD,​BIT13);​
Zeile 79: Zeile 79:
  
 **Controller::​onWork:​** **Controller::​onWork:​**
->>><​code cpp>+><​code cpp>
 led[0].on();​ led[0].on();​
 waitMs(100);​ waitMs(100);​
Zeile 93: Zeile 93:
  
 **Controller::​onTimer10ms:​** **Controller::​onTimer10ms:​**
->>><​code cpp>+><​code cpp>
 led[1].toggle();​ led[1].toggle();​
 </​code>​ </​code>​
Zeile 100: Zeile 100:
  
 **Controller::​onEvent100ms:​** **Controller::​onEvent100ms:​**
->>><​code cpp>+><​code cpp>
 led[2].toggle();​ led[2].toggle();​
 </​code>​ </​code>​
Zeile 107: Zeile 107:
  
 **Controller::​onEvent1s:​** **Controller::​onEvent1s:​**
->>><​code cpp>+><​code cpp>
 led[3].toggle();​ led[3].toggle();​
 </​code>​ </​code>​
Zeile 133: Zeile 133:
 Und hier diesen Abschnitt wiederum als Videozusammenfassung. Und hier diesen Abschnitt wiederum als Videozusammenfassung.
  
->>><​html><​iframe width="​640"​ height="​400"​ src="​https://​www.youtube.com/​embed/​QHxU48vDHCI"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​+><​html><​iframe width="​640"​ height="​400"​ src="​https://​www.youtube.com/​embed/​QHxU48vDHCI"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​
  
 ====== Übung ====== ====== Übung ======