Ⅰ、寫在前面
學(xué)習(xí)本文之前可以參看我前面的文章:
UCOS2系統(tǒng)內(nèi)核講述(一)_總體描述
UCOS2系統(tǒng)內(nèi)核講述(二)_初始化調(diào)用函數(shù)
上一篇文章講述了關(guān)于OSInit函數(shù)體中幾個(gè)關(guān)于系統(tǒng)內(nèi)核重要的函數(shù),本文將針對(duì)上一篇文章中OS_InitTCBList(初始化任務(wù)控制塊)函數(shù)重點(diǎn)講述一下TCB(Task Control Block)任務(wù)控制塊。
TCB任務(wù)控制塊是用來記錄任務(wù)的堆棧指針、任務(wù)的當(dāng)前狀態(tài)、任務(wù)的優(yōu)先級(jí)別等一些與任務(wù)有關(guān)屬性的一個(gè)數(shù)據(jù)結(jié)構(gòu)表(因此,學(xué)習(xí)本文之前需要了解數(shù)據(jù)結(jié)構(gòu))。任務(wù)控制塊相當(dāng)于一個(gè)任務(wù)的“身份證”,它記錄著任務(wù)的重要信息。
對(duì)于系統(tǒng)內(nèi)核而言,各個(gè)任務(wù)就是通過控制任務(wù)塊將其鏈接成一個(gè)表。因此,任務(wù)控制塊在任務(wù)中占據(jù)重要地位。
本文還是結(jié)合前面移植好、可以運(yùn)行的源代碼來進(jìn)行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)核部分代碼(圍繞源代碼來講述)。
對(duì)于想學(xué)習(xí)UCOS的朋友,本文講述的內(nèi)容可不用深入理解,可以先做個(gè)了解。
關(guān)于本文的更多詳情請(qǐng)往下看。
Ⅱ、全局TCB
在上一篇文章中講述的OS_InitTCBList是整個(gè)系統(tǒng)初始化重要的一個(gè)函數(shù)。
在該函數(shù)中可以看到OS_TCB這么一個(gè)數(shù)據(jù)類型,在第一條執(zhí)行語(yǔ)句中可以看到“OSTCBTbl”這個(gè)TCB表,下面可以看到“OSTCBPrioTbl”、“OSTCBList”、“OSTCBFreeList”等一些關(guān)于TCB數(shù)據(jù)類型的變量。由此可知道,這個(gè)函數(shù)體里面的內(nèi)容全是關(guān)于OS_TCB類型的。
跟蹤代碼可以知道“OSTCBTbl”這些變量定義在ucos_ii.h中,其實(shí)這些變量是控制整個(gè)系統(tǒng)任務(wù)的一些全局TCB.
從變量后面的注釋可以知道關(guān)于任務(wù)的切換需要修改多少變量(指針),下一章節(jié)我們將進(jìn)一步講述關(guān)于“OS_TCB”這個(gè)數(shù)據(jù)結(jié)構(gòu)體。
Ⅲ、OS_TCB數(shù)據(jù)結(jié)構(gòu)體
要想理解OS_TCB結(jié)構(gòu)體,需要理解數(shù)據(jù)結(jié)構(gòu)(也就是C語(yǔ)言中結(jié)構(gòu)體、指針、鏈表等這些知識(shí)),因?yàn)镺S_TCB里面使用的就是這些知識(shí),先看一下ucos_ii.h中定義的OS_TCB結(jié)構(gòu)體,如下圖:
上面的截圖就是整個(gè)“OS_TCB”結(jié)構(gòu)體的內(nèi)容,最重要的幾個(gè)參數(shù)就是我用紅色框出來的那些,其他都是次要,或者不必要的參數(shù)。
下面就重點(diǎn)講述一下紅色標(biāo)記的幾個(gè)參數(shù):
1.三個(gè)重要的OS_TCB參數(shù)
OS_STK *OSTCBStkPtr; 指向當(dāng)前棧頂?shù)闹羔?/p>
struct os_tcb *OSTCBNext; 指向(TCB鏈表中)下一個(gè)TCB的指針
struct os_tcb *OSTCBPrev; 指向(TCB鏈表中)上一個(gè)TCB的指針
將這三個(gè)參數(shù)結(jié)合在一起來講述是為了便于理解任務(wù)控制塊之間的關(guān)聯(lián)。學(xué)過鏈表的人應(yīng)該知道這個(gè)寫法,其實(shí)它就是將各個(gè)TCB構(gòu)成一個(gè)關(guān)聯(lián)的表,利用指針將一個(gè)個(gè)TCB關(guān)聯(lián)起來。
指向上一個(gè)TCB的指針、指向當(dāng)前TCB的指針、指向下一個(gè)TCB的指針,初學(xué)者只需要將這三個(gè)結(jié)合起來思考,理解起來就不難了。
2.任務(wù)運(yùn)行時(shí)重要的OS_TCB參數(shù)
這里說的參數(shù)見上面截圖中最后紅色標(biāo)記部分,這些參數(shù)是任務(wù)運(yùn)行是重要的參數(shù)。
A.INT32U OSTCBDly;任務(wù)延時(shí)滴答 或 事件超時(shí)等待:
這個(gè)參數(shù)結(jié)合實(shí)例中三個(gè)任務(wù)的OSTimeDly函數(shù)一起理解就容易多了。OSTimeDly就是將該任務(wù)延時(shí)(該任務(wù)掛起)多少個(gè)滴答,其中重要的一個(gè)參數(shù)就是這里說的“OSTCBDly”,這個(gè)參數(shù)傳遞的信息就是延時(shí)。
B.INT8U OSTCBStat; 任務(wù)狀態(tài):
這個(gè)參數(shù)就是一個(gè)標(biāo)示,標(biāo)示任務(wù)處于什么狀態(tài)。包括運(yùn)行、掛起等,具體見ucos_ii.h第101行“TASK STATUS”的宏定義。
C.INT8U OSTCBStatPend; 任務(wù)懸掛狀態(tài):
這個(gè)參數(shù)和上面“任務(wù)狀態(tài)”類似。主要包括三個(gè)狀態(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)先級(jí):
任務(wù)優(yōu)先級(jí)在學(xué)習(xí)UCOS之前都聽說過這個(gè)詞,這個(gè)參數(shù)就是標(biāo)明任務(wù)優(yōu)先級(jí)的參數(shù)。提示的是:任務(wù)優(yōu)先級(jí)值越小,其優(yōu)先級(jí)越高。所以,空閑任務(wù)優(yōu)先級(jí)是設(shè)置最低。
E.優(yōu)先級(jí)計(jì)算參數(shù)
INT8U OSTCBX; 優(yōu)先級(jí)低3位對(duì)應(yīng)的數(shù)值,即=prio&0x07
INT8U OSTCBY; 優(yōu)先級(jí)高3位對(duì)應(yīng)的數(shù)值,即=prio>>3
OS_PRIO OSTCBBitX; "對(duì)應(yīng)"就緒表組的值 OSRdyTbl[OSTCBY] |= OSTCBBitX
OS_PRIO OSTCBBitY; 就緒表組 OSRdyGrp |= OSTCBBitY 即上面的"對(duì)應(yīng)"組
這四個(gè)參數(shù)是計(jì)算任務(wù)優(yōu)先級(jí)用的,至于是如何計(jì)算的,可以自己研究一下。
Ⅳ、實(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/cMGZKfnVVb2Li訪問密碼 49c2
基于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)注
0文章
5瀏覽量
6425 -
STM32F10
+關(guān)注
關(guān)注
0文章
47瀏覽量
15895 -
ucos2
+關(guān)注
關(guān)注
0文章
15瀏覽量
3640 -
操作系統(tǒng)內(nèi)核
+關(guān)注
關(guān)注
0文章
8瀏覽量
2435
發(fā)布評(píng)論請(qǐng)先 登錄
強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(一):驅(qū)動(dòng)安裝、內(nèi)核配置與使用

第三屆大會(huì)回顧第5期 | OpenHarmony內(nèi)核實(shí)時(shí)性探索

RTOS中的本地存儲(chǔ)指針使用

淺談Windows實(shí)時(shí)性拓展對(duì)工業(yè)控制的重要意義
TCB熱壓鍵合:打造高性能半導(dǎo)體封裝的秘訣

鴻道Intewell工業(yè)操作系統(tǒng),三大關(guān)鍵技術(shù),領(lǐng)跑行業(yè)前沿
電動(dòng)工具電機(jī)的塊換向與FOC控制解析

Linux計(jì)劃任務(wù)介紹
邏輯組件中的流程塊節(jié)點(diǎn)通常出于什么用途
自動(dòng)發(fā)電控制系統(tǒng)的基本任務(wù)
TI Arm內(nèi)核三角函數(shù)的優(yōu)化

評(píng)論