Ⅰ、寫在前面
學習本文之前可以參看我前面的文章:
UCOS2系統內核講述(四)_創建任務
上一篇文章講述了關于函數“OSTaskCreateExt”創建任務函數體里面重要一些的內容,本文接著上一張講述關于“OSTaskCreateExt”函數體里面調用的一個函數“OS_TCBInit”初始化任務控制塊,“OS_TCBInit”也是與系統內核緊密相關的一個函數。
關于本文的更多詳情請往下看。
Ⅱ、OS_TCBInit參數詳情
在學習OS_TCBInit之前要明確一下,“OS_TCBInit”和“OS_InitTCBList”(OSInit下面調用的函數),從命名上看上去有點相似,但仔細看一下區別還是可以看到出來的。
“OS_InitTCBList”在前面文章有講述過(可以看我前面相關的文章),主要是初始化TCB鏈表。“OS_InitTCBList”函數體內容相關于將TCB鏈表復位。
本文將的“OS_TCBInit”是在創建任務時初始化一個任務的TCB,要將優先級、堆棧等信息初始化。“OS_TCBInit”函數體內容相當于對任務的TCB里面對應的內容落實到具體的參數上。
可以將“OS_TCBInit”和“OS_InitTCBList”區別比喻如下:
“OS_TCBInit”是將某一個整形變量初始話為0(復位值);
“OS_InitTCBList”是將某一個整形變量賦值為1(具體值);
從main函數跟蹤代碼可以找到“OS_TCBInit”函數,如下動畫:
“OS_TCBInit”函數的每一個參數在函數體源代碼上面都有注釋(我也將源代碼注釋修改為中文了,可以下載參看)。
該函數位于“os_core.c”下面;
1.第一個參數prio
prio看過UCOS系統的朋友應該對整個參數不會陌生,它就是任務的優先級。
這個參數是從“OSTaskCreateExt”函數參數中傳下來的(原封不動,一樣的參數)。
注意:任務的優先級數值越小,它的優先級越高。比如:
Task1優先級是1,Task2優先級是2。則Task1優先級高于Task2的優先級。
2.第二個參數ptos
ptos這個參數和上一篇文章中OSTaskCreateExt創建任務中的ptos一樣,是指向棧頂的指針。創建任務中利用“OSTaskStkInit”初始化堆棧得到棧頂的指針psp,將該指針傳遞給OS_TCBInit函數的參數。
同樣說明一下:這個參數和“第三個參數pbos”對應,需要根據棧的增長方向“OS_STK_GROWTH”來決定。
3.第三個參數pbos
pbos這個參數和“第二個參數”一樣,是從上一層的OSTaskCreateExt創建任務中的ptob參數意思一樣,是指向棧底的指針。
4.第四個參數id
id這個參數不多說,和上文一樣的意思。
5.第五個參數stk_size
stk_size這個參數和上一篇文章也是一樣,這里再提示一下,它就是堆棧的大小,就是你分配堆棧空間(定義堆棧數組)的大小。
6.第六個參數pext
pext這個參數是指向用戶提供的內存(指針)。
這個參數對初學者意義不大,可暫時不用去理解它,你把它理解為擴展使用就是了。
7.第六個參數opt
opt:用戶操作選項參數。
上一篇文章已經說的很詳細,具體說明見上一篇文章。
到此,細心的會發現,其實“OS_TCBInit”函數的參數基本是繼承“OSTaskCreateExt”函數的參數。從這里可以看得出“OS_TCBInit”函數才是創建任務重要的函數。
Ⅲ、OS_TCBInit函數體內容描述
上一章節講述了“OS_TCBInit”的參數,其實傳遞進來的參數是保存在TCB鏈表里面的,用于保存一個任務重要的信息,具體如何實現就要看接下來的函數體說明(建議下載源代碼一起參考學習)。
1.第一部分
A.鏈表節點及參數:
OSTCBFreeList是當前空閑TCB鏈表,相當于每初始化一個任務就要將OSTCBFreeList指向下一個沒有使用的FreeList,保證在每次創建任務的時候有OSTCBFreeList可用。
if (ptcb != (OS_TCB *)0)
這個條件就是上面說的,判斷還有沒有空閑TCB鏈表,如果沒有空閑TCB鏈表就會返回“錯誤”。
OSTCBFreeList = ptcb->OSTCBNext;指向下一個TCB鏈表。
下面來的就是其它參數賦值(堆棧、優先級、任務狀態就緒等)。
B.任務參數:
這里說的任務參數和上一篇文章說的不一樣,主要說的是傳遞下來的參數信息,歸位到對應的空間,也就是參數賦值。
ptcb->OSTCBDelReq = OS_ERR_NONE;
這里有一個語句,就是任務可以刪除(當我們使能了刪除任務功能,在創建任務之后就可以刪除創建的任務)。
2.第二部分
A.優先級:
UCOS優先級實現其功能具體的這部分是比較困難的,使用了“優先級表”,而且查找優先級的算法也相對來說比較困難,初學者暫時可以不用考慮,感興趣的朋友可以網上“UCOS優先級調度算法”。
B.事件:
這個需要結合事件(信號量、消息郵箱等)來講述,我會在后面講述UCOS資源的事件中提及相關的信息。
C.性能分析參數:
這個參數可以從注釋的意思來理解,“性能分析”意思就是對系統運行的性能,CPU使用率等來理解。前面在講述OS_TaskIdle空閑任務時就看到,函數體里面有這么一條語句:OSIdleCtr++; 也就是統計空閑任務的計數次數。
3.第三部分
在上面上部分的“準備”工作之后,這剩下的就是“就緒”工作了。
OSTCBInitHook(ptcb);和OSTaskCreateHook(ptcb);這兩個函數一般都是成對出現,是用戶自己的HOOK函數,用戶自己要實現某一些功能就寫在這里。
OSTCBPrioTbl[prio] = ptcb; 這條語句將該任務在TCB表中有一個對應的位置。
ptcb->OSTCBNext = OSTCBList;和上面第一部分類似,指向TCB鏈表。
OSTaskCtr++;任務也有一個統計計數的變量。
Ⅳ、實例工程下載
筆者針對于初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明了的工程供大家學習。
筆者提供的實例工程都是在板子上經過多次測試并沒有問題才上傳至360云盤,歡迎下載測試、參照學習。
我將最新UCOS2.92操作系統移植到F0、F1、F3、F4各個硬件平臺上,可以根據你芯片系列選擇下載。
UCOS基于STM32F0、F1、F3、F4系列實例工程源代碼(匯總):
https://yunpan.cn/cM9Fjv88cXbjI訪問密碼 048d
本文講述的部分注釋修改為中文(軟件工程源代碼):
https://yunpan.cn/ckKeBFx25VIEB訪問密碼 a9df
基于STM32平臺的UCOS源代碼工程(官方原始軟件工程)
官網下載(需要賬號):
https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true
360云盤下載:
https://yunpan.cn/cM9Gzv4drXqxv訪問密碼 c82c
-
源代碼
+關注
關注
96文章
2946瀏覽量
66811 -
ucos2
+關注
關注
0文章
15瀏覽量
3563 -
操作系統內核
+關注
關注
0文章
8瀏覽量
2377
發布評論請先 登錄
相關推薦
評論