2008년 4월 23일 수요일

uC/OS-II 커널구조(3) - 태스크 상태


TASK DORMANT는 태스크가 프로그램 영역(ROM or RAM)에 존재하지만 아직 uC/OS-II에게 태스크로서 등록되지 않은 상태를 의미한다. 태스크는 OSTaskCreate() 또는 OSTaskCreateExt()를 호출해서 uC/OS-II에 등록한다. 이 함수들의 역할은 단순히 uC/OS-II에게 태스크의 시작번지, 우선순위, 태스크가 사용할 스택의 위치와 크기 등을 알려준다. 태스크가 생성과정을 거치면 TASK READY 상태가 되어 실행할 준비를 마친다. 태스크는 멀티태스킹을 시작하기 전이나 이후에 실행 중인 다른 태스크가 동적으로 생성할 수 있다. 실행 중인 태스크가 새롭게 태스크를 생성할 경우, 생성된 태스크의 우선순위가 생성시킨 우선순위보다 높다면, 생성과 동시에 CPU 제어권을 할당받아 실행된다.

OSTaskDel()를 호출해서 자기자신이나 다른 태스크를 수면상태로 만들 수 있다. uC/OS-II에서는 OSStart() 함수를 호출해서 멀티태스킹을 시작한다. 이 함수는 시스템이 시작할 때 오직 한번만 호출할 수 있으며, 초기화 코드가 생성한 태스크 중 가장 우선순위가 높은 태스크를 실행한다. 이 때 최우선순위 태스크는 TASK RUNNING 상태가 된다.

실행중인 태스크는 OSTimeDly() 또는 OSTimeDlyHMSM()을 호출해서 원하는 시간동안 자신의 실행을 지연할 수 있다. 이들 시간지연 함수를 호출한 태스크는 함수를 호출할 때 지정한 시간동안 TASK WAITING 상태에 머문다. 이 두 함수 모두 준비상태의 태스크 중 가장 우선순위가 앞서는 태스크로 문맥전환을 발생시킨다. 지연된 태스크는 설정 시간이 만료되면 OSTimeTick()함수에 의해 TASK WATING 상태가 된다.

실행중인 태스크는 OSFlagPend() / OSSemPend() / OSMutexPend() / OSMboxPend() / OSQPend()를 호출해서 특정 이벤트가 발생할 때까지 실행을 멈출 필요가 있다. 이벤트가 이미 발생하지 않았다면 이 함수를 호출한 태스크는 이벤트가 발생할 때까지 TASK WAITING 상태가 된다. 태스크가 이벤트를 기다리는 상태로 빠지면, 다음 번 우선순위의 태스크가 즉시 CPU의 실행권을 받아 실행한다. 태스크는 이벤트가 발생하거나 대기 시간이 만료하면 준비 상태가 된다. 이벤트는 다른 태스크나 ISR에서 신호를 보낼 때 발생한다. 모든 태스크가 이벤트 발생이나 시간 만료를 기다리고 있을 경우 uC/OS-II는 OS_TaskIdle()라는 내부 태스크를 실행한다.

출처> uC/OS-II 실시간 커널

댓글 없음: