History#
- 2011.05.21 : 최초작성. 다른 방법 확인중.
- 2011.05.23 : vxWorks에서 TimeResolution 기본값 확인.
tm() #
Rhapsody에서 time event를 만들기 위해서 가장 많이 쓰는 방법은 tm() 이벤트를 쓰는 것이다. 인자로는 ms로 주어진다. 사용법은 아래와 같다.
문제점 #
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와의 연관을 아래와 같은 식으로 구성한다.
Reactive Class에서 기존의 tm(500) 이벤트를 제거하고 tgTimeEvent()의 Triggered Operation을 추가하여 대체한다.
OsDependantScheduler는 아래와 같이 계속적으로 time event를 발생하며, Reactive Class의 Triggered Operation을 계속적으로 호출한다.
참고자료 #
- http://www.rhapsody4you.org/tm-in-orthogonal-states-t646.html
- http://www.uml-embedded.com/assets/Schulungen/Rhapsody-Handout-Statecharts-Sequence-Diagrams-v1r1.pdf
- http://www.rhapsody4you.org/what-is-the-difference-between-tm-and-oxfdelay-t62.html
이 글은 스프링노트에서 작성되었습니다.