Ⅰ、寫(xiě)在前面
學(xué)習(xí)本文之前可以參看我前面的文章:
UCOS2_STM32F1移植詳細(xì)過(guò)程(匯總文章)
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ù)控制塊是用來(lái)記錄任務(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ù)就是通過(guò)控制任務(wù)塊將其鏈接成一個(gè)表。因此,任務(wù)控制塊在任務(wù)中占據(jù)重要地位。
本文還是結(jié)合前面移植好、可以運(yùn)行的源代碼來(lái)進(jìn)行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)核部分代碼(圍繞源代碼來(lá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ù)類(lèi)型,在第一條執(zhí)行語(yǔ)句中可以看到“OSTCBTbl”這個(gè)TCB表,下面可以看到“OSTCBPrioTbl”、“OSTCBList”、“OSTCBFreeList”等一些關(guān)于TCB數(shù)據(jù)類(lèi)型的變量。由此可知道,這個(gè)函數(shù)體里面的內(nèi)容全是關(guān)于OS_TCB類(lèi)型的。
跟蹤代碼可以知道“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ù)就是我用紅色框出來(lái)的那些,其他都是次要,或者不必要的參數(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é)合在一起來(lái)講述是為了便于理解任務(wù)控制塊之間的關(guān)聯(lián)。學(xué)過(guò)鏈表的人應(yīng)該知道這個(gè)寫(xiě)法,其實(shí)它就是將各個(gè)TCB構(gòu)成一個(gè)關(guān)聯(lián)的表,利用指針將一個(gè)個(gè)TCB關(guān)聯(lián)起來(lái)。
指向上一個(gè)TCB的指針、指向當(dāng)前TCB的指針、指向下一個(gè)TCB的指針,初學(xué)者只需要將這三個(gè)結(jié)合起來(lái)思考,理解起來(lái)就不難了。
2.任務(wù)運(yùn)行時(shí)重要的OS_TCB參數(shù)
這里說(shuō)的參數(shù)見(jiàn)上面截圖中最后紅色標(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ù)就是這里說(shuō)的“OSTCBDly”,這個(gè)參數(shù)傳遞的信息就是延時(shí)。
B.INT8U OSTCBStat; 任務(wù)狀態(tài):
這個(gè)參數(shù)就是一個(gè)標(biāo)示,標(biāo)示任務(wù)處于什么狀態(tài)。包括運(yùn)行、掛起等,具體見(jiàn)ucos_ii.h第101行“TASK STATUS”的宏定義。
C.INT8U OSTCBStatPend; 任務(wù)懸掛狀態(tài):
這個(gè)參數(shù)和上面“任務(wù)狀態(tài)”類(lèi)似。主要包括三個(gè)狀態(tài):OS_STAT_PEND_OK、OS_STAT_PEND_TO和OS_STAT_PEND_ABORT。詳情可見(jiàn)ucos_ii.h第117行“TASK PEND STATUS”的宏定義。
D.INT8U OSTCBPrio; 任務(wù)優(yōu)先級(jí):
任務(wù)優(yōu)先級(jí)在學(xué)習(xí)UCOS之前都聽(tīng)說(shuō)過(guò)這個(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)過(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訪(fǎng)問(wèn)密碼 048d
本文所講述部分注釋修改為中文(軟件工程源代碼):
https://yunpan.cn/cMGZKfnVVb2Li訪(fǎng)問(wèn)密碼 49c2
基于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訪(fǎng)問(wèn)密碼 c82c
-
控制塊
+關(guān)注
關(guān)注
0文章
5瀏覽量
6484 -
STM32F10
+關(guān)注
關(guān)注
0文章
49瀏覽量
16259 -
ucos2
+關(guān)注
關(guān)注
0文章
15瀏覽量
3712 -
操作系統(tǒng)內(nèi)核
+關(guān)注
關(guān)注
0文章
8瀏覽量
2487
發(fā)布評(píng)論請(qǐng)先 登錄
Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)
【瑞薩FPB-RA6E2試用】【瑞薩RA × Zephyr開(kāi)發(fā)板評(píng)測(cè)】+線(xiàn)程創(chuàng)建及測(cè)試
【瑞薩FPB-RA6E2試用】【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實(shí)時(shí)操作系統(tǒng))《線(xiàn)程》個(gè)人理解及項(xiàng)目實(shí)現(xiàn)
【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開(kāi)發(fā)基礎(chǔ)
【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀內(nèi)核處理的核心輔助函數(shù)
米爾RK3506核心板SDK重磅升級(jí),解鎖三核A7實(shí)時(shí)控制新架構(gòu)
嵌入式基礎(chǔ)知識(shí)-系統(tǒng)調(diào)度
什么是嵌入式操作系統(tǒng)?
RTOS Crash 問(wèn)題全維度分析與解決指南
ucos與freertos哪個(gè)好?
單片機(jī)的操作系統(tǒng)
使用函數(shù)塊實(shí)現(xiàn)三相電機(jī)正反轉(zhuǎn)控制
氧濃度監(jiān)控在熱壓鍵合(TCB)工藝過(guò)程中的重要性
【RA4E2開(kāi)發(fā)板評(píng)測(cè)】電壓檢測(cè)器 ThreadX顯示量程0-3300 mV+CPU利用率+任務(wù)當(dāng)前使用棧
強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(一):驅(qū)動(dòng)安裝、內(nèi)核配置與使用
UCOS2系統(tǒng)內(nèi)核講述(三)_ TCB任務(wù)控制塊
評(píng)論