2009年3月6日 星期五

uc-os ii 任務創建 --參數傳遞

OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0] 實際參數, OS_IDLE_PRIO);
--->
INT8U OSTaskCreate (void (*task)(void *pd), void *ppdata, OS_STK *ptos 形式參數 , INT8U prio) reentrant
{


void *psp;
psp = (void *)OSTaskStkInit(task, ppdata, ptos, 0); /* Initialize the task's stack * /
--> void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos 形參, INT16U opt) reentrant
err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);
--> INT8U OSTCBInit (INT8U prio, OS_STK *ptos 形參 , OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt) reentrant

}
OS_STK *ptos 呼叫時及強制轉換 void *ptos -> void *psp -> 傳入 OSTCBInit 又強制轉換了 OS_STK *

為何這樣轉來轉去呢 ??


任務創建 --> 建立 task stack 初始化 r0 ~ r7 等任務第一次運行的資料 (覺得很像不重要,但佔據的空間順序或說個數很重要,往後都是依據每一位址取相對應資料,最後也是最特別的 虛擬 stack 的位置
*stk++ = (INT16U) (ptos+MaxStkSize) >> 8; //?C_XBP 仿真堆棧指針高8位
*stk++ = (INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP 仿真堆棧指針低8位
)
--> 建立 TCB (TCB 內也要建立與 stack的關係)
ptos 可否直接傳入 OSTCBInit 中呢 ? 不轉來轉去 ?? (實際測試是可以的,因為 psp 內容實際與 ptos 相同,只是型別不同而已)

沒有留言:

張貼留言