Ⅰ、寫在前面
學習本文之前可以參看我前面的文章:
UCOS2系統(tǒng)內核講述(一)_總體描述
UCOS2系統(tǒng)內核講述(二)_初始化調用函數
UCOS2系統(tǒng)內核講述(三)_TCB任務控制塊
上一篇文章講述了關于TCB(Task Control Block)任務控制塊數據結構體的內容。本文學習與應用、也與系統(tǒng)內核緊密相關的一個函數“OSTaskCreateExt”創(chuàng)建任務。
OSTaskCreateExt這個函數是我們的應用程序所調用的函數,在我們所移植的軟件工程中,main函數就調用了OSTaskCreateExt函數,顯而易見,理解它的功能及其參數是多么重要。
本文還是結合前面移植好、可以運行的源代碼(可直接下載運行的程序)來進行講述關于最新版本UCOS2系統(tǒng)內核部分代碼(圍繞源代碼來講述)。
關于本文的更多詳情請往下看。
Ⅱ、OSTaskCreateExt參數詳情
創(chuàng)建任務的函數有兩個:
OSTaskCreate:以前老版本UCOS系統(tǒng)創(chuàng)建任務的函數,有4個參數。
OSTaskCreateExt:新版本UCOS系統(tǒng),在“OSTaskCreate”的基礎上增加了一些功能參數,有9個參數。其中4個參數是和老版本一樣(為了兼容老版本)。在新版本的UCOS系統(tǒng)上,我們一般都使用這個函數創(chuàng)建任務,因此,下面我們講述“OSTaskCreateExt”函數中每一個參數的意思。
下面截圖是截取os_task.c文件,在OSTaskCreateExt函數上面有關于每一個參數的注釋(我在源代碼中已經把主要意思修改為中文了,結合main函數傳遞的參數理解):

1.第一個參數task
task從命名上可以理解到,他的意思就是“任務”。
【代碼的命名很重要,不管是函數名還是變量名。好程序的命名一般都是比較規(guī)范的,理解起來自然也就不費勁?!?/p>
這個參數是一個指向(參數為“void *p_arg”,返回值為“void”的函數)的指針。簡單一點就是指向函數的指針。因此。傳遞的參數是一個函數。
在main.c調用OSTaskCreateExt中我們傳遞的參數是“AppTaskStart”,就是我們應用程序的名字。
2.第二個參數p_arg
p_arg傳遞參數的指針,是一個任意類型的參數。
當我們需要傳遞某些參數給函數時,就可以通過該參數進行傳遞。
在main.c調用OSTaskCreateExt中我們傳遞的參數是“(void*) 0”,也就是傳遞一個“空指針”給函數(因為我們沒有參數,就傳遞一個空指針)。
3.第三個參數ptos
ptos:指向任務堆棧棧頂的指針。
這個參數和“第六個參數pbos”對應,需要根據棧的增長方向“OS_STK_GROWTH”來決定。具體見os_cpu.h文件中OS_STK_GROWTH的宏定義,如下圖:

由于我們定義OS_STK_GROWTH為1,增長方向是從高地址往低地址增長,因此,在main.c調用OSTaskCreateExt中我們傳遞的參數是“TaskStartStk[TASK_START_STK_SIZE - 1]”,也就是棧的高地址為棧頂。
4.第四個參數prio
prio:任務的優(yōu)先級。
這個參數很好理解,前面也講述過,優(yōu)先級具有唯一性,優(yōu)先級決定該任務指向的優(yōu)先權利(優(yōu)先級數值越低,優(yōu)先級越高)。
我們創(chuàng)建的四個任務中傳遞的參數分別宏定義如下圖:

主任務優(yōu)先級最高(最先執(zhí)行),其他三個次任務優(yōu)先級依次降低。
5.第五個參數id
id:任務的ID。
這個參數比較簡單,也就是給每一個創(chuàng)建的任務分配一個ID編號。相當于一篇文章每一章節(jié)都有編號的意思。
我們在創(chuàng)建的任務中以“優(yōu)先級”作為編號,所以在參數中,我們看到連續(xù)兩個參數都是“優(yōu)先級”。
6.第六個參數pbos
pbos:指向任務堆棧棧底的指針。
這個參數結合“第三個參數ptos”理解,類似的原理,和棧的增長方向“OS_STK_GROWTH”有關。
根據棧的增長方向“OS_STK_GROWTH”為從高地址往低地址增長,所以,在main.c調用OSTaskCreateExt中我們傳遞的參數是TaskStartStk[0].
7.第七個參數stk_size
stk_size:任務堆棧大小。
這個參數與app_cfg.c文件中定義的“堆棧變量”有關,我們需要傳遞的大小就是堆棧數組的大小值。
8.第八個參數pext
pext: 指向用戶提供的內存(指針)。
這個參數是用作 TCB 擴展的參數,初學者使用不到這個參數,暫時可以不用去理解。
9.第九個參數opt
opt: 用戶操作選項參數。
這個參數用戶創(chuàng)建任務時需要處理一些額外信息(操作)的參數。【這個參數比較重要,會處理一些信息,在下一章節(jié)重點講述一下關于該參數調用的“OS_TaskStkClr”】
Opt參數在創(chuàng)建任務是主要的三個,在OSTaskCreateExt函數體上面的注釋中已經提出來了,如下圖:

OS_TASK_OPT_STK_CHK:檢測參數是否可用
OS_TASK_OPT_STK_CLR:清除堆棧(清除創(chuàng)建任務時使用的堆棧)
OS_TASK_OPT_SAVE_FP:保存浮點指針(在進行上下文切換時)
參數是宏定義在ucos_ii.h中,如下圖:

也就是調用了某一個宏定義,那個宏定義的功能就使能了。
在main.c調用OSTaskCreateExt中我們傳遞的參數是“OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR”,進行參數檢查和堆棧清除。
Ⅲ、創(chuàng)建任務時的堆棧
創(chuàng)建任務的函數體中有幾個函數是比較重要的,本姐講述下圖中紅色標記函數(藍色部分是重點,在下一篇文章重點講述):

1.OS_TaskStkClr
OS_TaskStkClr:創(chuàng)建任務時清除堆棧。
這個函數需要在os_cfg.h使能OS_TASK_STAT_STK_CHK_EN這個參數。

在上面截圖中可以看到opt參數選項需要使能:OS_TASK_OPT_STK_CHK和OS_TASK_OPT_STK_CLR,也就是參數檢查和堆棧清除。
清除棧的順序與棧的增長方向有關??吹皆创a就知道清除堆棧,其實就是在初始時清空一下堆??臻g。
2.OSTaskStkInit
OSTaskStkInit:初始化創(chuàng)建任務的堆棧。

這個函數位于os_cpu_c.c文件中,前面移植UCOS時提到了一下該函數。
從源代碼中可以看得出來,其實這個函數主要的一個參數就是“ptos”棧頂,我們需要分配并保存堆棧。
Ⅳ、實例工程下載
筆者針對于初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明了的工程供大家學習。
筆者提供的實例工程都是在板子上經過多次測試并沒有問題才上傳至360云盤,歡迎下載測試、參照學習。
我將最新UCOS2.92操作系統(tǒng)移植到F0、F1、F3、F4各個硬件平臺上,可以根據你芯片系列選擇下載。
UCOS基于STM32F0、F1、F3、F4系列實例工程源代碼(匯總):
https://yunpan.cn/cM9Fjv88cXbjI訪問密碼 048d
本文講述的部分注釋修改為中文(軟件工程源代碼):
https://yunpan.cn/cMIv8haYBL73y訪問密碼 e07e
基于STM32平臺的UCOS源代碼工程(官方原始軟件工程)
官網下載(需要賬號):
https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true
360云盤下載:
https://yunpan.cn/cM9Gzv4drXqxv訪問密碼 c82c
-
宏定義
+關注
關注
0文章
51瀏覽量
9446 -
ucos2
+關注
關注
0文章
15瀏覽量
3714 -
操作系統(tǒng)內核
+關注
關注
0文章
8瀏覽量
2492
發(fā)布評論請先 登錄
Linux內核伙伴系統(tǒng)內存申請函數詳解:從原理到實戰(zhàn)
Linux系統(tǒng)內核參數調優(yōu)實戰(zhàn)指南
【瑞薩FPB-RA6E2試用】環(huán)境配置及基礎任務代碼示例
【「Linux 設備驅動開發(fā)(第 2 版)」閱讀體驗】Linux內核開發(fā)基礎
【「Linux 設備驅動開發(fā)(第 2 版)」閱讀體驗】+讀內核處理的核心輔助函數
大模型驅動的發(fā)射任務智能調度分系統(tǒng)軟件平臺的應用與未來發(fā)展
什么是嵌入式操作系統(tǒng)?
Linux-RT特點及簡單應用
ucos與freertos哪個好?
FreeRTOS 空閑任務
單片機的操作系統(tǒng)
【HZ-T536開發(fā)板免費體驗】—— linux創(chuàng)建線程
Task任務:LuatOS實現“任務級并發(fā)”的核心引擎
揭秘LuatOS Task:多任務管理的“智能中樞”
UCOS2系統(tǒng)內核講述(四)_ 創(chuàng)建任務
評論