Modellgestütztes Software Engineering Versuch 5 Wintersemester 2016 Version 8.0.1, 13. Dezember 2016 Modellgestütztes Software Engineering– Aufgabe 5 Inhalt 1 DIE ENTWICKLUNGSUMGEBUNG .............................................................................................................. 3 1.1 1.2 1.3 a) b) c) d) e) f) 2 HARDWARE MCB1700 .................................................................................................................................. 3 EMBEDDED UML MIT DEM REALTIME EXECUTION FRAMEWORK RXF VON WILLERT.................................. 3 NEUES PROJEKT FÜRS ZIELSYSTEM ............................................................................................................... 4 Projekt anlegen .............................................................................................................................. 4 Profil auswählen ............................................................................................................................ 4 Benennungen anpassen ................................................................................................................ 5 Stereotype festlegen ...................................................................................................................... 5 Diagramme anlegen ...................................................................................................................... 6 Standard Header LPC17xx.h einbinden ........................................................................................ 6 KOMPONENTEN DES BOARDS ..................................................................................................................... 8 2.1 a) b) c) d) e) 2.2 2.3 a) 2.4 2.5 a) ERSTES PROJEKT MIT DEN PORT LEDS ........................................................................................................... 8 LED mit einer HAL-Klasse cLed0 ohne eigenes Verhalten ........................................................... 8 Generate Make and Run ............................................................................................................. 10 LED mit einer intelligenten Klasse ansteuern .............................................................................. 12 Aufgabe LED1: ............................................................................................................................ 12 Frei konfigurierbare cLed Klasse ................................................................................................. 13 TASTERINT0 IM POLLING BETRIEB ............................................................................................................. 15 JOYSTICK ..................................................................................................................................................... 16 Aufgabe Joystick:......................................................................................................................... 16 LCD-TFT DISPLAY-PANEL 240X320 .......................................................................................................... 17 POTI ............................................................................................................................................................. 20 Aufgabe Poti ................................................................................................................................ 20 3 PROJEKT .......................................................................................................................................................... 21 4 AUFGABEN ....................................................................................................................................................... 22 a) b) c) d) e) 5 Aufgabe LED1 □ ......................................................................................................................... 22 Aufgabe Joystick □ ...................................................................................................................... 22 Erklärung Polymorphie □ ............................................................................................................. 22 Aufgabe Poti □ ............................................................................................................................. 22 Ihre Projektidee:........................................................................................................................... 22 LITERATUR ..................................................................................................................................................... 23 2 Modellgestütztes Software Engineering– Aufgabe 5 1 Die Entwicklungsumgebung 1.1 Hardware MCB1700 Bild: MCB1700 Quelle: www.keil.com Auf dem Board wird ein Cortex M3 Mikrocontroller von NXP (LPC1758) eingesetzt. Zur Vorbereitung sollten Sie den MCB1700 User’s Guide[4] durcharbeiten. Folgende Features werden für den Laborbetrieb benötigt: LCD-TFT Display-Panel Port LEDs Joystick Analog Voltage Control for ADC Input (Potentiometer) INT0 Pushbutton 1.2 Embedded UML mit dem Realtime eXecution Framework RXF von Willert Willert Embedded UML RXFTM verbindet Rhapsody mit der Keil uVision IDE. Es optimiert die Codegenerierung für Ressourcen schonende Verwendung in embedded real-time Umgebungen. Im Dokument UML-Getting Started[5] ist der Installationsvorgang und das Einrichten eines Projektes beschrieben. Sie sollten dieses Dokument kennen. 3 Modellgestütztes Software Engineering– Aufgabe 5 1.3 Neues Projekt fürs Zielsystem a) Projekt anlegen Legen Sie ein neues Projekt in IBM Rhapsody Developer for C++ an. Aus dem Verzeichnis \Vorlagen\SDLY\Willert wird der folgende Ordner ins Projektverzeichnis kopiert. RXF-Eval_Rpy-Cpp-ARM_V6.01 b) Profil auswählen Über den Menüpunkt Add Profile to Model.. können vorbereitet Profile ausgewählt werden. Bild: Auswahl eines Profiles Im Verzeichnis Profile befinden sich entsprechende Dateien. Share/Profiles/WST_RXF_V6/RXF-Eval_Rpy-Cpp-ARM_Profile.sbs Bild: Auswahl des Profils RXF-Eval_Rpy-Cpp-ARM_Profile.sbs 4 Modellgestütztes Software Engineering– Aufgabe 5 c) Benennungen anpassen Zur besseren Orientierung ist es sinnvoll unter Components die Bezeichnung MCB1700 und unter Configurations die Bezeichnung Debug zu verwenden. Bild: Einheitliche Bezeichnung einführen d) Stereotype festlegen Ein Stereotype wird benötigt um die Projekte umsetzen zu können. (Feature MCB1700) Bild: Stereotype auswählen RXFComponent in RXF-Eval_Rpy-Cpp-Arm_Profile 5 Modellgestütztes Software Engineering– Aufgabe 5 e) Diagramme anlegen Im Projekt werden zwei OMDs benötigt. Das OMD (hier als Klassendiagram) Overview zum Entwurf und das OMD (hier als Objektdiagram) Runtime zur Realisierung. Bild: OMDs anlegen f) Standard Header LPC17xx.h einbinden Es wird ein Package Libs anglegt. Bild: für Package Libs Stereotype ModellLibrary auswählen Dem Package Libs wird nun ein neues File mit Namen lpc17xx hizugefügt. Bild: Hinzufügen eines Files lpc17xx 6 Modellgestütztes Software Engineering– Aufgabe 5 Nun kann das File als Komponente in das Klassendiagramm gezogen werden. Über Display Options nach dem Enable Image View kann aus dem Verzeichnis \RXF-Eval_Rpy-CppARM_V6.01\Pictures das Bild lpc176x.jpg ausgewählt werden. Als nächstes wir eine Klasse cLed0 erstell. Achtung bei der Namensgebung auch in Rhapsody darf jeder Name nur einmal verwendet werden. Nun muss ein Beziehung (Dependency) mit dem Stereotype Usage in Predefinied Types (ganz nach unten scrollen) aufgebaut werden. Bild: Verwendung eine Headerdatei 7 Modellgestütztes Software Engineering– Aufgabe 5 2 Komponenten des Boards 2.1 Erstes Projekt mit den Port Leds Die Port Leds sind an die folgenden Ports angeschlossen. P1.28 (2^7) P1.29 (2^6) P1.31 (2^5) P2.2 (2^4) P2.3 (2^3) P2.4 (2^2) P2.5 (2^1) P2.6 (2^0) Vor der Verwendung müssen die GPIOs initialisiert werden. Im Folgenden ein Beispiel für cLED0. Für Port2 muss das Register LPC_GPIO2 verwendet werden. Ausführliche Informationen unter [7]. Initialisierung (hier für LED0): LPC_GPIO1->FIODIR|=(1<<28); //Output LPC_GPIO1->FIOPIN&=~(1<<28); //Off Off: LPC_GPIO1->FIOPIN&=~(1<<28); //Off On: LPC_GPIO1->FIOPIN |=(1<<28); //On Toggle: LPC_GPIO1->FIOPIN ^=(1<<28); a) //Toggle LED mit einer HAL-Klasse cLed0 ohne eigenes Verhalten Bild: Klasse cLed0 8 Modellgestütztes Software Engineering– Aufgabe 5 Zum Testen wird eine seperate Klasse cTestIt angelegt, in der ein Zustandsautomat das Blinken übernimmt. Bild: Test für cLed0 Bild: Test Automat 9 Modellgestütztes Software Engineering– Aufgabe 5 Hier werden Methoden der Klasse cLed0 verwendet, die Klasse selber verfügt über kein Verhalten. Die Realisierung wird im OMD Runtime vorgenommen. Bild: Realisierung b) Generate Make and Run Wie bisher auch wird mit GMR das Projekt erstellt. Neu ist, daß nun ein Vorlagenprojekt, dass zuvor in den Projektordner kopiert wurde, ausgewählt wird. Zu den schon im Vorlagenprojekt vorhandenen Dateien werden die neuen Projektdateien hinzugefügt. Die Dateien GettingStarted.uvprojx finden sich unter dem folgenden Pfad. IhrProjektordner\RXF-Eval_Rpy-Cpp-ARM_V6.01\Samples\Code\GettingStarted_MCB1700 Bild: Auswahl Vorlagenprojekt 10 Modellgestütztes Software Engineering– Aufgabe 5 In einem letzten Schritt wird das Projekt nun mit Keil uVision5 unter Tools geöffnet. Die Konfiguration kann auch nachträglich geändert werden. Bild: Start der Keil uVision Nun geht alles seinen gewohnten Gang, es liegt ein „normales“ uVision Projekt vor das übersetzt (Translate), zusammengefügt (Build) und getestet (Load) werden kann. Es können auch Änderungen oder Korrekturen vorgenommen werden, die allerdings „von Hand“ ins UML Design übernommen werden müssen. Bild: Realisierung 11 Modellgestütztes Software Engineering– Aufgabe 5 c) LED mit einer intelligenten Klasse ansteuern Die Klasse cLed1 enthält nun einen Zustandsautomaten. Die Umschaltung erfolgt über Events, die an das Objekt geschickt werden. Die Klasse enthält nur einen Konstruktor und einen Zustandsautomaten. Bild: Klasse cLed1 Bild: Zustandsautomat cLed1 d) Aufgabe LED1: Testen Sie die Funktion von cLed1 mit einer Klasse cTestItLed1. Wiederkehrende Reihenfolge: 2s aus 2s an 5s blinken mit einer Periodendauer von 200ms 12 Modellgestütztes Software Engineering– Aufgabe 5 e) Frei konfigurierbare cLed Klasse Es wir Klasse cLed angelegt, die über die Argumente BitNr und PortNr verfügt. Im Konstruktor werden diese Werte gesetzt. Damit kann die Klasse für alle Leuchtdioden eingesetzt werden, Bild: Klasse cLed Der Konstruktor erhält die Übergabewerte myPortNr und myBitNr und weist die Werte entsprechend zu. Bild: Argumente des Konstruktors Konstruktor: BitNr = myBitNr; PortNr = myPortNr; if(myPortNr==1) LPC_GPIO1->FIODIR |= (1<<BitNr); if(myPortNr==2) LPC_GPIO2->FIODIR |= (1<<BitNr); Off: if(PortNr==1) LPC_GPIO1->FIOPIN &= ~(1<<BitNr); if(PortNr==2) LPC_GPIO2->FIOPIN &= ~(1<<BitNr); On: if(PortNr==1) LPC_GPIO1->FIOPIN |= (1<<BitNr); if(PortNr==2) LPC_GPIO2->FIOPIN |= (1<<BitNr); Toggle: if(PortNr==1) LPC_GPIO1->FIOPIN ^= (1<<BitNr); if(PortNr==2) LPC_GPIO2->FIOPIN ^= (1<<BitNr); 13 Modellgestütztes Software Engineering– Aufgabe 5 Nach dem Anlegen des Objektes müssen noch die Werte für den Konstruktor festgelegt werden. Dazu wird das Feature-Menue des Konstruktors des Objektes aufgerufen. Bild: Aufruf des Fenster um die Übergabewerte zu initialisieren (Button hinter Initialization) Bild: Argument auswählen und Set Value drücken Bild: Wert setzen und OK drücken 14 Modellgestütztes Software Engineering– Aufgabe 5 2.2 TasterINT0 im Polling Betrieb Init: LPC_GPIO2->FIODIR &= ~(1<< 10); //P2.10 Input Read: if((LPC_GPIO2->FIOPIN&(1<<10))==0) return 1; else return 0; Bild: Klasse cTatserINT0 Bild: Beziehung zur Klasse cTastserINT0 Bild: Test des Tasters 15 Modellgestütztes Software Engineering– Aufgabe 5 2.3 Joystick Der Joystick ist über Pull-Down Widerstände an die folgenden Ports angeschlossen. P1.23 up P1.24 right P1.25 down P1.26 left P1.20 press Initialisierung: LPC_GPIO1->FIODIR &= ~((1<<20)|(1<<23)|(1<<24)|(1<<25)|(1<<26)); // P1.20, P1.23..26 is input Read Funktion: unsigned int val; val = (LPC_GPIO1->FIOPIN >> 20) & 0x00000079; //JOY_MASK; return(val); a) Aufgabe Joystick: Legen Sie eine Klasse cJoyStick mit dem Konstruktor und der Read Funktion an. Eine Klasse cTestJoyStick enthält den Automaten der den Joysticks auswertet und das An- bzw. Ausschalten der Leds veranlasst. Ordnen Sie die das Anschalten der LEDs den folgenden Joystickfunktionen zu: Up R Down L PUSH LED3 P2.2 LED4 P2.3 LED5 P2.4 LED6 P2.5 LED7 P2.6 16 Modellgestütztes Software Engineering– Aufgabe 5 2.4 LCD-TFT Display-Panel 240x320 Es steht ein Modul GLCD (bestehend aus GLCD.c und GLCD.h) zur Verfügung. Das Modul wurde bereits im uVision5 Projekt im Ordner MCB1700 eingefügt. Hier können weitere Module eingefügt werden. Bild: Boardspezifische Module im Ordner MCB1700 Der Include Path .\MCB1700 wurde bereits bei den Options for Target ergänzt. Bild: Option for Target Die C-Datei wurde bereits ins Projekt eingebunden. Bild: Modul glcd im uVision Projekt 17 Modellgestütztes Software Engineering– Aufgabe 5 Alle Module, die in C geschrieben sind, müssen über die folgende Direktive verfügen, damit sie mit dem c++ Kompiler übersetzt werden und keine Linker-Fehler entstehen. #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ //******************** Modul Code Start ……….. //******************** Modul Code Ende #ifdef __cplusplus } #endif /* __cplusplus */ Diese Deklaration fehlt leider in vielen Beispielprogrammen. Im UML Projekt wird nun unter Libs ein File glcd eingefügt. Bild: Modul glcd im UML Projekt Das File glcd wird nun in das Klassendiagramm gezogen und kann ebenfalls durch ein Bild dargestellt werden. Das Display kann nun von allen Klassen benutzt werden. Es gibt aber ein Problem: von welchem Objekt wird das Display initialisiert. Hier wird eine abweichende pragmatische Vorgehensweise gewählt. Es wird direkt ein Objekt oGlcdStart in das Klassendiagramm eingefügt. Dieses Objekt enthält einen Konstruktor der das Display nur initialisiert. Jetzt können alle anderen Objekte auf die Funktionen des initialisierten Moduls glcd zugreifen. Aber Achtung, es kann zu Race Conditions beim Zugriff kommen. Evtl. ist es trotzdem sinnvoll nur einem Objekt die Verwaltung des Displays zu übergeben. Bild: Modul glcd mit initialisierendem Objekt Bei der Initialisierung kann der Text natürlich weggelassen werden und auch eine andere Hintergrundfarbe (z.B. White) gewählt werden. GLCD_Init(); GLCD_Clear(Green); GLCD_DisplayString(0,0,(unsigned char*)" GLCD 24x16 bereit "); 18 Modellgestütztes Software Engineering– Aufgabe 5 Die verfügbaren Funktionen und Definitionen finden Sie in der Headerdatei glcd.h z.B. void GLCD_DisplayChar (unsigned int ln, unsigned int col, unsigned char void GLCD_Bargraph (unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int val); //val 0-1000 c); Bild: Alle Beispiele in einem Projekt Codegröße 13390 Byte Bild: Zugriff auf Funktionen aus dem Modul glcd Bild: Das Onjektdiagramm. Wo kommmt Polymorphie zum Einsatz? Aufgabe: Erklären sie Polymorphie am obigen Beispiel 19 Modellgestütztes Software Engineering– Aufgabe 5 2.5 Poti Port P0.25 wird als Eingang für den AD-Wandler0 Kanal2 (AD0.2) verwendet. Bei der Initialisierung werden die entsprechenden Einstellungen vorgenommen. Eine Möglichkeit zum Auslesen ist im Folgenden beschrieben. Initialisierung: LPC_PINCON->PINSEL1 &= ~(3<<18); LPC_PINCON->PINSEL1 |= (1<<18); LPC_SC->PCONP |= (1<<12); LPC_ADC->ADCR = (1<< 2) | (4<< 8) | (1<<21); /* /* /* /* /* /* P0.25 is GPIO */ P0.25 is AD0.2 */ Enable power to ADC block */ select AD0.2 pin */ ADC clock is 25MHz/5 */ enable ADC */ Read Funktion: int adWert; LPC_ADC->ADCR &= ~(7<<24); LPC_ADC->ADCR |= (1<<24); //stop conversion // start conversion while (!(LPC_ADC->ADGDR & (1UL<<31))); adWert = LPC_ADC->ADGDR; LPC_ADC->ADCR &= ~(7<<24); return((adWert >> 4) & 0xFFF); a) // Wait for Conversion end // stop conversion // read converted value Aufgabe Poti Geben Sie den Poti-Wert als Zahlenwert und als Bargraph auf dem Display aus. In welchem Wertebereich arbeitet das Potentiometer? Der Funktion Bargraph wird zuerst die Koordinate für die Linke obere Ecke übergeben, dann folgt Breite, Höhe und die Angabe für den ausgefüllten Anteil in Promille. Mit dem Potentiometer wird die Blinkgeschwindigkeit von LED7 (P1.28) eingestellt. 20 Modellgestütztes Software Engineering– Aufgabe 5 3 Projekt Ihnen steht das LPCXpresso Board mit dem LPC1769 von NXP zur Verfügung. Alternativ können auch ST Discorey Boards mit einem STMF3 oder einem STMF4 verwendet warden. Neben Tastern und Leuchtdioden muss mindestens ein Analogeingang verwendet werden. Eine weitere Komponente Ihrer Wahl muss mit eingebaut werden. Das Projekt muss aus mehr als zwei Klassen bestehen. Prüfen sie die Möglichkeit ein Activity Diagram in ihrem Projekt zu verwenden. Begründen Sie Ihre Entscheidung wie auch immer diese hinsichtlich des Activity Diagrams ausfällt. Quelle: nxp.com 21 Modellgestütztes Software Engineering– Aufgabe 5 4 Aufgaben □ a) Aufgabe LED1 b) Aufgabe Joystick c) Erklärung Polymorphie d) Aufgabe Poti e) Ihre Projektidee: □ □ □ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ ___________________________________________________________________________ 22 Modellgestütztes Software Engineering– Aufgabe 5 5 Literatur Nachfolgend findet sich eine Zusammenstellung weiterführender Informationen, die mit dem Inhalt dieses Laborversuchs in Zusammenhang stehen. [1] Rupp, Queins, Zengler; UML 2 Glasklar; Hanser [2] http://www.ibm.com/developerworks/rational/products/rhapsody/ [3] UML 2.0 Das umfassende Handbuch, Christoph Kecher, Galileo Computing [4] http://www.keil.com/support/man/docs/mcb1700/mcb1700_intro.htm [5] http://www.willert.de/uml-getting-started-3/ [6] http://www.willert.de/assets/Download/UML-Getting-Started-Rhp-Keil-ARM-CPP-V1.0en.pdf [7] http://www.nxp.com/products/microcontrollers/cortex_m3/lpc1700/LPC1758FBD80.html Board: http://www.keil.com/mcb1700/ Schaltplan: http://www.keil.com/mcb1700/mcb1700-schematics.pdf Datasheet LPC1758 http://www.nxp.com/documents/data_sheet/LPC1759_58_56_54_52_51.pdf User Manual LPC1758 http://www.nxp.com/documents/user_manual/UM10360.pdf 23
© Copyright 2024 ExpyDoc