티스토리 뷰

운영체제

[MicroC/OS-II] OS_TCBInit

머어하지 2017. 4. 23. 16:39

  Task에 관한 다른 함수들을 보시려면 다음의 게시물을 보시면 됩니다.

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


OS_TCBInit

  OS_TCBInit에 대해서 간단하게 살펴보겠습니다. 우선 OS_TCBInit은 Free TCB를 가져와 초기화 해준다 생각하시면 됩니다. 코드를 살펴보겠습니다. 긴 코드이지만 우선 전체를 보겠습니다.


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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
INT8U OS_TCBInit(INT8U prio,    OS_STK *ptos, OS_STK *pbos, INT16U id,
         INT32U stk_size, void   *pext, INT_16U opt)
{
#if OS_CRITICAL_METHOD  == 3 
    OS_CPU_SR  cpu_sr 
#endif
    
   OS_TCB  *ptcb;
   
   OS_ENTER_CRITICAL(); 

   
 
   ptcb=OSTCBFreeList; ---------------------------------------(1)
     if(ptcb != (OS_TCB *)0){ -----------------------------------(2)
         OSTCBFreeList      = ptcb->OSTCBNext;
         OS_EXIT_CRITICAL();
         ptcb->OSTCBStkPtr   = ptos;-----------------------------(3)
         ptcb->OSTCBPrio   = (INT8U)prio;
         ptcb->OSTCBStat   = OS_STAT_RDY;
         ptcb->OSTCBDly    = 0;
         
#if OS_TASK_CREATE_EXT_EN > 0
     ptcb->OSTCBExtptr  = pext;---------------------------------(4)
     ptcb->OSTCBStkSize  = stk_size;
     ptcb->OSTCBStkBottom = pbos;
     ptcb->OSTCBOpt    = opt;
     ptcb->OSTCBId    = id;
 
#else  
     pext         = pext;
     stk_size       = stk_size;
     pbos         = pbos;
     opt         = opt;
     id          = id;
#endif
 
#if OS_TASK_DEL_EN > 0
    ptcb->OSTCBDelReq     = OS_NO_ERR;;--------------------------------(5)
 
#endif
 
    ptcb->OSTCBY         = prio >> 3; ;-------------------------------------(6)
 
    ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
    ptcb->OSTCBX       = prio & 0x07;
    ptcb->OSTCBBitX      = OSMAPTbl[ptcb->OSTCBX];
 
#if OS_EVENT_EN > 0  
  ptcb->OSTCBEventPtr    = (OS_EVENT *)0;-------------------------------(7)
#endif
 
#if (OS_VERSION >= 251&& (OS_FLAG_EN > 0&& (OS_MAX_FLAGS > 0&& (OS_TASK_DEN_EN > 0)
  ptcb->OSTCBFlagNode    = (OS_FLAG_NODE *)0;-------------------------(8)
#endif
 
#if OS_VERSION >= 204
  OSTCBInitHook(ptcb);--------------------------------------------------(9)
#endif
  
  OSTaskCreateHook(ptcb);----------------------------------------------(10)
 
 
  OS_ENTER_CRITICAL();------------------------------------------------(11)
 
  OSTCBPrioTbl[prio]    = ptcb;-------------------------------------------(12)
  ptcb->OSTCBNext      = OSTCBList;
  ptcb->OSTCBPrev      = (OS_TCB *)0;
  if(OSTCBList != (OS_TCB *)0){
   OSTCBList->OSTDBPrev  = ptcb;
  }
  OSTCBList         = ptcb;
  OSRdyGrp         |= ptcb->OSTCBBitY;-----------------------------------(13)
  OSRdyTbl[ptcb->OSTCBY]  |= ptcb->OSTCBBitX;
  OS_EXIT_CRITICAL();   
  return (OS_NO_ERR);---------------------------------------------------(14)
}
OS_EXIT_CRITICAL();
  return (OS_NO_MORE_TCB);
}
cs


  부분부분 살펴보겠습니다.


1
ptcb=OSTCBFreeList;
cs

  앞서 Free TCB를 가져온다 하였으므로 OSTCBFreeList에서 TCB를 1개 할당 받습니다.


1
2
3
4
5
6
7
if(ptcb != (OS_TCB *)0){
         OSTCBFreeList  = ptcb->OSTCBNext;
         OS_EXIT_CRITICAL();
         ptcb->OSTCBStkPtr   = ptos;
         ptcb->OSTCBPrio   = (INT8U)prio;
         ptcb->OSTCBStat   = OS_STAT_RDY;
         ptcb->OSTCBDly    = 0;
cs


  가져온 TCB가 NULL 아닌경우 그 TCB를 FreeList에서 빼주기 위해 ptcb -> OSTCBNext를 OSTCBFreeList로 바꾸어 줍니다. 그리고 몇개의 것들을 초기화 하여 줍니다. 다음의 그림과 같이 이해하시면 됩니다.


  OS_TCBInit을 call 하였더니 OSTCBFreeList에서 TCB1이 빠진 모습입니다.


1
OSTCBPrioTbl[prio]    = ptcb;
cs

  해당 TCB를 OSTCBPrioTble의 해당 Priority를 가진곳에 등록합니다.

1
2
 ptcb->OSTCBNext      = OSTCBList;
 ptcb->OSTCBPrev      = (OS_TCB *)0;
cs


  OSTCBList의 Header를 바꿔줍니다.


1
2
3
4
  if(OSTCBList != (OS_TCB *)0){
   OSTCBList->OSTDBPrev  = ptcb;
  }
  OSTCBList         = ptcb;
cs


  새로운 TCB가 NULL이 아니면 맨 앞에 ptcb를 넣어줍니다. 그림으로 살펴보겠습니다.



  새로운 TCB가 다음과 같이 들어갈 것 입니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday