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

來源:互聯網
上載者:User

1. OSTaskCreate()
    OSTaskCreate()建立一個新任務,可以在多任務環境啟動之前,或者運行任務中建立任務。注意,ISR中禁止建立任務,一個任務必須為無限迴圈結構。   
    原始碼如下:

#if OS_TASK_CREATE_EN > 0                    /* 條件編譯,是否允許任務的建立               */
INT8U  OSTaskCreate (void (*task)(void *pd), /* 函數指標,void *pd為函數的參數             */
                     void *pdata,            /* 建立任務時,傳遞的參數                     */
                     OS_STK *ptos,           /* 指向堆棧任務棧頂的指標                     */
                     INT8U prio)             /* 任務優先順序                                 */
{
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register   */
    OS_CPU_SR  cpu_sr;
#endif
    OS_STK    *psp;
    INT8U      err;

#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

2. OSTaskCreateExt()
    OSTaskCreateExt()為OSTaskCreate()的擴充函數,允許更多的內容設定。
    原始碼如下:

#if OS_TASK_CREATE_EXT_EN > 0
INT8U  OSTaskCreateExt (void   (*task)(void *pd), /* 同上                                    */
                        void    *pdata,    /* 同上                                           */
                        OS_STK  *ptos,     /* 同上                                           */
                        INT8U    prio,     /* 同上                                           */
                        INT16U   id,       /* 任務ID,2.52版本,無實際作用,保留作為擴充用   */
                        OS_STK  *pbos,     /* 指向堆棧底部的指標,用於OSTaskStkChk()函數     */
                        INT32U   stk_size, /* 指定任務堆棧的大小,由OS_STK類型決定           */
                        void    *pext,     /* 定義資料結構的指標,作為TCB的擴充              */
                        INT16U   opt)      /* 存放於任務操作相關的資訊,詳見uCOS-II.H        */
{
#if OS_CRITICAL_METHOD == 3                /* Allocate storage for CPU status register       */
    OS_CPU_SR  cpu_sr;
#endif
    OS_STK    *psp;
    INT8U      err;

#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  */

       /* Reserve the priority to prevent others from doing …  */
       /* … the same thing until task is created.              */
        OSTCBPrioTbl[prio] = (OS_TCB *)1;                OS_EXIT_CRITICAL();

        if (((opt & OS_TASK_OPT_STK_CHK) != 0×0000) ||  
           /* See if stack checking has been enabled     */
            ((opt & OS_TASK_OPT_STK_CLR) != 0×0000)) {  
           /* See if stack needs to be cleared           */
            #if OS_STK_GROWTH == 1
            (void)memset(pbos, 0, stk_size * sizeof(OS_STK));
            #else
            (void)memset(ptos, 0, stk_size * sizeof(OS_STK));
            #endif
        }

        psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt);
                                          /* Initialize the task’s stack                   */
        err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
        if (err == OS_NO_ERR) {
            OS_ENTER_CRITICAL();
            OSTaskCtr++;                  /* Increment the #tasks counter                  */
            OS_EXIT_CRITICAL();
            if (OSRunning == TRUE) {      /* Find HPT if multitasking has started          */
                OS_Sched();
            }
        } else {
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;      /* Make this priority avail. to others  */
            OS_EXIT_CRITICAL();
        }
        return (err);
    }
    OS_EXIT_CRITICAL();
    return (OS_PRIO_EXIST);
}
#endif

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.