티스토리 툴바


posted by ppiazi 2012/03/08 19:35
Creative Commons License
Creative Commons License
params->arg1, params->arg2 와 같은 방식으로 사용한다.(간단한데 기록하지 않으면 꼭 까먹는다.)
저작자 표시 비영리 동일 조건 변경 허락
posted by ppiazi 2012/02/21 08:22
Creative Commons License
Creative Commons License
참고 홈페이지

Rhapsody 7.5.1 버전 이후 부터는 포트(Port)간 멀티 캐스트 매크로를 지원한다.
방법은 아래와 같다.

1. 객체를 아래와 같이 구성한다.


2. Sender의 State Diagram을 아래와 같이 구성한다.
   1초마다 sendEvent() 함수를 호출하도록 구성한다.


   처음에는 GEN 매크로를 사용하여 이벤트를 전송해본다.



3. Handler들의 State Diagram을 아래와 같이 구성한다.
   evTrigger 이벤트를 수신하면, handleEvTrigger() 함수를 호출하도록 구성한다. 나머지의 Handler도 동일하게 구성한다.


   Handler1의 handleEvTrigger()


   Handler2의 handleEvTrigger()


   Handler3의 handleEvTrigger()



4. MULTICAST를 사용하지 않고 동작시켰을때의 화면
   Sender가 세개의 객체와 연결되어 있음에도 불구하도, 하나의 객체로만 이벤트가 전달됨을 확인할 수 있다.


5. MULTICAST를 사용했을때의 결과화면
   Sender::sendEvent() 함수를 아래와 같이 수정한다.



   세개의 객체로 이벤트가 전달됨을 볼수 있다.










저작자 표시 비영리 동일 조건 변경 허락
posted by ppiazi 2011/12/09 09:41
Creative Commons License
Creative Commons License
http://www.2brightsparks.com/syncback/syncback-hub.html

저작자 표시 비영리 동일 조건 변경 허락
TAG
posted by ppiazi 2011/08/30 14:44
Creative Commons License
Creative Commons License
Rhapsody가 자동생성한 함수들은(예를 들어 accessor, mutator 등) 기본적으로 Browser에 전시되지 않는다. 가끔 자동 생성된 함수들을 확인하거나 수정해야 하는 경우가 발생하는데 이럴때 사용되는 Tip이다. attribute buf를 하나 생성했다면 자동으로 accessor이나 mutator가 생성되지만, 아래 그림 처럼 해당 코드들이 Browser에 전시되지는 않는다.


해당 작업을 원하는 패키지나 클래스의 Property를 아래와 같이 수정한다.


CG - CGGeneral - GeneratedCodeInBrowser을 체크하도록 한다. 그 후에 Ctrl + F7을 눌러 코드를 재생성하면 아래와 같은 결과를 확인할 수 있다.

저작자 표시 비영리 동일 조건 변경 허락
posted by ppiazi 2011/08/30 14:27
Creative Commons License
Creative Commons License

 

소개#

IBM Rhapsody가 다양한 임베디드 시스템 플랫폼에 구동이 가능하게 해주는 라이브러리이다. OS에서 제공해주는 다양한 서비스들을 wrapping해 놓아, OS Native한 API를 호출하지 않고 Rhapsody에서 제공하는 Wrapper들을 사용하면 플랫폼 비의존적인 프로그래밍이 가능하게 된다.

 

구성#

 

예제#

OMOSMutex #

  1. OMOSMutex *itsMutex;
  2. ...
  3. itsMutex = OMOSFactory::instance()->createOMOSMutex();
  4. ...
  5. itsMutex->lock();
  6. ...
  7. itsMutex->unlock();
  8. ...
  9. itsMutex->free();

 

※ 컴파일을 하니 free() 함수를 못찾는다!! delete itsMutex 해야하나??

참고#

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

posted by ppiazi 2011/05/21 16:25
Creative Commons License
Creative Commons License

 

History#

  • 2011.05.21 : 최초작성. 다른 방법 확인중.
  • 2011.05.23 : vxWorks에서 TimeResolution 기본값 확인.

tm() #

     Rhapsody에서 time event를 만들기 위해서 가장 많이 쓰는 방법은 tm() 이벤트를 쓰는 것이다. 인자로는 ms로 주어진다. 사용법은 아래와 같다.

 

timer01.JPG

 

문제점 #

     tm() 방법은 기본으로 설정된 time resolution 이하로는 time event 발생이 불가능하다. 또한 타이머 쓰레드에 축적된 큐 상황에 따라 해당 시간을 만족시킬수 없을 수도 있다. 기본 설정은 $RHAPSODY_ROOT$\Share\LangCpp\oxf\OMTimerManagerDefaults.cpp 에서 아래와 같이 100 ms로 설정되어 있다.(모든 플랫폼에 기본값으로 100ms로 설정됨.)

 

     const Rhp_uint32_t OMTimerManagerDefaults::defaultTicktime = 100U;

 

     와 같이 선언되어 있다.

 

해결방안 #

     물론 해당 파라미터를 수정하여 구현할 수도 있지만, 윈도우와 같이 기본으로 사용하는 윈도우 타이머의 한계가 분명히 존재하게 되기 때문에 파라미터 수정에는 분명 한계가 존재한다.(CPP_CG:Framework:TimerResolution 파라미터를 수정하면 기본값을 override할 수있다. 이 값을 override하여 적용되는지 확인 필요)

     이럴때에는 Rhapsody의 OSAL 프레임워크가 제공하는 OS 타이머 말고 개발자가 원하는 높은 resolution의 타이머를 사용하면 된다. OS Dependant한 타임 이벤트를 발생시키는 쓰레드를 별도로 구성하고, 해당 쓰레드에서 triggered operation으로 동작하기 원하는 Reactive Class로 호출하는 방법이다. 이때 사용되는 타이머는 개발자가 플랫폼에 맞도록 선정하여 사용하면 될 것이다.(예를 들어, 윈도우즈에서는 multimedia timer, vxworks에서는 watch dog 타이머 또는 taskDelay를 이용한 폴링 등등)

     OsDependantScheduler와 원래의 Reactive Class와의 연관을 아래와 같은 식으로 구성한다.

 

timer02.JPG

 

     Reactive Class에서 기존의 tm(500) 이벤트를 제거하고 tgTimeEvent()의 Triggered Operation을 추가하여 대체한다.

 

timer03.JPG

 

     OsDependantScheduler는 아래와 같이 계속적으로 time event를 발생하며, Reactive Class의 Triggered Operation을 계속적으로 호출한다.

 

timer04(2).JPG

 

참고자료 #

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

posted by ppiazi 2011/05/08 13:43
Creative Commons License
Creative Commons License
http://www.partition-tool.com/download.htm

Home Edition은 무료다.
저작자 표시 비영리 동일 조건 변경 허락
posted by ppiazi 2011/03/28 13:04
Creative Commons License
Creative Commons License
클래스를 설계할 때, 1초 마다 doSomething() 을 호출하면서, 동시에 외부에서 들어오는 evExternalEvent를 처리하게 하도록 아래와 같이 State Chart Diagram을 설계했었다.



결과적으로는 잘못된 설계이다. evExternalEvent가 1초 보다 빠르게 들어온다면 위와 같은 상황에서는 절대 타이머 이벤트가 발생하지 않을 것이다. 이유는 생성된 코드를 보면 확인할 수 있다. doSomethingElse()가 호출됨과 동시에 타이머를 다시 세팅하고있다.

IOxfReactive::TakeEventStatus SomeClass::rootState_processEvent() {
    IOxfReactive::TakeEventStatus res = eventNotConsumed;
    if(rootState_active == running)
        {
            if(IS_EVENT_TYPE_OF(evExternalEvent_Default_id))
                {
                    if(rootState_timeout != NULL)
                        {
                            rootState_timeout->cancel();
                            rootState_timeout = NULL;
                        }
                    //#[ transition 1
                   
                    doSomethingElse();
                    //#]
                    rootState_subState = running;
                    rootState_active = running;
                    rootState_timeout = scheduleTimeout(1000, NULL);
                    res = eventConsumed;
                }
            else if(IS_EVENT_TYPE_OF(OMTimeoutEventId))
                {
                    if(getCurrentEvent() == rootState_timeout)
                        {
                            if(rootState_timeout != NULL)
                                {
                                    rootState_timeout->cancel();
                                    rootState_timeout = NULL;
                                }
                            //#[ transition 0
                           
                            doSomething();
                            //#]
                            rootState_subState = running;
                            rootState_active = running;
                            rootState_timeout = scheduleTimeout(1000, NULL);
                            res = eventConsumed;
                        }
                }
           
        }
    return res;
}


해결책은 아래와 같이 두가지 방법이 있을 수 있다.(물론 더 있을 수도!)
방법1) Reactions In State 사용



생성된 코드는 아래와 같다. 최초에 타이머를 리셋하던 코드가 사라진것을 볼수 있을 것이다.

IOxfReactive::TakeEventStatus SomeClass::rootState_processEvent() {
    IOxfReactive::TakeEventStatus res = eventNotConsumed;
    if(rootState_active == running)
        {
            if(IS_EVENT_TYPE_OF(evExternalEvent_Default_id))
                {
                    //#[ transition 1
                   
                    doSomethingElse();
                    //#]
                    res = eventConsumed;
                }
            else if(IS_EVENT_TYPE_OF(OMTimeoutEventId))
                {
                    if(getCurrentEvent() == rootState_timeout)
                        {
                            if(rootState_timeout != NULL)
                                {
                                    rootState_timeout->cancel();
                                    rootState_timeout = NULL;
                                }
                            //#[ transition 0
                           
                            doSomething();
                            //#]
                            rootState_subState = running;
                            rootState_active = running;
                            rootState_timeout = scheduleTimeout(1000, NULL);
                            res = eventConsumed;
                        }
                }
           
        }
    return res;
}


방법2) Sub-state 사용



방법1, 방법2 와 같이 설계를 수정한다면, 외부 이벤트의 영향없이 원하는 타이머 동작을 볼 수 있을 것이다.
저작자 표시 비영리 동일 조건 변경 허락
posted by ppiazi 2011/02/23 11:24
Creative Commons License
Creative Commons License
전방선언 방법은 해당 클래스 Properties에서 다음에 추가하면 된다.

소스에 추가할때 : CPP_CG >> Class >> ImplementationProlog

헤더에 추가할때 : CPP_CP >> Class >> SpecificationProlog

에 원하는 항목을 추가하면 된다.


저작자 표시 비영리 동일 조건 변경 허락
posted by ppiazi 2010/12/30 14:19
Creative Commons License
Creative Commons License
가끔 클래스 멤버들(attribute)에 대해 자동으로 생성되는 accessor/mutator들에 대해 inline 함수로 만들고 싶은 경우가 있다.

아래와 같이 설정을 바꿔 주면된다.

1. 해당 클래스를 열어 attributes 속성을 선택하여 Property 창을 연다.

2. Properties 탭을 선택하여 inline으로 검색한다. Attribute >> Inline을 in_header로 선택하고 Code Generation을 수행하면 된다.




저작자 표시 비영리 동일 조건 변경 허락