Modellgestütztes Software Engineering Versuch 5

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