티스토리 뷰

운영체제

[MicroC/OS-II] OSTaskStkInit

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

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

[MicroC/OS-II] 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

 그럼 아무 Stack이나 써도되는가? 그건 아닙니다. 각각의 Task에 맞는 Stack 형태를 써주어야 합니다. OSTaskStkInit을 통한 Stack구조를 알아보았습니다.


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

[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