Ⅰ、寫在前面
學(xué)習(xí)本文之前可以參看我前面的文章:
UCOS2系統(tǒng)內(nèi)核講述(一)_總體描述
UCOS2系統(tǒng)內(nèi)核講述(二)_初始化調(diào)用函數(shù)
上一篇文章講述了關(guān)于OSInit函數(shù)體中幾個關(guān)于系統(tǒng)內(nèi)核重要的函數(shù),本文將針對上一篇文章中OS_InitTCBList(初始化任務(wù)控制塊)函數(shù)重點(diǎn)講述一下TCB(Task Control Block)任務(wù)控制塊。
TCB任務(wù)控制塊是用來記錄任務(wù)的堆棧指針、任務(wù)的當(dāng)前狀態(tài)、任務(wù)的優(yōu)先級別等一些與任務(wù)有關(guān)屬性的一個數(shù)據(jù)結(jié)構(gòu)表(因此,學(xué)習(xí)本文之前需要了解數(shù)據(jù)結(jié)構(gòu))。任務(wù)控制塊相當(dāng)于一個任務(wù)的“身份證”,它記錄著任務(wù)的重要信息。
對于系統(tǒng)內(nèi)核而言,各個任務(wù)就是通過控制任務(wù)塊將其鏈接成一個表。因此,任務(wù)控制塊在任務(wù)中占據(jù)重要地位。
本文還是結(jié)合前面移植好、可以運(yùn)行的源代碼來進(jìn)行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)核部分代碼(圍繞源代碼來講述)。
對于想學(xué)習(xí)UCOS的朋友,本文講述的內(nèi)容可不用深入理解,可以先做個了解。
關(guān)于本文的更多詳情請往下看。
Ⅱ、全局TCB
在上一篇文章中講述的OS_InitTCBList是整個系統(tǒng)初始化重要的一個函數(shù)。
在該函數(shù)中可以看到OS_TCB這么一個數(shù)據(jù)類型,在第一條執(zhí)行語句中可以看到“OSTCBTbl”這個TCB表,下面可以看到“OSTCBPrioTbl”、“OSTCBList”、“OSTCBFreeList”等一些關(guān)于TCB數(shù)據(jù)類型的變量。由此可知道,這個函數(shù)體里面的內(nèi)容全是關(guān)于OS_TCB類型的。
跟蹤代碼可以知道“OSTCBTbl”這些變量定義在ucos_ii.h中,其實(shí)這些變量是控制整個系統(tǒng)任務(wù)的一些全局TCB.
從變量后面的注釋可以知道關(guān)于任務(wù)的切換需要修改多少變量(指針),下一章節(jié)我們將進(jìn)一步講述關(guān)于“OS_TCB”這個數(shù)據(jù)結(jié)構(gòu)體。
Ⅲ、OS_TCB數(shù)據(jù)結(jié)構(gòu)體
要想理解OS_TCB結(jié)構(gòu)體,需要理解數(shù)據(jù)結(jié)構(gòu)(也就是C語言中結(jié)構(gòu)體、指針、鏈表等這些知識),因?yàn)镺S_TCB里面使用的就是這些知識,先看一下ucos_ii.h中定義的OS_TCB結(jié)構(gòu)體,如下圖:
上面的截圖就是整個“OS_TCB”結(jié)構(gòu)體的內(nèi)容,最重要的幾個參數(shù)就是我用紅色框出來的那些,其他都是次要,或者不必要的參數(shù)。
下面就重點(diǎn)講述一下紅色標(biāo)記的幾個參數(shù):
1.三個重要的OS_TCB參數(shù)
OS_STK *OSTCBStkPtr; 指向當(dāng)前棧頂?shù)闹羔?/p>
struct os_tcb *OSTCBNext; 指向(TCB鏈表中)下一個TCB的指針
struct os_tcb *OSTCBPrev; 指向(TCB鏈表中)上一個TCB的指針
將這三個參數(shù)結(jié)合在一起來講述是為了便于理解任務(wù)控制塊之間的關(guān)聯(lián)。學(xué)過鏈表的人應(yīng)該知道這個寫法,其實(shí)它就是將各個TCB構(gòu)成一個關(guān)聯(lián)的表,利用指針將一個個TCB關(guān)聯(lián)起來。
指向上一個TCB的指針、指向當(dāng)前TCB的指針、指向下一個TCB的指針,初學(xué)者只需要將這三個結(jié)合起來思考,理解起來就不難了。
2.任務(wù)運(yùn)行時重要的OS_TCB參數(shù)
這里說的參數(shù)見上面截圖中最后紅色標(biāo)記部分,這些參數(shù)是任務(wù)運(yùn)行是重要的參數(shù)。
A.INT32U OSTCBDly;任務(wù)延時滴答 或 事件超時等待:
這個參數(shù)結(jié)合實(shí)例中三個任務(wù)的OSTimeDly函數(shù)一起理解就容易多了。OSTimeDly就是將該任務(wù)延時(該任務(wù)掛起)多少個滴答,其中重要的一個參數(shù)就是這里說的“OSTCBDly”,這個參數(shù)傳遞的信息就是延時。
B.INT8U OSTCBStat; 任務(wù)狀態(tài):
這個參數(shù)就是一個標(biāo)示,標(biāo)示任務(wù)處于什么狀態(tài)。包括運(yùn)行、掛起等,具體見ucos_ii.h第101行“TASK STATUS”的宏定義。
C.INT8U OSTCBStatPend; 任務(wù)懸掛狀態(tài):
這個參數(shù)和上面“任務(wù)狀態(tài)”類似。主要包括三個狀態(tài):OS_STAT_PEND_OK、OS_STAT_PEND_TO和OS_STAT_PEND_ABORT。詳情可見ucos_ii.h第117行“TASK PEND STATUS”的宏定義。
D.INT8U OSTCBPrio; 任務(wù)優(yōu)先級:
任務(wù)優(yōu)先級在學(xué)習(xí)UCOS之前都聽說過這個詞,這個參數(shù)就是標(biāo)明任務(wù)優(yōu)先級的參數(shù)。提示的是:任務(wù)優(yōu)先級值越小,其優(yōu)先級越高。所以,空閑任務(wù)優(yōu)先級是設(shè)置最低。
E.優(yōu)先級計算參數(shù)
INT8U OSTCBX; 優(yōu)先級低3位對應(yīng)的數(shù)值,即=prio&0x07
INT8U OSTCBY; 優(yōu)先級高3位對應(yīng)的數(shù)值,即=prio>>3
OS_PRIO OSTCBBitX; "對應(yīng)"就緒表組的值 OSRdyTbl[OSTCBY] |= OSTCBBitX
OS_PRIO OSTCBBitY; 就緒表組 OSRdyGrp |= OSTCBBitY 即上面的"對應(yīng)"組
這四個參數(shù)是計算任務(wù)優(yōu)先級用的,至于是如何計算的,可以自己研究一下。
Ⅳ、實(shí)例工程下載
筆者針對于初學(xué)者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學(xué)者一看就明白,以簡單明了的工程供大家學(xué)習(xí)。
筆者提供的實(shí)例工程都是在板子上經(jīng)過多次測試并沒有問題才上傳至360云盤,歡迎下載測試、參照學(xué)習(xí)。
我將最新UCOS2.92操作系統(tǒng)移植到F0、F1、F3、F4各個硬件平臺上,可以根據(jù)你芯片系列選擇下載。
UCOS基于STM32F0、F1、F3、F4系列實(shí)例工程源代碼(匯總):
https://yunpan.cn/cM9Fjv88cXbjI訪問密碼 048d
本文所講述部分注釋修改為中文(軟件工程源代碼):
https://yunpan.cn/cMGZKfnVVb2Li訪問密碼 49c2
基于STM32平臺的UCOS源代碼工程(官方原始軟件工程)
官網(wǎng)下載(需要賬號):
https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true
360云盤下載:
https://yunpan.cn/cM9Gzv4drXqxv訪問密碼 c82c
-
控制塊
+關(guān)注
關(guān)注
0文章
5瀏覽量
6386 -
STM32F10
+關(guān)注
關(guān)注
0文章
45瀏覽量
15624 -
ucos2
+關(guān)注
關(guān)注
0文章
15瀏覽量
3557 -
操作系統(tǒng)內(nèi)核
+關(guān)注
關(guān)注
0文章
8瀏覽量
2367
發(fā)布評論請先 登錄
相關(guān)推薦
評論