UCOS2系統內核講述(四)_創建任務


Ⅰ、寫在前面

學習本文之前可以參看我前面的文章:

UCOS2_STM32移植詳細過程(匯總文章)

UCOS2系統內核講述_總體描述

UCOS2系統內核講述(二)_初始化調用函數

UCOS2系統內核講述(三)_TCB任務控制塊

 

上一篇文章講述了關於TCBTask Control Block)任務控制塊數據結構體的內容。本文學習與應用、也與系統內核緊密相關的一個函數OSTaskCreateExt”創建任務

 

OSTaskCreateExt這個函數是我們的應用程序所調用的函數,在我們所移植的軟件工程中,main函數就調用了OSTaskCreateExt函數,顯而易見,理解它的功能及其參數是多么重要。

 

本文還是結合前面移植好、可以運行的源代碼(可直接下載運行的程序)來進行講述關於最新版本UCOS2系統內核部分代碼(圍繞源代碼來講述)。

 

關於本文的更多詳情請往下看。

 

Ⅱ、OSTaskCreateExt參數詳情

創建任務的函數有兩個

OSTaskCreate:以前老版本UCOS系統創建任務的函數,有4個參數

 

OSTaskCreateExt:新版本UCOS系統,在“OSTaskCreate”的基礎上增加了一些功能參數,有9個參數。其中4個參數是和老版本一樣(為了兼容老版本)。在新版本的UCOS系統上,我們一般都使用這個函數創建任務,因此,下面我們講述“OSTaskCreateExt”函數中每一個參數的意思。

 

下面截圖是截取os_task.c文件,在OSTaskCreateExt函數上面有關於每一個參數的注釋(我在源代碼中已經把主要意思修改為中文了,結合main函數傳遞的參數理解):

 

1.第一個參數task

task從命名上可以理解到,他的意思就是“任務”。

【代碼的命名很重要,不管是函數名還是變量名。好程序的命名一般都是比較規范的,理解起來自然也就不費勁。】

 

這個參數是一個指向(參數為“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:任務的優先級。

這個參數很好理解,前面也講述過,優先級具有唯一性,優先級決定該任務指向的優先權利(優先級數值越低,優先級越高)。

 

我們創建的四個任務中傳遞的參數分別宏定義如下圖:

主任務優先級最高(最先執行),其他三個次任務優先級依次降低。

 

5.第五個參數id

id:任務的ID。

這個參數比較簡單,也就是給每一個創建的任務分配一個ID編號。相當於一篇文章每一章節都有編號的意思。

我們在創建的任務中以“優先級”作為編號,所以在參數中,我們看到連續兩個參數都是“優先級”。

 

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 用戶操作選項參數。

這個參數用戶創建任務時需要處理一些額外信息(操作)的參數。【這個參數比較重要,會處理一些信息,在下一章節重點講述一下關於該參數調用的“OS_TaskStkClr”】

 

Opt參數在創建任務是主要的三個,在OSTaskCreateExt函數體上面的注釋中已經提出來了,如下圖:

OS_TASK_OPT_STK_CHK:檢測參數是否可用

OS_TASK_OPT_STK_CLR:清除堆棧(清除創建任務時使用的堆棧)

OS_TASK_OPT_SAVE_FP:保存浮點指針(在進行上下文切換時)

 

參數是宏定義在ucos_ii.h中,如下圖:

也就是調用了某一個宏定義,那個宏定義的功能就使能了。

在main.c調用OSTaskCreateExt中我們傳遞的參數是“OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR”,進行參數檢查堆棧清除

 

Ⅲ、創建任務時的堆棧

創建任務的函數體中有幾個函數是比較重要的,本姐講述下圖中紅色標記函數(藍色部分是重點,在下一篇文章重點講述):

 

1.OS_TaskStkClr

OS_TaskStkClr:創建任務時清除堆棧。

這個函數需要在os_cfg.h使能OS_TASK_STAT_STK_CHK_EN這個參數。

在上面截圖中可以看到opt參數選項需要使能:OS_TASK_OPT_STK_CHKOS_TASK_OPT_STK_CLR,也就是參數檢查堆棧清除

 

清除棧的順序與棧的增長方向有關。看到源代碼就知道清除堆棧,其實就是在初始時清空一下堆棧空間。

 

2.OSTaskStkInit

OSTaskStkInit:初始化創建任務的堆棧。

這個函數位於os_cpu_c.c文件中,前面移植UCOS時提到了一下該函數。

 

從源代碼中可以看得出來,其實這個函數主要的一個參數就是“ptos”棧頂,我們需要分配並保存堆棧。

 

Ⅳ、實例工程下載

筆者針對於初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明了的工程供大家學習。

筆者提供的實例工程都是在板子上經過多次測試並沒有問題才上傳至360雲盤,歡迎下載測試、參照學習。

我將最新UCOS2.92操作系統移植到F0、F1、F3、F4各個硬件平台上,可以根據你芯片系列選擇下載。

UCOS基於STM32F0F1、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

 

、說明

UCOS相關的文章我會第一時間在微信公眾號里面和大家分享,也可以到我博客blog.csdn.net/ybhuangfugui)上查看。

當你掌握UCOS在一種平台上的移植,其他平台移植原理類似,請不要局限某一平台。

以上總結僅供參考,若有不對之處,敬請諒解。

 

Ⅵ、最后

更多精彩文章我將第一時間在微信公眾號里面分享,如果不想錯過,可以關注我的微信公眾號。

本着免費分享的原則,方便大家手機學習知識,定期在微信平台分享技術知識。如果你覺得分享的內容對你有用,又想了解更多相關的文章,請用微信搜索“EmbeddDeveloper” 或者掃描下面二維碼、關注,將有更多精彩內容等着你。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM