Ⅰ、寫在前面
學(xué)習(xí)本文之前可以參考我前面基于STM32硬件平臺移植UCOS2的幾篇文章,我將其匯總在一起:
UCOS2_STM32F1移植詳細(xì)過程(匯總文章)
要想學(xué)習(xí),或使用系統(tǒng)配套的資源(如:信號量、消息郵箱、消息隊列等),就需要先了解一下系統(tǒng)內(nèi)核大致的原理,也就是先了解大致,在研究細(xì)節(jié)的東西(從外到內(nèi)),本文就是接著前面移植的文章來講述關(guān)于系統(tǒng)內(nèi)核的知識。
本文主要是結(jié)合前面移植好、可以運(yùn)行的源代碼來進(jìn)行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)部代碼。
關(guān)于本文的更多詳情請往下看。
Ⅱ、UCOS操作系統(tǒng)配置
看過我前面移植UCOS的文章,或打開過我移植成功的軟件工程,都應(yīng)該大體知道一個簡單的UCOS系統(tǒng)大概需要一些什么配置,包含哪些部分等。
本節(jié)將對UCOS軟件工程總體的一些知識進(jìn)行講述(從大方向來描述一下),也算是對某些知識的再次回顧。
UCOS系統(tǒng)配置就是修改os_cfg.h文件,就是使能或失能某些功能,也就是所謂的系統(tǒng)裁剪。
比如:
我們不使能APP應(yīng)用HOOK函數(shù)
則#defineOS_APP_HOOKS_EN0u
如果使能APP應(yīng)用HOOK函數(shù)
則#define OS_APP_HOOKS_EN1u
再比如:
我們定義最低優(yōu)先級(值)為63
則#defineOS_LOWEST_PRIO63u
定義最大數(shù)10個任務(wù)
則#define OS_MAX_TASKS 10u
其實(shí)這里的配置在系統(tǒng)中很多通過預(yù)處理(配置了的才編譯,未配置不編譯)來實(shí)現(xiàn)的,也就是直接影響程序編譯的大小,所以叫系統(tǒng)裁剪。
我提供(移植完成)的實(shí)例里面有很多資源(如:信號量、消息郵箱、消息隊列等)都沒有實(shí)現(xiàn),所以那些都是失能的(即都配置為0)。
Ⅲ、主函數(shù)描述
主函數(shù)在裸機(jī)程序和操作系統(tǒng)程序中都是有的,也是程序的入口函數(shù),這里大體講述一下UCOS操作系統(tǒng)主函數(shù)中重要的三個函數(shù):
OSInit操作系統(tǒng)初始化
OSTaskCreateExt創(chuàng)建任務(wù)
OSStart啟動任務(wù)
1.OSInit系統(tǒng)初始化
跟蹤代碼可以知道,這個函數(shù)的函數(shù)體位于os_core.c文件中。操作系統(tǒng)初始化顧名思義就是對UCOS系統(tǒng)的初始化,其中包含內(nèi)核與系統(tǒng)資源這些的初始化,如下面代碼截圖:
從上面截圖就可以看得出來,紅色框標(biāo)記的是系統(tǒng)內(nèi)核必須初始化部分,藍(lán)色框標(biāo)記是選配(由系統(tǒng)配置決定)。
我們上面說的“系統(tǒng)配置”,在這里就能體現(xiàn)的出來。比如:我藍(lán)色框標(biāo)記的部分中,沒有使能“事件標(biāo)志”也就是在配置中沒有使能使能該選項(xiàng),那么程序也不會初始化事件標(biāo)志組。接著的其他選項(xiàng)一樣的道理。
2.OSTaskCreateExt創(chuàng)建任務(wù)
跟蹤代碼可以知道,這個函數(shù)的函數(shù)體位于os_task.c文件中。該函數(shù)從命名及意思上可以知道,它就是創(chuàng)建任務(wù)的函數(shù)。我們使用“擴(kuò)展版本”創(chuàng)建任務(wù),主要是配置及初始化任務(wù)相關(guān)的堆棧、優(yōu)先級、以及檢測參數(shù)的正確性等,如下面代碼截圖:
注意:在os_cfg中需要使能“創(chuàng)建任務(wù)-擴(kuò)展”,也就是需要配置:
#define OS_TASK_CREATE_EXT_EN 1u
創(chuàng)建任務(wù)有兩個函數(shù)(請看os_task.c文件):
OSTaskCreate基本版本
OSTaskCreateExt擴(kuò)展版本
擴(kuò)展版本是在后面升級系統(tǒng)新增加的一個函數(shù),主要是新增加了5個參數(shù)(具體請見源代碼),但為了使程序兼容以前系統(tǒng),這后面的系統(tǒng)中也是保留了基本版本的創(chuàng)建任務(wù)函數(shù)接口。
我在主函數(shù)里面創(chuàng)建的任務(wù)是AppTaskStart,也是“開始任務(wù)”,后面的一些關(guān)于應(yīng)用所需的初始化都是在AppTaskStart下面創(chuàng)建的,子任務(wù)也是基于該函數(shù)創(chuàng)建的。
3.OSStart開啟任務(wù)
跟蹤代碼可以知道,這個函數(shù)的函數(shù)體位于os_core.c文件中。在操作系統(tǒng)初始化、任務(wù)創(chuàng)建完成之后,調(diào)用OSStart就可以開啟并執(zhí)行任務(wù)了。
該函數(shù)也是屬于內(nèi)核級的,由系統(tǒng)調(diào)用,主要包含幾步操作:
1.查找最高優(yōu)先級任務(wù),使其進(jìn)入就緒;
2.將當(dāng)前優(yōu)先級指向就緒任務(wù)的最高優(yōu)先級;
3.執(zhí)行目標(biāo)代碼,開始任務(wù)(OSRunning = OS_TRUE)。
當(dāng)你初始接觸UCOS系統(tǒng)時,先了解它主要的意思是啟動任務(wù)就行了,至于怎樣啟動的,需后續(xù)研究系統(tǒng)內(nèi)核這一塊,我在后面也會講述。
Ⅳ、AppTaskStart任務(wù)描述
應(yīng)用程序(任務(wù))的執(zhí)行可以說就是從AppTaskStart這個函數(shù)(在上面main中創(chuàng)建的任務(wù))開始一步一步執(zhí)行的。
在AppTaskStart函數(shù)體里面主要做了三類事情:
1.BSP_Initializes:初始化應(yīng)用底層一些代碼,基本實(shí)例就是LED的IO驅(qū)動;
2.OSTick_Init:滴答時鐘初始化,這個是屬于系統(tǒng),在前面移植的過程中說過由我們自己定義,所以這里需要初始化。
3.OSTaskCreateExt:創(chuàng)建子任務(wù)(Demo程序創(chuàng)建了3個子任務(wù))。
為什么在這里還要創(chuàng)建任務(wù)呢?
這種寫法是參考UCOS官方提供實(shí)例代碼的寫法(在main主函數(shù)只創(chuàng)建一個AppTaskStart任務(wù),再在AppTaskStart函數(shù)創(chuàng)建子任務(wù)、系統(tǒng)資源等)。
當(dāng)然,這個格式寫法不是死的,可根據(jù)自己習(xí)慣或要求來寫。
1.BSP_Initializes
跟蹤代碼可以知道,這個函數(shù)的函數(shù)體位于bsp.c文件中。這個函數(shù)是我們自己建的文件,我將它歸類為“應(yīng)用程序底層代碼初始化”,自己可更加實(shí)際情況修改。由于是Demo程序(LED閃爍燈),這里主要是對LED燈IO口的初始化。
2.OSTick_Init
跟蹤代碼可以知道,這個函數(shù)的函數(shù)體位于app_cfg.c文件中。這個函數(shù)也是我們自己設(shè)計的源代碼,在前面移植的過程中要求自己初始化系統(tǒng)滴答,這里就需要初始化。當(dāng)然也可以在UCOS提供的文件“os_cpu_c.c”里面初始化該函數(shù)。
系統(tǒng)滴答是系統(tǒng)的心臟,沒有它就等于沒有心臟。這里需要搭配滴答中斷函數(shù)(如下圖)。
3.OSTaskCreateExt子任務(wù)
提供的Demo程序創(chuàng)建了一個開始任務(wù)和3個子任務(wù),任務(wù)都是實(shí)現(xiàn)LED閃爍的內(nèi)容。更加閃爍的頻率(亮滅間隔時間)不同,可以區(qū)分出不同的任務(wù)。
開始任務(wù)、子任務(wù)1、子任務(wù)2、子任務(wù)3依次LED亮滅間隔時間加長。是由OSTimeDly函數(shù)決定的,OSTimeDly函數(shù)是系統(tǒng)延時的意思,它這個延時和我們平常使用的延時相似,但又不同。它在各自的任務(wù)了看似屬于自身“阻塞延時”了那么長時間,但自系統(tǒng)看來其實(shí)是將該任務(wù)掛起了那么長時間。
OSTimeDly延時函數(shù)屬于系統(tǒng)級延時,需要了解系統(tǒng)內(nèi)核之后對它的理解就容易了。
Ⅴ、實(shí)例工程下載
筆者針對于初學(xué)者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學(xué)者一看就明白,以簡單明了的工程供大家學(xué)習(xí)。
筆者提供的實(shí)例工程都是在板子上經(jīng)過多次測試并沒有問題才上傳至360云盤,歡迎下載測試、參照學(xué)習(xí)。
我將最新UCOS2.92操作系統(tǒng)移植到F0、F1、F3、F4各個硬件平臺上,可以根據(jù)你芯片系列選擇下載。
UCOS基于STM32F0系列實(shí)例:
https://yunpan.cn/cRCZrQ3dzeVQq訪問密碼 e73f
UCOS基于STM32F1系列實(shí)例:
https://yunpan.cn/cRCZxGFsqHa6Q訪問密碼 39ff
UCOS基于STM32F3系列實(shí)例:
https://yunpan.cn/cRCZqPRCWs8UW訪問密碼 b305
UCOS基于STM32F4系列實(shí)例:
https://yunpan.cn/cRCZPqbFqXSPR訪問密碼 f177
本文是基于上面修改部分注釋為中文:
https://yunpan.cn/cM6tNgShDuj5Y 訪問密碼 889e
-
代碼
+關(guān)注
關(guān)注
30文章
4888瀏覽量
70274 -
HOOK
+關(guān)注
關(guān)注
0文章
15瀏覽量
8550 -
ucos2
+關(guān)注
關(guān)注
0文章
15瀏覽量
3615
發(fā)布評論請先 登錄
瑞薩RA8快速上手指南:Cortex-M85內(nèi)核瑞薩RA8開發(fā)環(huán)境搭建 并點(diǎn)亮一個LED

升級centos7內(nèi)核版本
linux內(nèi)核中通用HID觸摸驅(qū)動

請問PCM1864的驅(qū)動在設(shè)備樹該如何描述?
linux驅(qū)動程序如何加載進(jìn)內(nèi)核
為了學(xué)習(xí)內(nèi)核開發(fā),大佬手搓了一個輕量級操作系統(tǒng)YiYiYa OS
為了學(xué)習(xí)內(nèi)核開發(fā),大佬手搓了一個輕量級操作系統(tǒng)YiYiYa OS
Linux內(nèi)核測試技術(shù)

請問MODUS支持LINUX、FREERTOS、UCOS、Mbed、Android所有操作系統(tǒng)嗎?
Cortex R52內(nèi)核Cache的具體操作(2)

Cortex R52內(nèi)核Cache的相關(guān)概念(1)

CortexR52內(nèi)核Cache的具體操作

評論