Ⅰ、寫在前面
學(xué)習(xí)本文之前可以參看我前面的文章:
UCOS2系統(tǒng)內(nèi)核講述(一)_總體描述
UCOS2系統(tǒng)內(nèi)核講述(二)_初始化調(diào)用函數(shù)
UCOS2系統(tǒng)內(nèi)核講述(三)_TCB任務(wù)控制塊
上一篇文章講述了關(guān)于TCB(Task Control Block)任務(wù)控制塊數(shù)據(jù)結(jié)構(gòu)體的內(nèi)容。本文學(xué)習(xí)與應(yīng)用、也與系統(tǒng)內(nèi)核緊密相關(guān)的一個函數(shù)“OSTaskCreateExt”創(chuàng)建任務(wù)。
OSTaskCreateExt這個函數(shù)是我們的應(yīng)用程序所調(diào)用的函數(shù),在我們所移植的軟件工程中,main函數(shù)就調(diào)用了OSTaskCreateExt函數(shù),顯而易見,理解它的功能及其參數(shù)是多么重要。
本文還是結(jié)合前面移植好、可以運(yùn)行的源代碼(可直接下載運(yùn)行的程序)來進(jìn)行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)核部分代碼(圍繞源代碼來講述)。
關(guān)于本文的更多詳情請往下看。
Ⅱ、OSTaskCreateExt參數(shù)詳情
創(chuàng)建任務(wù)的函數(shù)有兩個:
OSTaskCreate:以前老版本UCOS系統(tǒng)創(chuàng)建任務(wù)的函數(shù),有4個參數(shù)。
OSTaskCreateExt:新版本UCOS系統(tǒng),在“OSTaskCreate”的基礎(chǔ)上增加了一些功能參數(shù),有9個參數(shù)。其中4個參數(shù)是和老版本一樣(為了兼容老版本)。在新版本的UCOS系統(tǒng)上,我們一般都使用這個函數(shù)創(chuàng)建任務(wù),因此,下面我們講述“OSTaskCreateExt”函數(shù)中每一個參數(shù)的意思。
下面截圖是截取os_task.c文件,在OSTaskCreateExt函數(shù)上面有關(guān)于每一個參數(shù)的注釋(我在源代碼中已經(jīng)把主要意思修改為中文了,結(jié)合main函數(shù)傳遞的參數(shù)理解):
1.第一個參數(shù)task
task從命名上可以理解到,他的意思就是“任務(wù)”。
【代碼的命名很重要,不管是函數(shù)名還是變量名。好程序的命名一般都是比較規(guī)范的,理解起來自然也就不費(fèi)勁。】
這個參數(shù)是一個指向(參數(shù)為“void *p_arg”,返回值為“void”的函數(shù))的指針。簡單一點就是指向函數(shù)的指針。因此。傳遞的參數(shù)是一個函數(shù)。
在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“AppTaskStart”,就是我們應(yīng)用程序的名字。
2.第二個參數(shù)p_arg
p_arg傳遞參數(shù)的指針,是一個任意類型的參數(shù)。
當(dāng)我們需要傳遞某些參數(shù)給函數(shù)時,就可以通過該參數(shù)進(jìn)行傳遞。
在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“(void*) 0”,也就是傳遞一個“空指針”給函數(shù)(因為我們沒有參數(shù),就傳遞一個空指針)。
3.第三個參數(shù)ptos
ptos:指向任務(wù)堆棧棧頂?shù)闹羔槨?/p>
這個參數(shù)和“第六個參數(shù)pbos”對應(yīng),需要根據(jù)棧的增長方向“OS_STK_GROWTH”來決定。具體見os_cpu.h文件中OS_STK_GROWTH的宏定義,如下圖:
由于我們定義OS_STK_GROWTH為1,增長方向是從高地址往低地址增長,因此,在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“TaskStartStk[TASK_START_STK_SIZE - 1]”,也就是棧的高地址為棧頂。
4.第四個參數(shù)prio
prio:任務(wù)的優(yōu)先級。
這個參數(shù)很好理解,前面也講述過,優(yōu)先級具有唯一性,優(yōu)先級決定該任務(wù)指向的優(yōu)先權(quán)利(優(yōu)先級數(shù)值越低,優(yōu)先級越高)。
我們創(chuàng)建的四個任務(wù)中傳遞的參數(shù)分別宏定義如下圖:
主任務(wù)優(yōu)先級最高(最先執(zhí)行),其他三個次任務(wù)優(yōu)先級依次降低。
5.第五個參數(shù)id
id:任務(wù)的ID。
這個參數(shù)比較簡單,也就是給每一個創(chuàng)建的任務(wù)分配一個ID編號。相當(dāng)于一篇文章每一章節(jié)都有編號的意思。
我們在創(chuàng)建的任務(wù)中以“優(yōu)先級”作為編號,所以在參數(shù)中,我們看到連續(xù)兩個參數(shù)都是“優(yōu)先級”。
6.第六個參數(shù)pbos
pbos:指向任務(wù)堆棧棧底的指針。
這個參數(shù)結(jié)合“第三個參數(shù)ptos”理解,類似的原理,和棧的增長方向“OS_STK_GROWTH”有關(guān)。
根據(jù)棧的增長方向“OS_STK_GROWTH”為從高地址往低地址增長,所以,在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是TaskStartStk[0].
7.第七個參數(shù)stk_size
stk_size:任務(wù)堆棧大小。
這個參數(shù)與app_cfg.c文件中定義的“堆棧變量”有關(guān),我們需要傳遞的大小就是堆棧數(shù)組的大小值。
8.第八個參數(shù)pext
pext: 指向用戶提供的內(nèi)存(指針)。
這個參數(shù)是用作 TCB 擴(kuò)展的參數(shù),初學(xué)者使用不到這個參數(shù),暫時可以不用去理解。
9.第九個參數(shù)opt
opt: 用戶操作選項參數(shù)。
這個參數(shù)用戶創(chuàng)建任務(wù)時需要處理一些額外信息(操作)的參數(shù)。【這個參數(shù)比較重要,會處理一些信息,在下一章節(jié)重點講述一下關(guān)于該參數(shù)調(diào)用的“OS_TaskStkClr”】
Opt參數(shù)在創(chuàng)建任務(wù)是主要的三個,在OSTaskCreateExt函數(shù)體上面的注釋中已經(jīng)提出來了,如下圖:
OS_TASK_OPT_STK_CHK:檢測參數(shù)是否可用
OS_TASK_OPT_STK_CLR:清除堆棧(清除創(chuàng)建任務(wù)時使用的堆棧)
OS_TASK_OPT_SAVE_FP:保存浮點指針(在進(jìn)行上下文切換時)
參數(shù)是宏定義在ucos_ii.h中,如下圖:
也就是調(diào)用了某一個宏定義,那個宏定義的功能就使能了。
在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR”,進(jìn)行參數(shù)檢查和堆棧清除。
Ⅲ、創(chuàng)建任務(wù)時的堆棧
創(chuàng)建任務(wù)的函數(shù)體中有幾個函數(shù)是比較重要的,本姐講述下圖中紅色標(biāo)記函數(shù)(藍(lán)色部分是重點,在下一篇文章重點講述):
1.OS_TaskStkClr
OS_TaskStkClr:創(chuàng)建任務(wù)時清除堆棧。
這個函數(shù)需要在os_cfg.h使能OS_TASK_STAT_STK_CHK_EN這個參數(shù)。
在上面截圖中可以看到opt參數(shù)選項需要使能:OS_TASK_OPT_STK_CHK和OS_TASK_OPT_STK_CLR,也就是參數(shù)檢查和堆棧清除。
清除棧的順序與棧的增長方向有關(guān)。看到源代碼就知道清除堆棧,其實就是在初始時清空一下堆棧空間。
2.OSTaskStkInit
OSTaskStkInit:初始化創(chuàng)建任務(wù)的堆棧。
這個函數(shù)位于os_cpu_c.c文件中,前面移植UCOS時提到了一下該函數(shù)。
從源代碼中可以看得出來,其實這個函數(shù)主要的一個參數(shù)就是“ptos”棧頂,我們需要分配并保存堆棧。
Ⅳ、實例工程下載
筆者針對于初學(xué)者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學(xué)者一看就明白,以簡單明了的工程供大家學(xué)習(xí)。
筆者提供的實例工程都是在板子上經(jīng)過多次測試并沒有問題才上傳至360云盤,歡迎下載測試、參照學(xué)習(xí)。
我將最新UCOS2.92操作系統(tǒng)移植到F0、F1、F3、F4各個硬件平臺上,可以根據(jù)你芯片系列選擇下載。
UCOS基于STM32F0、F1、F3、F4系列實例工程源代碼(匯總):
https://yunpan.cn/cM9Fjv88cXbjI訪問密碼 048d
本文講述的部分注釋修改為中文(軟件工程源代碼):
https://yunpan.cn/cMIv8haYBL73y訪問密碼 e07e
基于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文章
51瀏覽量
9187 -
ucos2
+關(guān)注
關(guān)注
0文章
15瀏覽量
3621 -
操作系統(tǒng)內(nèi)核
+關(guān)注
關(guān)注
0文章
8瀏覽量
2423
發(fā)布評論請先 登錄
快速入門——LuatOS:sys庫多任務(wù)管理實戰(zhàn)攻略!

瑞薩RA8快速上手指南:Cortex-M85內(nèi)核瑞薩RA8開發(fā)環(huán)境搭建 并點亮一個LED

【第四章 定時任務(wù)】手把手教你玩轉(zhuǎn)新版正點原子云
eIQ Time Series Studio工具使用攻略(三)-工程創(chuàng)建

【「具身智能機(jī)器人系統(tǒng)」閱讀體驗】2.具身智能機(jī)器人的基礎(chǔ)模塊
Linux計劃任務(wù)介紹
請問MODUS支持LINUX、FREERTOS、UCOS、Mbed、Android所有操作系統(tǒng)嗎?
xTaskCreate能否把堆棧上限調(diào)整為2K或者1k?
Cortex R52內(nèi)核Cache的具體操作(2)

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

評論