INT8U OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio)
;函數返回一個8位的整型數,調用該函數需要四個參數。第一個參數一個指針,也就是用戶代碼的首地址,在平時使用中我們把自己創建的任務的名字作爲這個參數就可以了;第三個參數是指向任務堆棧棧頂的指針,通常我們把創建的任務的堆棧數組的首地址給第三個參數就可以了;第四個參數是任務的優先級;第二個參數是什麼意思?還不太理解。
OS_STK *psp;
INT8U err; ;創建一個指向數據類型爲OS_STK的指針和一個8位的整型數
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
return (OS_PRIO_INVALID);
}
#endif
;判斷該任務的優先級是否有效
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
/* ... the same thing until task is created. */
OS_EXIT_CRITICAL(); ;判斷該優先級是否被佔用
;優先級未被佔用,執行以下程序
psp = (OS_STK *)OSTaskStkInit(task, p_arg, ptos, 0); ;初始化堆棧
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); ;初始化任務控制塊
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++; /* Increment the #tasks counter */
OS_EXIT_CRITICAL();
if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */
OS_Sched(); ;此時OSRunning 等於假,也就是在創建任務的時候並不能引發任務調度僅 ;僅是創建任務而已。
}
} else { ;該優先級已經被佔用,則只把該任務優先級釋放掉
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
綜上所述,創建任務時的主要工作是:第一,判斷該優先級是否有效;第二判斷該優先級是否被佔用,若被佔用則釋放掉該優先級並返回OS_PRIO_EXIST;第三,若優先級未被佔用,就初始化任務堆棧和任務控制塊,初始化任務控制塊返回正確信息時,將 OSTaskCtr加1;第四,判斷OSRunning,爲真就引發一次任務調度,爲假則程序結束。
似乎在創建任務的時候OSRunning值爲假,所以創建任務的時候,不會引發一次任務調度。