uC/OS-II에서 태스크는 아래와 같은 전형적인 무한루프 함수이다.
void YourTask (void *pdata) - (1)
{
for (;;) {
/* 사용자 코드 */
uC/OS-II의 서비스 중 하나를 호출
OSFlagPend();
OSMboxPend();
OSMutexPend();
OSQPend();
OSSemPend();
OSTaskDel(OS_PRIO_SELF);
OSTaskSuspend(OS_PRIO_SELF);
OSTimeDly();
OSTimeDlyHMSM();
/* 사용자 코드 */
}
}
(1) - 함수의 리턴과 전달인자는 항상 void형이다. 전달인자가 void이므로 어떤 형태의 데이터(변수, 구조체, 함수의 시작번지)도 넘겨줄 수 있다. 같은 함수를 이용해서 많은 수의 같은 태스크를 생성할 수 있다. 만약 고유의 태스크로 관리하는 4개의 비동기 시리얼 포트가 있다고 가정하고, 태스크 코드또한 실제로 동일하다. 같은 코드를 4번 코딩하는 것보다 데이터 구조체를 가리키는 포인터를 전달인자로 받는 태스크를 한 번만 생성하는 것이 바람직하다. 이 구조체는 시리얼 포트의 설정 인자(Baudrate, I/O address, Interrupt vector number)가 저장된다.
void YourTask (void *pdata)
{
/* 사용자 코드 */
OSTaskDel(OS_PRIO_SELF);
}
태스크가 할 일을 마치면 자신을 삭제할 수 있다. 이는 태스크가 메모리에서 실제로 삭제되는 것이 아니라, uC/OS-II가 이후로는 해당 태스크의 정보를 관리하지 않는다는 것을 의미한다.
uC/OS-II는 태스크를 64개까지 관리할 수 있다. 그러나 uC/OS-II 내부에서 이미 2개의 태스크를 사용한다. 그리고 uC/OS-II에서 차후 버전에서 사용하기 위해 우선순위 0, 1, 2, 3, OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO를 예약해뒀다. 하지만 응용프로그램을 엄격하게 관리할 수 있다면 OS_LOWEST_PRIO를 제외하고 어떤 우선순위도 사용할 수 있다. 이와 같은 예약된 우선순위를 모두 사용한다면 최대 63개의 응용 태스크를 생성할 수 있고, 보통의 경우는 56개의 태스크를 사용할 수 있다.
우선순위는 낮을수록 더 높은 우선순위를 의미한다. uC/OS-II는 현재 실행 준비상태가 된 태스크 중 가장 높은 우선순위의 태스크를 실행한다. uC/OS-II는 태스크의 우선순위를 태스크 식별자로 사용한다. 즉, OSTaskChangePrio() 나 OSTaskDel()과 같은 시스템 서비스에서 태스크를 식별하기 위해 우선순위를 사용한다.
작성한 태스크를 uC/OS-II가 인식하고 관리하게 해주려면 항상 '생성'과정을 거쳐야 한다. 이 때 태스크의 실행번지와 다른 몇몇 전달인자를 가지고 OSTaskCreate() 서비스나 OSTaskCreateExt() 서비스 함수를 호출하여 태스크를 생성한다.
출처> uC/OS-II 실시간 커널
댓글 없음:
댓글 쓰기