OSTaskCreate()函數分析

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值爲假,所以創建任務的時候,不會引發一次任務調度。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章