티스토리 뷰

운영체제

[MicroC/OS-II] OSTaskCreate

머어하지 2017. 4. 21. 23:43

  Task에 관련된 함수들은 다음에서 확인해 보실 수 있습니다.

[MicroC/OS-II] Task에 관련된 함수들


  앞서 OSTaskQuery에 대해서 알아보았습니다. 오늘은 Task를 생성 즉 TCB를 생성해 주는 OSTaskCreate를 알아볼 것입니다. OSTaskQuery에서 보았던 것처럼 OSTCBPrioTbl의 값도 바꿔주는지 확인해 보시면 OSTaskQuery가 좀 더 이해가 되실겁니다.

OSTaskCreate

  OSTaskCreate를 살펴보겠습니다. 바로 코드를 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
INT8U OSTaskCreate (void (*task)(void *pd), void
*pdata, OS_STK *ptos, INT8U prio)
{
#if OS_CRITICAL_METHOD == 3
 OS_CPU_SR cpu_sr;
#endif
 void *psp;
 INT8U err;
#if OS_ARG_CHK_EN > 0
 if (prio > OS_LOWEST_PRIO) {
 return (OS_PRIO_INVALID);
 }
#endif
 
 OS_ENTER_CRITICAL();
 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
     /* check the priority is already used */
     OSTCBPrioTbl[prio] = (OS_TCB *)1;
     OS_EXIT_CRITICAL();
     psp = (void *)OSTaskStkInit(task, pdata,
    ptos, 0);
     err = OS_TCBInit(prio, psp, (void *)000,
    (void *)00);
 
 if (err == OS_NO_ERR) {
     OS_ENTER_CRITICAL();
     OSTaskCtr++;
     OS_EXIT_CRITICAL();
     if (OSRunning == TRUE) {
         OS_Sched();
     }
    } else {
         OS_ENTER_CRITICAL();
         OSTCBPrioTbl[prio] = (OS_TCB *)0;
         OS_EXIT_CRITICAL();
     }
     return (err);
 }
 OS_EXIT_CRITICAL();
 return (OS_PRIO_EXIST);
}
 
cs


  이해가 필요한 부분만 살펴보겠습니다.


1
2
3
 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
     /* check the priority is already used */
     OSTCBPrioTbl[prio] = (OS_TCB *)1;
cs


  OSTaskQuery에서 알아보았던 OSTCBPrioTbl에 해당 Priority의 값이 NULL 값이면 해당 Priority에 TCB 값을 넣어주어 NULL에서 상태를 바꾸어 주었습니다. 즉, OSTaskCreate의 이름에 맞게 해당 Priority를 이제 못쓰게 바꾸어 주었습니다.

  

1
2
3
4
5
6
7
8
if (err == OS_NO_ERR) {
     OS_ENTER_CRITICAL();
     OSTaskCtr++;
     OS_EXIT_CRITICAL();
     if (OSRunning == TRUE) {
         OS_Sched();
     }
cs


  error가 없다면 OS_ENTER_CRITICAL을 통해 CPU Scheduling을 멈춥니다. 그리고 OSTaskCtr++를 통해 사용 중인 Task의 숫자를 1 증가시켜 줍니다. 그 다음 OS_EXIT_CRITICAL을 통해 CPU Scheduling을 다시 시작 해주게됩니다. 그다음 나오는 if 부분은 항상 참이고 후에 알아볼 내용이므로 지금은 생략하겠습니다. 다음 이어지는 else 부분을 보겠습니다.


1
2
3
4
5
else {
         OS_ENTER_CRITICAL();
         OSTCBPrioTbl[prio] = (OS_TCB *)0;
         OS_EXIT_CRITICAL();
     }
cs


  else 부분에 온것은 error가 있기 때문입니다. 따라서 Task를 생성하면 안되고, 이미 생성한다 해놓은 것을 취소하기 위해 해당 Priority의 값을 NULL 값으로 바꾸어 주었습니다. 대략적으로 흐름을 알아보았습니다. 이제 OSTaskCreate의 인자와 함께 코드 부분을 보겠습니다.


1
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
cs

  -task : 실행하고자 하는 Task의 코드 주소의 Pointer입니다.
  -pdata : Task 변수의 Pointer입니다.
  -ptos : Task의 Stack의 Top의 위치의 Pointer입니다. 즉 Stack Pointer입니다.
  -prio : Task에 주고싶은 Priority입니다.

  끝으로 사용하는것을 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include “includes.h”
 
OS_STK MyTaskStack[1024];
 
void MyTask(void *pdata);
int main(void)
{
    OSInit();
    OSTaskCreate(Task_ex, NULL&MyTaskStack[1023], 10);
    OSStart();
    return 0;
}
void Task_ex(void *pdata)
{
    printf(“task_ex\n”);
    while (1) { ; }
}
cs


'운영체제' 카테고리의 다른 글

[MicroC/OS-II] OS_TCBInit  (0) 2017.04.23
[MicroC/OS-II] OSTaskStkInit  (0) 2017.04.23
[MicroC/OS-II] Task에 관련된 함수들  (0) 2017.04.21
[MicroC/OS-II] OSTaskQuery  (0) 2017.04.21
[MicroC/OS-II] TCB Management  (0) 2017.04.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday