Jan Blumenthal -...

Post on 20-Mar-2021

4 views 0 download

Transcript of Jan Blumenthal -...

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?