1. 程式人生 > >uC/OS II 函式說明 之–OSTaskCreate()與OSTaskCreateExt()

uC/OS II 函式說明 之–OSTaskCreate()與OSTaskCreateExt()

#if OS_ARG_CHK_EN > 0
    if (prio > OS_LOWEST_PRIO) {             /* 引數檢查,優先順序是否處於允許優先順序之內     */
        return (OS_PRIO_INVALID);
    }
#endif
    OS_ENTER_CRITICAL();                     /* 關中斷                                     */
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* 判斷任務的優先順序是否存在,如不存在,設定任 */
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* 務優先順序為1設定優先順序後,就可以開中斷了,  */
                                             /* 不用擔心衝突,因為該優先順序已經被佔了       */
        OS_EXIT_CRITICAL();
        psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);   
                                    /* 初始化堆疊,此函式與具體的硬體有關,OS_CPU_C.C      */
        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 詳見此函式的說明  */
        if (err == OS_NO_ERR) {
            OS_ENTER_CRITICAL();
            OSTaskCtr++;                     /* 任務計數器加1,統計執行的任務數            */
            OS_EXIT_CRITICAL();
            if (OSRunning == TRUE) {         /* 如果是在任務執行過程中新建任務,需要進行   */
                OS_Sched();                  /* 任務排程,保證 優先順序最高的任務處於執行態  */
            }
        } else {
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* 如果任務建立失敗,優先順序設定為0,放棄該    */
                                             /* 任務的優先順序保證別的任務建立時可以使用     */
                                             /* 此優先順序                                   */
            OS_EXIT_CRITICAL();
        }
        return (err);                        /* 建立任務失敗,返回錯誤程式碼                 */
    }
    OS_EXIT_CRITICAL();
    return (OS_PRIO_EXIST);                  /* 返回OS_PRIO_EXIST,告知任務優先順序已經存在  */
}
#endif