상태 전이 코드 인라인 지정

CG::Class::ComplexityForInlining 특성은 인라인 지정이 허용되는 사용자 코드에서 행 수에 대한 상한을 지정합니다. 기본값은 3입니다.

이 태스크 정보

사용자 코드는 상태 차트에서 상태 전이의 조치 파트입니다. 예를 들어, 3 값을 사용하는 경우 3행 이하의 코드로 구성된 조치가 있는 모든 상태 전이는 호출 함수에서 자동으로 인라인 지정됩니다.

인라인 지정은 생성된 코드의 함수 호출을 함수의 본문을 구성하는 실제 코드 명령문으로 바꾸는 것입니다. 이 방법은 코드 크기를 약간 늘려서 코드 실행을 최적화합니다. 예를 들어, 인라인 지정할 수 있는 행의 수를 3에서 5로 늘리면 최대 10%의 코드 실행 시간이 단축됩니다.

예를 들어, HomeHeatingSystem 오브젝트의 상태 차트에서 systemControl 상태는 제한시간 초과 시 다음 조치 파트가 있는 출력 상태 전이를 가집니다.

if(IS_IN(&me->theFurnace,Furnace_starting))
   RiCGEN(&me->theFurnace,motorReady());

이 조치는 Furnace가 시작 상태인 경우 motorReady() 이벤트를 HomeHeatingSystem에서 Furnace로 보냅니다.

ComplexityForInlining 특성이 0(기본값)으로 설정된 경우, 상태 전이 코드는 다음과 같이 HomeHeatingSystem 오브젝트 systemControl 상태의 takeEvent() 오퍼레이션에 생성됩니다.

int HomeHeatingSystem_systemControl_takeEvent(
HomeHeatingSystem* const me, short id) {
    int res = eventNotConsumed;
    if(id == Timeout_id)
    {
      if(RiCTimeout_getTimeoutId((RiCTimeout*) 
me->ric_reactive.current_event) ==
            HomeHeatingSystem_Timeout_systemControl_id)
      {
         NOTIFY_TRANSITION_STARTED(me,HomeHeatingSystem,
            "1");
         HomeHeatingSystem_systemControl_exit(me);
         {
            /*#[ transition 1 */
            if(IS_IN(&me->theFurnace,Furnace_starting))
               RiCGEN(&me->theFurnace,motorReady());
/*#]*/
         }
         systemControl_entDef(me);
         NOTIFY_TRANSITION_TERMINATED(me,
            HomeHeatingSystem, "1");            
res = eventConsumed;
      }
   }
   return res;
}

HomeHeatingSystem 오브젝트 rootStatedispatchEvent() 오퍼레이션은 다음과 같이 takeEvent() 오퍼레이션을 호출합니다.

static int rootState_dispatchEvent(
   void * const void_me, short id) {
   HomeHeatingSystem * const me =
      (HomeHeatingSystem *)void_me;
      int res = eventNotConsumed;
      switch (me->rootState_active) {
         case HomeHeatingSystem_systemControl:
         {
            res =
               HomeHeatingSystem_systemControl_takeEvent(
                  me, id);
            break;
         };
      default:
         break;
   };
   return res;
}

그러나 ComplexityForInlining3으로 설정된 경우(예를 들어, 조치 코드가 3행 미만이므로), 다음과 같이 rootStatedispatchEvent() 오퍼레이션에 직접 생성되어 takeEvent() 호출을 대체합니다.

static int rootState_dispatchEvent(void * const void_me,
   short id) {
   HomeHeatingSystem * const me = (HomeHeatingSystem *)
      void_me;
   int res = eventNotConsumed;
   switch (me->rootState_active) {
      case HomeHeatingSystem_systemControl:
      {
         if(id == Timeout_id)
         {
            if(RiCTimeout_getTimeoutId(
               (RiCTimeout*) me
               ->ric_reactive.current_event) == 
               HomeHeatingSystem_Timeout_systemControl_id)
            {
            NOTIFY_TRANSITION_STARTED(me,HomeHeatingSystem,
               "1");
            RiCTask_unschedTm(me->ric_reactive.myTask,
               HomeHeatingSystem_Timeout_systemControl_id,
               &me->ric_reactive);
            NOTIFY_STATE_EXITED(me, HomeHeatingSystem,
"ROOT.systemControl");
            {
               /*#[ transition 1 */
               if(IS_IN(&me->theFurnace,Furnace_starting))
RiCGEN(&me->theFurnace,motorReady());
               /*#]*/
            }
         }
         /* rest of dispatchEvent() */
}

피드백