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