티스토리 뷰
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가 다음과 같이 들어갈 것 입니다.
'운영체제' 카테고리의 다른 글
[MicroC/OS-II] CPU Scheduling with Preemptive (0) | 2017.04.23 |
---|---|
[MicroC/OS-II] CPU Scheduling with Non-Preemptive (0) | 2017.04.23 |
[MicroC/OS-II] OSTaskStkInit (0) | 2017.04.23 |
[MicroC/OS-II] OSTaskCreate (0) | 2017.04.21 |
[MicroC/OS-II] Task에 관련된 함수들 (0) | 2017.04.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday