티스토리 뷰
Task에 관련된 함수들은 다음에서 확인해 보실 수 있습니다.
오늘은 OSTaskStkInit에 대해서 알아보겠습니다. 코드를 보면서 찬찬히 살펴보겠습니다.
OSTaskStkInit
우선 들어가는 인자부터 간단히 확인을 해보겠습니다.
1 | OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt) | cs |
1. task는 code의 address를 가르킵니다.
2. pdata는 task의 변수들이 들어갑니다.
3. ptos는 stack의 top을 가르킵니다.(stack에 아무것도 없을 경우 바닥을 가르킵니다.
4. opt는 주셔도 되고 안 주셔도 됩니다.
간단하게 인자를 보았습니다. 전체코드를 살펴보겠습니다.
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 | OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt) { OS_STK *stk; opt = opt; stk = ptos; /* Load stack pointer */ *(stk) = (OS_STK)task; /* Entry Point */ *(--stk) = (INT32U)0x14141414L; /* R14 (LR) */ *(--stk) = (INT32U)0x12121212L; /* R12 */ *(--stk) = (INT32U)0x11111111L; /* R11 */ *(--stk) = (INT32U)0x10101010L; /* R10 */ *(--stk) = (INT32U)0x09090909L; /* R9 */ *(--stk) = (INT32U)0x08080808L; /* R8 */ *(--stk) = (INT32U)0x07070707L; /* R7 */ *(--stk) = (INT32U)0x06060606L; /* R6 */ *(--stk) = (INT32U)0x05050505L; /* R5 */ *(--stk) = (INT32U)0x04040404L; /* R4 */ *(--stk) = (INT32U)0x03030303L; /* R3 */ *(--stk) = (INT32U)0x02020202L; /* R2 */ *(--stk) = (INT32U)0x01010101L; /* R1 */ *(--stk) = (INT32U)p_arg; /* R0 : argument */ *(--stk) = (INT32U)ARM_SYS_MODE; /* CPSR (Enable both IRQ and FIQ interrupts)*/ return (stk); } | cs |
살펴봐야될 부분만 살펴보겠습니다.
1 | stk = ptos; /* Load stack pointer */ | cs |
OS_STK인 stk를 Stack Top을 가르키는 ptos로 만들어 주었습니다. 아직 Stack의 바닥을 가르키고 있을 것입니다.
1 | *(stk) = (OS_STK)task; /* Entry Point */ | cs |
stk에 task즉 code의 address를 넣어주었습니다. 이제 다음 stack을 쌓으러 가보겠습니다.
1 | *(--stk) = (INT32U)0x14141414L; /* R14 (LR) */ | cs |
어떠한 저장값을 다음 Stack에 넣어주는데요. 보시면 (--stk)를 사용하고 있는것을 보실 수 있습니다. Stack의 낮은 쪽인것인데요 지금 만들고 있는 Stack이 High address에서 Low address로 가는 Stack 이라서 그렇습니다. 다음의 그림을 보시면 어떠한 구조인지 보이실 겁니다.
High에서 Low로 쌓고 있는걸 보실 수 있습니다. 그럼 Low에서 High로 쌓는것은 없을까요??? 당연히 있습니다. 그리고 이런 Stack의 형태는 OSTaskCreate에서 결정이 됩니다. OSTaskCreat에 들어가는 인자를 보시겠습니다. (그전에 Stack구조를 잘 모르시면 다음의 게시물을 읽고 오시면됩니다. 프로세스(Process)의 주소 공간(Address Space) 아래쪽에 Stack에 대한 내용이 있습니다.)
High에서 Low일 경우 다음과 같이 사용합니다. (일반적인 위가 뚫린 Stack구조 입니다.)
1 | OSTaskCreate(task, pdata, &TaskStk[TASK_STK_SIZE-1], prio); | cs |
Low에서 High일 경우 다음과 같이 사용합니다.(위가 막히고 아래가 뚫린 Stack 구조입니다.)
1 | OSTaskCreate(task, pdata, &TaskStk[0], prio); | cs |
'운영체제' 카테고리의 다른 글
[MicroC/OS-II] CPU Scheduling with Non-Preemptive (0) | 2017.04.23 |
---|---|
[MicroC/OS-II] OS_TCBInit (0) | 2017.04.23 |
[MicroC/OS-II] OSTaskCreate (0) | 2017.04.21 |
[MicroC/OS-II] Task에 관련된 함수들 (0) | 2017.04.21 |
[MicroC/OS-II] OSTaskQuery (0) | 2017.04.21 |
- Total
- Today
- Yesterday