Tools/IBM Rhapsody

Rhapsody :: Workbench 3.0과 Rhapsody 7.5 연동

ppiazi 2010. 5. 21. 13:56

 

시작하는 글 #

     MDD 개발 툴인 Rhapsody는 다른 IDE 툴과 연동되어 개발할 수가 있다. 많은 컴파일러와 IDE 툴을 지원하고 있으며, 대표적으로 Visual Studio와 Eclipse 기반 IDE를 지원한다. 본글에서는 VxWorks 6.6 개발을 위한 IDE 인 Workbench 3.0과 Rhapsody의 연동방법에 대하여 알아본다.

 

연동하기 #

Workbench에 Rhapsody Plugin 설치하기 #

  1. Workbench를 구동한다.

    01.jpg

  2. Workbench의 Help >> Software Updates >> Find and Install 을 선택한다.

    02.jpg

    03.jpg

     

  3. New Local Site를 선택하여, Rhapsody가 설치된 폴더 바로 아래의 Eclipse 폴더를 선택한다.

    04.jpg

    04-1.jpg

  4. Workbench용 플러그 인을 설치한다. (선택하지 않은 플러그인들은 Eclipse용이다.)

    04-2(2).jpg

     

Rhapsody OXF 빌드하기 #

     개발하려는 타켓용의 Rhapsody OXF를 다시 빌드해야 한다. 윈도우용은 기본적으로 빌드된 라이브러리가 있지만, VxWorks 용 타켓용 라이브러리는 손수 빌드해 주어야 한다.

     시뮬레이터와 MPC864x 플랫폼의 gnu와 diab 컴파일러를 각각 사용하여 라이브러리를 빌드한다. 빌드를 위한 배치파일은 아래의 폴더에 위치한다.

     ($RHAPSODY_HOME은 Rhapsody가 설치되어있는 폴더의 위치를 말한다)

 

     $RHAPSODY_HOME\Share\LangCpp\Rebuild_VxWorks66_Libraries.bat

     Rhapsody가 제대로 설치되었다면 아래와 같이 Workbench 설치 위치를 별도로 수정할 필요가 없다. 하지만 필요하다면 수정하도록 한다.

     또한, 기본으로는 다양한 플랫폼을 지원하도록 여러가지 옵션이 있었지만, 꼭 필요한 라이브러리만 빌드하도록 하고 나머지는 주석처리 하도록 한다.

  • CPU : PPC32, SIMNT
  • TOO_FAMILY : gnu, diab

 

  1. rem rebuilding all VxWorks 6.6 libraries
    set PATH=D:\Developer\WindRiver\;%path%

    rem Debug Libraries
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Debug   TOOL_FAMILY=diab TOOL=sfdiab PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Debug   TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=SIMNT      BUILD=Debug   TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Debug   TOOL_FAMILY=diab TOOL=sfdiab PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Debug   TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=SIMPENTIUM BUILD=Debug   TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak

    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Debug   TOOL_FAMILY=gnu  TOOL=sfgnu  PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Debug   TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=SIMNT      BUILD=Debug   TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak

    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Debug   TOOL_FAMILY=gnu  TOOL=sfgnu  PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Debug   TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=SIMPENTIUM BUILD=Debug   TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak


    rem Release Libraries
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Release TOOL_FAMILY=diab TOOL=sfdiab PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Release TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=SIMNT      BUILD=Release TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Release TOOL_FAMILY=diab TOOL=sfdiab PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Release TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak
    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=SIMPENTIUM BUILD=Release TOOL_FAMILY=diab TOOL=diab   PATH_SEP=\\ all -f vxbuild.mak

    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Release TOOL_FAMILY=gnu  TOOL=sfgnu  PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=PPC32      BUILD=Release TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=FALSE CPU=SIMNT      BUILD=Release TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak

    rem wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Release TOOL_FAMILY=gnu  TOOL=sfgnu  PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=PPC32      BUILD=Release TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak
    wrenv -p vxworks-6.6 make -i -s VX_VER=6.6 RTP_MODE=TRUE  CPU=SIMPENTIUM BUILD=Release TOOL_FAMILY=gnu  TOOL=gnu    PATH_SEP=\\ all -f vxbuild.mak


    pause

 

     VxWorks용 Makefile은 vxbuild.mak을 통해 확인 할 수 있다.

  • PPC32을 사용한다면 컴파일 옵션에 아래의 옵션을 추가해 주어야 한다.

    • gnu : -mlongcall
    • diab : ??? 
  1. MAKE=make

    ifeq ($(VX_VER),5.5)
        TOOL=gnu
        TOOL_FAMILY=gnu
        LIB_SUFFIX=
        RTP_MODE=FALSE
        OM_OPT_LEVEL="-O0 -g -fno-rtti"
    else
        LIB_SUFFIX=$(TOOL)$(BUILD)
        ifeq ($(BUILD),Debug)
            ifeq ($(TOOL_FAMILY),diab)
                ifeq ($(RTP_MODE),FALSE)
                    OM_OPT_LEVEL="-g -DOM_NO_RCS_ID"
                else
                    OM_OPT_LEVEL="-g -DOM_NO_RCS_ID"
                endif
            else
                ifeq ($(RTP_MODE),FALSE)
                    OM_OPT_LEVEL="-g -DOM_NO_RCS_ID"
                else
                    OM_OPT_LEVEL="-g -DOM_NO_RCS_ID"
                endif
            endif
        else
            ifeq ($(TOOL_FAMILY),diab)
                ifeq ($(RTP_MODE),FALSE)
                    OM_OPT_LEVEL="-XO -Xsize-opt -DOM_NO_RCS_ID"
                else
                    OM_OPT_LEVEL="-XO -DOM_NO_RCS_ID"
                endif
            else
                ifeq ($(RTP_MODE),FALSE)
                    OM_OPT_LEVEL="-O2 -nostdlib -fno-builtin -fno-defer-pop -DOM_NO_RCS_ID"
                else
                    OM_OPT_LEVEL="-O2 -fno-builtin -fno-defer-pop -DOM_NO_RCS_ID"
                endif
            endif
        endif 
    endif


    ifeq ($(PATH_SEP),)
    all :
        @echo PATH_SEP is not defined. Please define it as \\ or /
    oxflibs:
        @echo PATH_SEP is not defined. Please define it as \\ or /
    omcomlib:
        @echo PATH_SEP is not defined. Please define it as \\ or /
    tomlibs:
        @echo PATH_SEP is not defined. Please define it as \\ or /
    aomlibs:
        @echo PATH_SEP is not defined. Please define it as \\ or /
    webcomponentslib:
        @echo PATH_SEP is not defined. Please define it as \\ or /
    else
    all :    oxflibs aomlibs omcomlib tomlibs webcomponentslib
    oxflibs:
        @echo 2>oxf$(PATH_SEP)Makefile
        $(MAKE) all -C oxf -f vxoxf.mak CFG=vxoxf CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER)  RTP_MODE=$(RTP_MODE)
        $(MAKE) all -C oxf -f vxoxf.mak CFG=vxoxfinst CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER) RTP_MODE=$(RTP_MODE)
    omcomlib:
        @echo 2>omcom$(PATH_SEP)Makefile
        $(MAKE) all -C omcom -f vxomcom.mak CFG=vxomcomappl CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER) RTP_MODE=$(RTP_MODE)
    tomlibs:
        @echo 2>tom$(PATH_SEP)Makefile
        $(MAKE) all -C tom -f vxtom.mak CFG=vxtomtrace CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER) RTP_MODE=$(RTP_MODE)
        $(MAKE) all -C tom -f vxtom.mak CFG=vxtomtraceRiC CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER) RTP_MODE=$(RTP_MODE)
    aomlibs:
        @echo 2>aom$(PATH_SEP)Makefile
        $(MAKE) all -C aom -f vxaom.mak CFG=vxaomtrace CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER) RTP_MODE=$(RTP_MODE)
        $(MAKE) all -C aom -f vxaom.mak CFG=vxaomanim CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER) RTP_MODE=$(RTP_MODE)
    webcomponentslib:
        @echo 2>WebComponents$(PATH_SEP)Makefile
        $(MAKE) all -C WebComponents -f vxWebComponents.mak CFG=vxWebComponents CPU=$(CPU) TOOL_FAMILY=$(TOOL_FAMILY) TOOL=$(TOOL) LIB_SUFFIX=$(LIB_SUFFIX) PATH_SEP=$(PATH_SEP) OM_OPT_LEVEL=$(OM_OPT_LEVEL) VX_VER=$(VX_VER) RTP_MODE=$(RTP_MODE)
    endif

 

     준비가 끝났다면, 해당 배치파일을 실행한다.

     $RHAPSODY_HOME\Share\LangCpp\Rebuild_VxWorks66_Libraries.bat

     05.jpg

 

     이렇게 빌드하면 아래와 같은 라이브러리들이 생성된다. 하지만, 기본적으로 Debug, Release와 같은 Prefix가 붙으므로 실제 Workbench로 빌드할때는 Prefix가 없도록 해당 라이브러리 이름을 바꾸던지 아니면 링커 세팅을 수정해야 한다.

     06.jpg

WRTAP 설치하기#

     VxWorks WRTAP 설치하기 문서를 참고한다.

 

테스트#

Rhapsody : Test Project 생성 #

     간단한 테스트용 프로젝트를 하나 생성한다. 하는 일은 1초마다 "Hello Vxworks"를 출력한다. State Chart는 아래 그림과 같이 구성한다.(cout 사용에 대한 <iostream> 헤더파일 추가와 같은 부분은 include 추가하는 방법을 참고한다.)

 

00.jpg

 

     원하는 동작을 수행하는 소프트웨어의 모델링이 끝났다면, Workbench용 Configuration을 하나 생성한다. 아래의 그림과 같이 수행한다.

00-1.jpg

Workbench 프로젝트 생성 #

     Eclipse Configuration을 선택하면, Workbench 화면에 새로운 프로젝트 추가 마법사(Rhapsody Configuration Wizard) 윈도우가 뜬다. 아래의 순서대로 새로운 프로젝트를 Workbench에 추가한다.

01(1).jpg

     Vxworks Downloadable Kernel Module(이하 DKM)으로 생성한다.

02(1).jpg

 

03(1).jpg

 

04(3).jpg

 

     Finish를 눌러 DKM(Downloadable Kernel Module) 생성을 마친다. 최초 생성된 프로젝트에는 소스/헤더 파일이 없는데, 이것은 랩소디에서 소스 생성(Ctrl + F7)을 수행하면 자동적으로 Workbench의 해당 프로젝트에 생성된 파일들이 자동적으로 추가된다. 파일을 생성하기 전에 Rhapsody에서 새로 생성한 Workbench용 Configuration을 수정하여 Animation 기능을 활성화 시키도록 한다.

00-3.jpg

 

     또한 Animation을 위해 Remote Host 정보를 아래와 같이 설정해줘야 한다.(Filter를 사용하여 RemoteHost 검색 후 WorkbenchManaged 수정)

00-4.jpg

 

 

Workbench로 디버깅을 Rhapsody와 연동 #

     이로써 모든 환경 설정은 끝났다. 일단 Workbench에서 해당 DKM 프로젝트를 빌드한다.

05(2).jpg

 

     Vxworks 시뮬레이터를 띄워 해당 모듈 구동준비를 한다.

     Rhapsody에서 Code >> Debug >> Debug.. 를 선택하면, Workbench에 다음과 같은 화면이 떠 해당 모듈 구동을 할 수 있다.

06(1).jpg

 

     Workbench에서 Debug를 위한 윈도우는 아래와 같다. 설정을 확인한 후 Debug 버튼을 눌러 해당 모듈을 실행시킨다.

07(1).jpg

 

     Debug를 클릭하면, 해당 모듈이 Vxworks 시뮬레이터에서 구동되면서 Rhapsody 화면에 Animation을 위한 버튼들이 전시된다. 또한 Animation 구동시 해당 디버깅용 인스턴스가 생성된 것을 확인할 수 있다.

08.jpg

 

     Rhapsody에서 Run 버튼을 클릭하면, 해당 모듈이 Vxworks에서 구동이 되며, 구동되는 정보가 Rhapsody와 연동이 되어 State Chart의 상태 변화를 Rhapsody에서 확인가능하다.

 

10.jpg

 

09.jpg

 

 

참고파일#

 

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.