Ⅰ、寫在前面
學(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ū)別還是可以看到出來的。
“OS_InitTCBList”在前面文章有講述過(可以看我前面相關(guān)的文章),主要是初始化TCB鏈表?!癘S_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)畫:
“OS_TCBInit”函數(shù)的每一個(gè)參數(shù)在函數(shù)體源代碼上面都有注釋(我也將源代碼注釋修改為中文了,可以下載參看)。
該函數(shù)位于“os_core.c”下面;
1.第一個(gè)參數(shù)prio
prio看過UCOS系統(tǒng)的朋友應(yīng)該對(duì)整個(gè)參數(shù)不會(huì)陌生,它就是任務(wù)的優(yōu)先級(jí)。
這個(gè)參數(shù)是從“OSTaskCreateExt”函數(shù)參數(shù)中傳下來的(原封不動(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ù)。
同樣說明一下:這個(gè)參數(shù)和“第三個(gè)參數(shù)pbos”對(duì)應(yīng),需要根據(jù)棧的增長(zhǎng)方向“OS_STK_GROWTH”來決定。
3.第三個(gè)參數(shù)pbos
pbos這個(gè)參數(shù)和“第二個(gè)參數(shù)”一樣,是從上一層的OSTaskCreateExt創(chuàng)建任務(wù)中的ptob參數(shù)意思一樣,是指向棧底的指針。
4.第四個(gè)參數(shù)id
id這個(gè)參數(shù)不多說,和上文一樣的意思。
5.第五個(gè)參數(shù)stk_size
stk_size這個(gè)參數(shù)和上一篇文章也是一樣,這里再提示一下,它就是堆棧的大小,就是你分配堆??臻g(定義堆棧數(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)說的很詳細(xì),具體說明見上一篇文章。
到此,細(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)來的參數(shù)是保存在TCB鏈表里面的,用于保存一個(gè)任務(wù)重要的信息,具體如何實(shí)現(xiàn)就要看接下來的函數(shù)體說明(建議下載源代碼一起參考學(xué)習(xí))。
1.第一部分
A.鏈表節(jié)點(diǎn)及參數(shù):
OSTCBFreeList是當(dāng)前空閑TCB鏈表,相當(dāng)于每初始化一個(gè)任務(wù)就要將OSTCBFreeList指向下一個(gè)沒有使用的FreeList,保證在每次創(chuàng)建任務(wù)的時(shí)候有OSTCBFreeList可用。
if (ptcb != (OS_TCB *)0)
這個(gè)條件就是上面說的,判斷還有沒有空閑TCB鏈表,如果沒有空閑TCB鏈表就會(huì)返回“錯(cuò)誤”。
OSTCBFreeList = ptcb->OSTCBNext;指向下一個(gè)TCB鏈表。
下面來的就是其它參數(shù)賦值(堆棧、優(yōu)先級(jí)、任務(wù)狀態(tài)就緒等)。
B.任務(wù)參數(shù):
這里說的任務(wù)參數(shù)和上一篇文章說的不一樣,主要說的是傳遞下來的參數(shù)信息,歸位到對(duì)應(yīng)的空間,也就是參數(shù)賦值。
ptcb->OSTCBDelReq = OS_ERR_NONE;
這里有一個(gè)語句,就是任務(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ì)來說比較困難,初學(xué)者暫時(shí)可以不用考慮,感興趣的朋友可以網(wǎng)上“UCOS優(yōu)先級(jí)調(diào)度算法”。
B.事件:
這個(gè)需要結(jié)合事件(信號(hào)量、消息郵箱等)來講述,我會(huì)在后面講述UCOS資源的事件中提及相關(guān)的信息。
C.性能分析參數(shù):
這個(gè)參數(shù)可以從注釋的意思來理解,“性能分析”意思就是對(duì)系統(tǒng)運(yùn)行的性能,CPU使用率等來理解。前面在講述OS_TaskIdle空閑任務(wù)時(shí)就看到,函數(shù)體里面有這么一條語句: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)某一些功能就寫在這里。
OSTCBPrioTbl[prio] = ptcb; 這條語句將該任務(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)過多次測(cè)試并沒有問題才上傳至360云盤,歡迎下載測(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訪問密碼 048d
本文講述的部分注釋修改為中文(軟件工程源代碼):
https://yunpan.cn/ckKeBFx25VIEB訪問密碼 a9df
基于STM32平臺(tái)的UCOS源代碼工程(官方原始軟件工程)
官網(wǎng)下載(需要賬號(hào)):
https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true
360云盤下載:
https://yunpan.cn/cM9Gzv4drXqxv訪問密碼 c82c
-
源代碼
+關(guān)注
關(guān)注
96文章
2953瀏覽量
68404 -
ucos2
+關(guān)注
關(guān)注
0文章
15瀏覽量
3641 -
操作系統(tǒng)內(nèi)核
+關(guān)注
關(guān)注
0文章
8瀏覽量
2436
發(fā)布評(píng)論請(qǐng)先 登錄
定義IO初始化結(jié)構(gòu)體
NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)之七:系統(tǒng)初始化
IM 系列設(shè)備過載保護(hù)機(jī)制下界面初始化中斷的底層邏輯與解決方案
STM32CubeMX用于STM32配置和初始化C代碼生成
EE-359:ADSP-CM40x啟動(dòng)時(shí)間優(yōu)化和器件初始化

EE-88:使用21xx編譯器在C中初始化變量

OMAP5912多媒體處理器初始化參考指南

STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

segger編譯器初始化問題
請(qǐng)問LMX2595配置時(shí)如何進(jìn)行初始化?
基于旋轉(zhuǎn)平移解耦框架的視覺慣性初始化方法

TMS320C6000 McBSP初始化

如何在i.MX RT微控制器上初始化LWIP協(xié)議棧

視頻引擎初始化失敗怎么回事
瀚海微SD NAND應(yīng)用之SD協(xié)議存儲(chǔ)功能描述2 初始化命令

評(píng)論