View
4
Download
0
Category
Preview:
Citation preview
Rhapsody in C++
Jan BlumenthalUniversität Rostock
Seminar „Technische Informatik“08.02.2000
Gliederung
• Einleitung• Features• Beispiele
– Hello World– Elevator
• Highlights• Fazit
Rhapsody in C++
• Spezifikation von Software• Objektorientierter Entwurf• Automatische Godegenerierung• Anwendung in eingebetteten Systemen• Echtzeitfähige Software
Systeme zur Softwaresynthese
CASE-Tools
EchtzeitfähigNicht Echtzeitfähig
UM
L
• STP• Rational Rose• Together
• Rhapsody• Room
Echtzeit - Was heißt das?
Echtzeitsystem
ZuverlässigkeitResourcenumgang
Rechtzeitigkeit Performance
Herkömmliche Softwareentwicklung
Nachteile:Problem
Softwareentwurf
Hardwareimplementation
- Software wird unübersichtlich
- Keine wiederverwendbare Software
- Hardwareabhängig
- Fehleranfällig, Fehlersuche schwierig
- Debugging/Monitoring nahezu unmöglich
- Programmdownload auf Zielhardware
- Echtzeitverhalten fraglich
Test
Ansatz: Softwaresynthese
Vorteile:Problem+ Objektorientiert+ Automatische Codeerzeugung+ Übersichtlicher Entwurf+ Keine direkte Hardwareanbindung
Objektorientierte Analyse
OOP-Entwurf
Codegenerierung
Test
Frage: Wie erfolgt die Hardwareanbindung?
Rapid Prototyping
VxWorksSolaris
PSOS PPC/X86
Crossentwicklung Environment Zielhardware
Debugging
Crossentwicklung Environment Zielhardware
Simulation
+ Simulation der Hardware+ Einfaches Debugging+ Schnelle Fehlersuche+ Zeitersparnis+ Gewohnte Entwicklungsumgebung
Vorteile:
Was kann Rhapsody ?
+ Einfache Fehlersuche+ Debugging+ Echtzeitfähig
- Nur C/C++ unterstützt- Betriebssystem auf Zielhardware nötig
+ Objektorientierter Entwurf+ Codegenerierung+ Abbildung auf verschiedene
Betriebssysteme
MicrosoftBorlandSolaris 2VxWorksPSOS x86/PPC
Echtzeit mit Rhapsody
• OXF-Framework– Klassenbibliothek zur
Resourcenverwaltung• Statische Architekturen• Lokale Speicher• Sequenz Diagramme
Hello World
Aufgabe: „Hello World“ alle 2 sec ausgeben.
• Class Display– Memberfkt Display::Writing();– Statechart
• Object Model Diagram• Component-Configuration
Statechart: Class Display
State: Writing
Stateentry
Stateexit
Object Model Diagram
• Statische Struktur des Systems• Beziehungen zwischen Klassen
Component Configuration
Physikalisches Subsystem:- Festlegung der Initialinstanzen- Wahl des Environments- Compiliert als Library bzw. Programm- Debuggingmode
HelloWorld:- Initialinstanz: Display- Environment: Microsoft- Debuggingmodus: Animation
The Elevator
ElevatorPkg::Elevatorfloor : intid : int
isAtFloor()isCalledInCurrentDirection()
ElevatorPkg::Itineraryfloor : int
Itinerary()add(int aFloor)
1
ElevatorPkg::Doorfloor : intid : int
Door()evOpen(int anId,int aFloor)
ElevatorPkg::Motor
evMove(tDirection aDirection)
Use CasesInteraktionen zwischen System und externen Akteuren
elevator
exit elevator
enter elevator
call elevator
select destination
take a ride
potential passengerpotential passenger
passenger
Sequenz-DiagrammDefiniert möglichen Ablauf eines Use-Cases
MotorBuilding DoorElevator
evMove(aDirection)
evAtFloor()
dispatch(aFloor, aDirection)
evCall(aFloor, aDirection)
evGoto(aFloor)
evOpen(anId, aFloor)
evClosed()
isAtFloor()
isAtFloor()
elevator is idle at a floorabove
potential passenger callsan elevator
Statechart: DoorStatechart: Door
• Darstellung aller Zustände der Klasse
• Übergänge durch Eventsoder Zeitvorgaben
open>opening>
closing>closed
open>opening>
closing>closed
tm(1000)
evOpen/id = params->anId;floor = params->aFloor;
tm(3000)
tm(1000)
Statechart: Elevator(Auszug)
• Verzweigte Übergänge
wait
changingDirection
C
C Cwait
changingDirection
[isCalledInOppositeDirection()]/GEN(evChangeDirection);
[isCalledInCurrentDirection()]
tm(20)
[else]
evCall
Object Model Diagram• Statische Struktur des Systems• Beziehungen zwischen Klassen
IHardware
open(int anElevator,int aFloor)close(int anElevator,int aFloor)closing(int anElevator,int aFloor)moving(int anElevator,int aFloor)opening(int anElevator,int aFloorcheck(int anElevator,int aFloor)
<<Interface>>
itsHardware1
Elevator
1:Motor
1itsDownItinerary:Itinerary
1:Door
1itsUpItinerary:Itinerary
Elevator
itsItinerary1
Itineraryfloor : int
add(int aFloor)remove(int aFloor)isAtFloor(int aFloor)isNotEmpty(int aFloor,tDirection
BuildingNUMBER_OF_ELEVATORS
theElevator:Elevator
Building
Packages
Zusammenfügen von– Klassen– Events– Typen– Akteuren & Use Cases
zu einer Package
exit
enter
Call
select
ride
potential passengerpotential
passenger
HardwareanbindungErfolgt durch Betriebssystem/Environment
Schnittstelle zwischen Building & Environment anpassen
Environment: Microsoft
Building MFCGui Windows Hardware
Environment: VxWorks
AnpassungBuilding VxWorks Hardware
Environment: PSOS
Building PSOSAnpassung Hardware
Codegeneration
• Anwendung von Design-PatternBsp: Iterator, State
• Multithreading• Standard Template Library STL• Dokumentierter Sourcecode• Rhapsody-Basisklassen (OXF)
Bsp: OMReactive, OMThread, LeafState
Hello World - Source
//----------------------------------------------------------------------------// MainHelloWorld.cpp//----------------------------------------------------------------------------int main(int argc, char* argv[]) {
if(OXFInit(argc, argv, 6423)){
Display* p_Display = new Display;p_Display->startBehavior();OXFStart();delete p_Display;return 0;
}else
return 1;};
Hello World - Source IIint Display::rootState_dispatchEvent(short id){
int res = eventNotConsumed;switch(rootState_active){
case Writing:{
if(id == Timeout_id){
if(((Timeout*)event)->getTimeoutId() == Display_Timeout_Writing_id){
myThread->unschedTm(Display_Timeout_Writing_id, this);//#[ state ROOT.Writing.(Exit)cout<<"Exit : Display::HelloWorld!"<<endl;//#]rootState_subState = Writing;rootState_active = Writing;//#[ state ROOT.Writing.(Entry)cout<<"Entry: Display::HelloWorld!"<<endl;//#]myThread->schedTm(2000, Display_Timeout_Writing_id, this, "ROOT.Writing");res = eventConsumed;
}}
break;};
};return res;
};
Animation
• Debugging zur Laufzeit– Setzen von Breakpoints– Analyse von Instanzen– Beobachten von Statecharts– Auslösen von Events
• Siehe Beispiel: Door
Reports• Classes:
– Building Relations:
itsHardwareAssociation with IHardware, Multiplicity of 1, Uni-directional
theElevatorComposition of Elevator, Multiplicity of NUMBER_OF_ELEVATORS,Uni-directional
Operations: Building
Constructor , Public Bodyint id=0;OMIterator< Elevator* > iElevator( theElevator );for ( iElevator.reset(); *iElevator; ++iElevator )
(*iElevator)->setId ( id++ ); configure
Primitive-operation , Public, Return type is voidArgs:'IHardware*' aHardwareBodysetItsHardware ( aHardware );OMIterator< Elevator* > iElevator( theElevator );for ( iElevator.reset(); *iElevator; ++iElevator ) {
(*iElevator)->setItsHardware ( aHardware );(*iElevator)->getItsDoor()->setItsHardware(aHardware ); }
Interfaces
• Class-Importer– Importieren von Klassen im Sourcecode– Nur logische & physikalische Struktur,
keine Relationen• Rose-Importer• Doors Interface• Codedebugging mit Tornado-IDE• Klasseneditor
Programmbeurteilung
+ Intuitive Bedienung+ Umfangreiches Tutorial+ Sehr gute Online-Hilfe+ Umfassende Anbindung externer Programme+ Stabil- Kaum Literatur- Kein Undo- Nur eine Instanz startbar- Nur WindowsNT
Rhapsody in C++
The End
Neugierig geworden?
Recommended