English

커널구조-태스크스케쥴링 #6

2008.02.26 19:32

권오용 Views:4785 Recommend:48

Task 스케쥴링은 현재 실행중인 태스크에 어떤 변화가 생겼을때(Timer등등) 현재 실행중인 Task 우선순위보다 높은 우선순위를



찾아 다음 순간에 실행할 태스크를 결정하는 일을한다.



uc/os-ii에서는 이런 Task수준의 스케쥴링을 위해 OS_Sched() 함수가 있다. 이런 스케쥴링이 일어났을때는 다른 인터럽트에



의해 준비리스트가 변경되는것을 막기위해 크리티컬영역 매크로 감싸주어야한다. 이 함수의 소스코드는 다음과 같다.



void OS_Sched(void)

{

  #if OS_CRITICAL_METHOD == 3  // 크리티컬섹션 매크로 구현방식이 메서드 3이면

       OS_CPU_SR cpu_sr; //cpu_sr변수를 정의

  #endif

        INT8U       y;

        OS_ENTER_CRITICAL();

        if((OSIntNesting == 0 ) && (OSLockNestring == 0)) --------------------------------(1)

        {

            y                    = OSUnMapTbl[OSRdyGrp];  ----------------------------------(2)  

            OSPrioHighRdy = (INT8U) ((y<<3) + OSUnMapTbl[OSRdyTbl[y])----------------(3)            

             if(OSPrioHighRdy !=OSPrioCur) ----------------------------------------------(4)

             {

               OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];---------------------------(5)

               OSCtxSwCtr++;------------------------------------------------------------(6)

               OS_TASK_SW();-----------------------------------------------------------(7)

              }

        }

       OS_EXIT_CRITICAL();

}

(1) : 인터럽트가 걸려있거나 스케쥴링 락이 걸려있으면 함수를 그냥 빠져나온다.

(2) (3) 현재 준비리스트 안에서 최상의 우선순위 태스크를 찾는다.

(4) : 준비리스트 테이블에서 찾은 최상의 우선순위 태스크가 현재동안 실행중인 태스크가 아니면 즉, 현재찾은 태스크가 현재

       실행중인 태스크보다 우선순위가 높은지 검사한다. 이검사를 하는이유는 불필요한 스케쥴링을 막기위함이다.

       즉, 준비리스트에 찾은 가장 우선순위가 높은 태스크와 현재실행중인 태스크가 같다면 굳이 스케쥴링을 할필요가 없기      

       때문이다.

(5) : Context Switching을 위해 가장우선순위 높은 태스크의 우선순위를 인덱스로  Task 컨트롤 블록을 할당해준다.

(6) : 1초동안 Context Switching 횟수을 체크하는 변수로  Context Switching임을 표시하기위해 하나 증가시켜준다.

       이횟수를 이용하고싶은면 다른변수에  이 값을 저장하고 0으로 초기화해준다.

(7) : 실제 Context Switching 함수를 실행한다.



위의 태스크수준 Context Switching의 걸리는 시간은 응용프로그램을 구성하는 Task 수의 관계없이 항상 일정하다.