1. 程式人生 > >uCOS-II OSTaskCreate函式分析

uCOS-II OSTaskCreate函式分析

ucos版本:V2.91

函式名:OSTaskCreate

函式原型位置:os_task.c:206行

首先看形參列表及返回值:


返回值型別為INT8U,用於儲存錯誤標誌。

第一個引數為:void (*task)(void *p_arg),此處為一函式指標,用於指定任務執行的函式。

第二個引數為:void *p_arg,用於指定任務執行函式的引數。

第三個引數為:OS_STK *ptos,型別為OS_STK ,OS_STK為unsigned int型別,用於指定棧頂指標。

第四個引數為:INT8U prio,用於指定優先順序(優先順序是唯一的)

首先定義幾個變數,psp用來儲存堆疊指標。err用來儲存錯誤標誌,cpu_sr用來出入臨界區。

接下來做優先順序引數檢查,這裡可以通過OS_ARG_CHK_EN巨集來開啟或關閉檢查,如果當前設定優先順序大於OS_LOWEST_PRIO,返回優先順序不可用錯誤(OS_ERR_PRIO_INVALID)


進入臨界區,


這裡介紹一下什麼是所謂的臨界區,觀察函式定義,os_cpu.h:71


繼續觀察OS_CPU_SR_Save()函式定義

os_cpu_a.asm(行數不一定)程式碼如下:

可以看到,進入臨界區就是關閉中斷。

接下來確保建立任務不在中斷中進行,這裡涉及到一個全域性變數OSIntNesting,這個變數用來記錄中斷巢狀層數,發生中斷時,這個變數自加1,如果當前有中斷髮生,退出臨界區,返回中斷中建立任務的錯誤(OS_ERR_TASK_CREATE_ISR)

接下來準備佔坑:先判斷該優先順序是否存在,如果存在,退出臨界區,返回優先順序已存在錯誤(OS_ERR_PRIO_EXIST),如果該優先順序不存在,則佔坑,然後退出臨界區。


接下來初始化任務堆疊和任務控制塊。

初始化任務堆疊,

傳入引數為:task(任務處理函式指標),p_arg(函式引數),ptos(堆疊指標), opt(無用)

然後初始化任務控制塊

傳入引數有prio(優先順序),psp(堆疊指標),其餘暫時不管

該函式中,會從TCB池中獲取一個空的TCB塊,然後進行初始化。初始化優先順序,堆疊指標,設定執行標誌位,清除掛起標誌位。

一系列初始化完成後,更新OSTCBPrioTbl,並加入到任務連結串列。

最後設定任務就緒表。


至此,任務建立完成。對於任務就緒表的設定及如何查詢最高優先順序任務,請看下篇文章。