Ⅰ、寫(xiě)在前面
學(xué)習(xí)本文之前可以參看我前面的文章:
UCOS2_STM32F1移植詳細(xì)過(guò)程(匯總文章)
UCOS2系統(tǒng)內(nèi)核講述(一)_總體描述
還是按照上一篇文章的思維(從外到內(nèi)),本文(結(jié)合源代碼)進(jìn)一步深入U(xiǎn)COS系統(tǒng)內(nèi)核,我會(huì)將講述過(guò)的源代碼注釋修改為中文,提供給大家參考。
上一篇文章總體描述了一下整個(gè)工程“外圍”的代碼,本文將進(jìn)一步“入圍”,進(jìn)一步講述OSInit所調(diào)用的函數(shù)。
本文還是結(jié)合前面移植好、可以運(yùn)行的源代碼來(lái)進(jìn)行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)核部分代碼(圍繞源代碼來(lái)講述)。
本文講述的內(nèi)容不必深入理解,可以先做個(gè)了解。
關(guān)于本文的更多詳情請(qǐng)往下看。
Ⅱ、OSInit所調(diào)用的函數(shù)
上一篇文章大概講述了關(guān)于該函數(shù)的內(nèi)容,本文將進(jìn)一步講述OSInit系統(tǒng)初始化。
我將OSInit所調(diào)用的函數(shù)分為兩類(lèi):必須類(lèi)和非必須類(lèi)。
必須類(lèi):與系統(tǒng)、任務(wù)緊密相關(guān)的初始化。其實(shí)這些初始化就是對(duì)變量、結(jié)構(gòu)體等賦予初始值。(如:系統(tǒng)運(yùn)行標(biāo)志位初始化暫停運(yùn)行、最高優(yōu)先級(jí)指向空等)它們的初始化位于系統(tǒng)內(nèi)核os_core.c里面。
非必須類(lèi):這一類(lèi)就是可以不調(diào)用來(lái)初始化的一類(lèi)。從代碼可以看他們前面有一個(gè)預(yù)處理標(biāo)志位【如:#if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)】,這些標(biāo)志位位于os_cfg.h(前面說(shuō)過(guò)系統(tǒng)的裁剪),當(dāng)我們不使用這些功能時(shí),也就是系統(tǒng)裁剪掉了這些功能,它們就不會(huì)被初始化。
事件標(biāo)志組、內(nèi)存管理、消息隊(duì)列等這些就屬于非必須類(lèi),它們的初始化位于自身的.c文件里面(不位于os_core.c)。【如:OS_FlagInit位于os_flag.c文件里面】
下面講述一下必須類(lèi)(非必須類(lèi)在后面結(jié)合相關(guān)資源講述):
1.OS_InitMisc(必須類(lèi))
這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)初始化各項(xiàng)變量。對(duì)紅色框內(nèi)參數(shù)初始化數(shù)值,這些參數(shù)是系統(tǒng)必須的變量,類(lèi)似于我們定義一個(gè)全局變量,初始的時(shí)候?qū)λM(jìn)行賦值。
2.OS_InitRdyList(必須類(lèi))
這個(gè)函數(shù)被OSInit()調(diào)用來(lái)初始化就緒表。這里說(shuō)的就緒表其實(shí)指的是把一個(gè)一個(gè)任務(wù)排列成一個(gè)表,要將這個(gè)表初始化的意思。要執(zhí)行響應(yīng)任務(wù)就需要知道任務(wù)的優(yōu)先級(jí)、任務(wù)控制塊、目前指向的任務(wù)等一系列信息。
3.OS_InitTCBList(必須類(lèi))
這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)初始化空閑TCB(任務(wù)控制塊)。這個(gè)初始化函數(shù)包含的信息是比較難的,也是系統(tǒng)比較重要的(后面會(huì)對(duì)TCB進(jìn)行講述)。
所謂任務(wù)控制塊,就是控制任務(wù)相關(guān)變量數(shù)據(jù)信息各類(lèi)的結(jié)構(gòu)體的歸類(lèi),其結(jié)構(gòu)體里面包含的信息是很多的。
理解TCB就需要對(duì)數(shù)據(jù)結(jié)構(gòu)有一定的熟悉才行。
4.OS_InitEventList(必須類(lèi))
這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)初始化空閑ECB(事件控制塊)。這個(gè)函數(shù)雖然我把它歸類(lèi)到系統(tǒng)必須類(lèi)這一塊,其實(shí)不完全正確。這里所說(shuō)的事件,其實(shí)就是系統(tǒng)相關(guān)資源(消息隊(duì)列、郵箱、信號(hào)量、互斥信號(hào)量等)的一個(gè)或集。在ucos_ii.h中可以看到下面宏定義:
#define OS_EVENT_EN (((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u) || (OS_SEM_EN > 0u) || (OS_MUTEX_EN > 0u))
消息隊(duì)列、郵箱、信號(hào)量、互斥信號(hào)量等這些資源要被系統(tǒng)所調(diào)用,就需要進(jìn)行初始化。系統(tǒng)把他們定義為事件,而使用是需要調(diào)用相關(guān)數(shù)據(jù),系統(tǒng)就把他們定義為ECB(事件控制塊),有點(diǎn)類(lèi)似于TCB(任務(wù)控制塊)。
5.OS_InitTaskIdle(必須類(lèi))
這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)創(chuàng)建空閑任務(wù)。這個(gè)函數(shù)在本節(jié)開(kāi)頭截圖中沒(méi)有截取出來(lái)(屏幕高度有限),其實(shí)這個(gè)函數(shù)也是屬于系統(tǒng)必須初始化的函數(shù)。空閑函數(shù)其實(shí)就是系統(tǒng)把所創(chuàng)建的任務(wù)都處理完了,那些都掛起了,或刪除了,系統(tǒng)空閑沒(méi)事做了,它就會(huì)來(lái)執(zhí)行這個(gè)空閑任務(wù)。
空閑任務(wù)在統(tǒng)計(jì)中起到一定作用,所謂統(tǒng)計(jì),就是我們都知道的CPU占用率,空閑統(tǒng)計(jì)的越多,CPU空閑越多,那么CPU占用率就越低。【從CPU使用率應(yīng)該很容易理解為什么要?jiǎng)?chuàng)建空閑任務(wù)】
Ⅲ、實(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系列實(shí)例:
https://yunpan.cn/cByHFxCfpaIbh訪(fǎng)問(wèn)密碼 4437
UCOS基于STM32F1系列實(shí)例:
https://yunpan.cn/cByHum5BStkEK訪(fǎng)問(wèn)密碼 00a6
UCOS基于STM32F3系列實(shí)例:
https://yunpan.cn/cByHrMmkekIar訪(fǎng)問(wèn)密碼 da90
UCOS基于STM32F4系列實(shí)例:
https://yunpan.cn/cByHx47jehTgX訪(fǎng)問(wèn)密碼 5a04
本文所講述部分注釋修改為中文:
https://yunpan.cn/cMGZKfnVVb2Li訪(fǎng)問(wèn)密碼 49c2
-
ucos2
+關(guān)注
關(guān)注
0文章
15瀏覽量
3557 -
操作系統(tǒng)內(nèi)核
+關(guān)注
關(guān)注
0文章
8瀏覽量
2365 -
調(diào)用函數(shù)
+關(guān)注
關(guān)注
0文章
11瀏覽量
2300
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論