0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UCOS2系統(tǒng)內(nèi)核講述(四)_ 創(chuàng)建任務(wù)

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-25 10:12 ? 次閱讀

Ⅰ、寫在前面

學(xué)習(xí)本文之前可以參看我前面的文章:

UCOS2_STM32移植詳細(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)的一個(gè)函數(shù)“OSTaskCreateExt”創(chuàng)建任務(wù)。

OSTaskCreateExt這個(gè)函數(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)于本文的更多詳情請(qǐng)往下看。

Ⅱ、OSTaskCreateExt參數(shù)詳情

創(chuàng)建任務(wù)的函數(shù)有兩個(gè):

OSTaskCreate:以前老版本UCOS系統(tǒng)創(chuàng)建任務(wù)的函數(shù),有4個(gè)參數(shù)。

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

下面截圖是截取os_task.c文件,在OSTaskCreateExt函數(shù)上面有關(guān)于每一個(gè)參數(shù)的注釋(我在源代碼中已經(jīng)把主要意思修改為中文了,結(jié)合main函數(shù)傳遞的參數(shù)理解):


1.第一個(gè)參數(shù)task

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

【代碼的命名很重要,不管是函數(shù)名還是變量名。好程序的命名一般都是比較規(guī)范的,理解起來自然也就不費(fèi)勁?!?/p>

這個(gè)參數(shù)是一個(gè)指向(參數(shù)為“void *p_arg”,返回值為“void”的函數(shù))的指針。簡(jiǎn)單一點(diǎn)就是指向函數(shù)的指針。因此。傳遞的參數(shù)是一個(gè)函數(shù)。

在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“AppTaskStart”,就是我們應(yīng)用程序的名字。

2.第二個(gè)參數(shù)p_arg

p_arg傳遞參數(shù)的指針,是一個(gè)任意類型的參數(shù)。

當(dāng)我們需要傳遞某些參數(shù)給函數(shù)時(shí),就可以通過該參數(shù)進(jìn)行傳遞。

在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“(void*) 0”,也就是傳遞一個(gè)“空指針”給函數(shù)(因?yàn)槲覀儧]有參數(shù),就傳遞一個(gè)空指針)。

3.第三個(gè)參數(shù)ptos

ptos:指向任務(wù)堆棧棧頂?shù)闹羔槨?/p>

這個(gè)參數(shù)和“第六個(gè)參數(shù)pbos”對(duì)應(yīng),需要根據(jù)棧的增長(zhǎng)方向“OS_STK_GROWTH”來決定。具體見os_cpu.h文件中OS_STK_GROWTH的宏定義,如下圖:


由于我們定義OS_STK_GROWTH為1,增長(zhǎng)方向是從高地址往低地址增長(zhǎng),因此,在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“TaskStartStk[TASK_START_STK_SIZE - 1]”,也就是棧的高地址為棧頂。

4.第四個(gè)參數(shù)prio

prio:任務(wù)的優(yōu)先級(jí)。

這個(gè)參數(shù)很好理解,前面也講述過,優(yōu)先級(jí)具有唯一性,優(yōu)先級(jí)決定該任務(wù)指向的優(yōu)先權(quán)利(優(yōu)先級(jí)數(shù)值越低,優(yōu)先級(jí)越高)。

我們創(chuàng)建的四個(gè)任務(wù)中傳遞的參數(shù)分別宏定義如下圖:


主任務(wù)優(yōu)先級(jí)最高(最先執(zhí)行),其他三個(gè)次任務(wù)優(yōu)先級(jí)依次降低。

5.第五個(gè)參數(shù)id

id:任務(wù)的ID。

這個(gè)參數(shù)比較簡(jiǎn)單,也就是給每一個(gè)創(chuàng)建的任務(wù)分配一個(gè)ID編號(hào)。相當(dāng)于一篇文章每一章節(jié)都有編號(hào)的意思。

我們?cè)趧?chuàng)建的任務(wù)中以“優(yōu)先級(jí)”作為編號(hào),所以在參數(shù)中,我們看到連續(xù)兩個(gè)參數(shù)都是“優(yōu)先級(jí)”。

6.第六個(gè)參數(shù)pbos

pbos:指向任務(wù)堆棧棧底的指針。

這個(gè)參數(shù)結(jié)合“第三個(gè)參數(shù)ptos”理解,類似的原理,和棧的增長(zhǎng)方向“OS_STK_GROWTH”有關(guān)。

根據(jù)棧的增長(zhǎng)方向“OS_STK_GROWTH”為從高地址往低地址增長(zhǎng),所以,在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是TaskStartStk[0].

7.第七個(gè)參數(shù)stk_size

stk_size:任務(wù)堆棧大小。

這個(gè)參數(shù)與app_cfg.c文件中定義的“堆棧變量”有關(guān),我們需要傳遞的大小就是堆棧數(shù)組的大小值。

8.第八個(gè)參數(shù)pext

pext: 指向用戶提供的內(nèi)存(指針)。

這個(gè)參數(shù)是用作 TCB 擴(kuò)展的參數(shù),初學(xué)者使用不到這個(gè)參數(shù),暫時(shí)可以不用去理解。

9.第九個(gè)參數(shù)opt

opt: 用戶操作選項(xiàng)參數(shù)。

這個(gè)參數(shù)用戶創(chuàng)建任務(wù)時(shí)需要處理一些額外信息(操作)的參數(shù)?!具@個(gè)參數(shù)比較重要,會(huì)處理一些信息,在下一章節(jié)重點(diǎn)講述一下關(guān)于該參數(shù)調(diào)用的“OS_TaskStkClr”】

Opt參數(shù)在創(chuàng)建任務(wù)是主要的三個(gè),在OSTaskCreateExt函數(shù)體上面的注釋中已經(jīng)提出來了,如下圖:

OS_TASK_OPT_STK_CHK:檢測(cè)參數(shù)是否可用

OS_TASK_OPT_STK_CLR:清除堆棧(清除創(chuàng)建任務(wù)時(shí)使用的堆棧)

OS_TASK_OPT_SAVE_FP:保存浮點(diǎn)指針(在進(jìn)行上下文切換時(shí))

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


也就是調(diào)用了某一個(gè)宏定義,那個(gè)宏定義的功能就使能了。

在main.c調(diào)用OSTaskCreateExt中我們傳遞的參數(shù)是“OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR”,進(jìn)行參數(shù)檢查和堆棧清除。

Ⅲ、創(chuàng)建任務(wù)時(shí)的堆棧

創(chuàng)建任務(wù)的函數(shù)體中有幾個(gè)函數(shù)是比較重要的,本姐講述下圖中紅色標(biāo)記函數(shù)(藍(lán)色部分是重點(diǎn),在下一篇文章重點(diǎn)講述):


1.OS_TaskStkClr

OS_TaskStkClr:創(chuàng)建任務(wù)時(shí)清除堆棧。

這個(gè)函數(shù)需要在os_cfg.h使能OS_TASK_STAT_STK_CHK_EN這個(gè)參數(shù)。


在上面截圖中可以看到opt參數(shù)選項(xiàng)需要使能:OS_TASK_OPT_STK_CHK和OS_TASK_OPT_STK_CLR,也就是參數(shù)檢查和堆棧清除。

清除棧的順序與棧的增長(zhǎng)方向有關(guān)??吹皆创a就知道清除堆棧,其實(shí)就是在初始時(shí)清空一下堆??臻g。

2.OSTaskStkInit

OSTaskStkInit:初始化創(chuàng)建任務(wù)的堆棧。


這個(gè)函數(shù)位于os_cpu_c.c文件中,前面移植UCOS時(shí)提到了一下該函數(shù)。

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

Ⅳ、實(shí)例工程下載

筆者針對(duì)于初學(xué)者提供的例程都是去掉了許多不必要的功能,精簡(jiǎn)了官方的代碼,對(duì)初學(xué)者一看就明白,以簡(jiǎn)單明了的工程供大家學(xué)習(xí)。

筆者提供的實(shí)例工程都是在板子上經(jīng)過多次測(cè)試并沒有問題才上傳至360云盤,歡迎下載測(cè)試、參照學(xué)習(xí)。

我將最新UCOS2.92操作系統(tǒng)移植到F0、F1、F3、F4各個(gè)硬件平臺(tái)上,可以根據(jù)你芯片系列選擇下載。

UCOS基于STM32F0、F1、F3、F4系列實(shí)例工程源代碼(匯總):

https://yunpan.cn/cM9Fjv88cXbjI訪問密碼 048d

本文講述的部分注釋修改為中文(軟件工程源代碼):

https://yunpan.cn/cMIv8haYBL73y訪問密碼 e07e

基于STM32平臺(tái)的UCOS源代碼工程(官方原始軟件工程)

官網(wǎng)下載(需要賬號(hào)):

https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true

360云盤下載:

https://yunpan.cn/cM9Gzv4drXqxv訪問密碼 c82c

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    8981
  • ucos2
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    3549
  • 操作系統(tǒng)內(nèi)核

    關(guān)注

    0

    文章

    8

    瀏覽量

    2360
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用freeRTOS在兩個(gè)任務(wù)之間傳輸任務(wù)數(shù)據(jù)?

    大家好, 我是 PSoC6 的新手,并嘗試以運(yùn)行第二個(gè)任務(wù)的方式調(diào)整“ PSoC? 6 MCU:emFile 文件系統(tǒng)”,該任務(wù)作為 I2C 主控運(yùn)行。 i
    發(fā)表于 07-03 07:55

    esp32S2創(chuàng)建任務(wù)時(shí),若任務(wù)堆棧大小配置超過 4096*6 ,該任務(wù)會(huì)創(chuàng)建失敗,如何解決?

    esp32S2創(chuàng)建任務(wù)時(shí),若任務(wù)堆棧大小配置超過 4096*6 ,該任務(wù)會(huì)創(chuàng)建失敗, xTask
    發(fā)表于 06-20 08:26

    STM32F303 ucos ii任務(wù)調(diào)度都用什么?

    現(xiàn)在303上用ucos ii跑了兩個(gè)任務(wù),一個(gè)是顯示LCD,一個(gè)是讀取FRAM?,F(xiàn)在發(fā)現(xiàn),若讀FRAM的優(yōu)先級(jí)高,有時(shí)LCD會(huì)花屏一閃,若顯示優(yōu)先級(jí)高,有時(shí)FRAM讀出的數(shù)會(huì)不對(duì)。 目前是做個(gè)信號(hào)量做互鎖,但這樣跟不用系統(tǒng)時(shí)差不
    發(fā)表于 05-14 06:16

    uCOS使用FATFS的時(shí)候如果操作SD卡的優(yōu)先級(jí)低了,uCOS就死機(jī)怎么解決?

    不知道大家遇到過這個(gè)情況沒有,uCOS使用FATFS的時(shí)候如果操作SD卡的優(yōu)先級(jí)低了,uCOS相應(yīng)的任務(wù)會(huì)死機(jī),我的FATFS的可重入也已經(jīng)打開了
    發(fā)表于 05-14 06:13

    請(qǐng)問一下FREERTOS只能創(chuàng)建4個(gè)任務(wù),修改哪個(gè)宏定義可以增加創(chuàng)建任務(wù)的數(shù)量?

    請(qǐng)問一下FREERTOS只能創(chuàng)建4個(gè)任務(wù),修改哪個(gè)宏定義可以增加創(chuàng)建任務(wù)的數(shù)量?解決方法:增加FREERTOS的堆。
    發(fā)表于 05-13 06:44

    emwin發(fā)布信號(hào)量給ucos的其他任務(wù)失敗的原因?

    , OS_OPT_PEND_BLOCKING,p_ts, err); //Test(); GPIOG->ODR^=GPIO_Pin_13; OSTimeDlyHMSM(0, 0, 2, 0
    發(fā)表于 05-11 07:20

    基于STM32Cubemx創(chuàng)建FreeRTOS,創(chuàng)建UART任務(wù)遇到的兩個(gè)問題求解

    基于STM32Cubemx創(chuàng)建FreeRTOS,創(chuàng)建UART任務(wù),經(jīng)過測(cè)試發(fā)現(xiàn)有以下兩個(gè)問題: 1、串口波特率問題: 在STM32Cubemx中串口設(shè)置如下: /* USART3 init
    發(fā)表于 05-10 07:33

    用STM32CubeMX中的FreeRTOS創(chuàng)建3任務(wù)無法運(yùn)行的原因?

    用STM32CubeMX中的FreeRTOS 創(chuàng)建3任務(wù) Task Priority =osPrioirityNoral 等級(jí)的任務(wù),無法運(yùn)行。 如果創(chuàng)建
    發(fā)表于 05-09 07:02

    freertos任務(wù)創(chuàng)建,每一個(gè)任務(wù)分配的內(nèi)存是多大才好,怎么計(jì)算呢?

    小白剛剛接觸freertos,想問一下就創(chuàng)建任務(wù)而言,每一個(gè)任務(wù)分配的內(nèi)存是多大才好,怎么計(jì)算呢? 另外,每個(gè)任務(wù)的執(zhí)行周期怎么確定?在任務(wù)
    發(fā)表于 04-23 06:39

    請(qǐng)問FreeRTOS同一個(gè)任務(wù)多次創(chuàng)建會(huì)有什么后果?

    比如在初始創(chuàng)建任務(wù)時(shí)就創(chuàng)建任務(wù)1、2、3、4、5 然后在任務(wù)
    發(fā)表于 04-15 06:36

    RZ/G2L Linux系統(tǒng)如何添加新的內(nèi)核模塊

    RZ/G2L Linux系統(tǒng)的鏡像基于yocto構(gòu)建,本篇介紹如何添加新的內(nèi)核模塊。
    的頭像 發(fā)表于 01-04 12:19 ?1611次閱讀
    RZ/G<b class='flag-5'>2</b>L Linux<b class='flag-5'>系統(tǒng)</b>如何添加新的<b class='flag-5'>內(nèi)核</b>模塊

    RTOS內(nèi)功修煉記(一)— 任務(wù)到底應(yīng)該怎么寫?

    本篇文章講述任務(wù)的三大元素:任務(wù)控制塊、任務(wù)棧、任務(wù)入口函數(shù),并講述了編寫RTOS
    的頭像 發(fā)表于 12-01 16:36 ?663次閱讀
    RTOS內(nèi)功修煉記(一)— <b class='flag-5'>任務(wù)</b>到底應(yīng)該怎么寫?

    野火stm32+UCOS+LED1(單任務(wù))

    電子發(fā)燒友網(wǎng)站提供《野火stm32+UCOS+LED1(單任務(wù)).rar》資料免費(fèi)下載
    發(fā)表于 11-03 11:34 ?7次下載
    野火stm32+<b class='flag-5'>UCOS</b>+LED1(單<b class='flag-5'>任務(wù)</b>)

    野火stm32+UCOS+LED1+LED2+LED3(多任務(wù)

    電子發(fā)燒友網(wǎng)站提供《野火stm32+UCOS+LED1+LED2+LED3(多任務(wù)).rar》資料免費(fèi)下載
    發(fā)表于 11-03 11:14 ?0次下載
    野火stm32+<b class='flag-5'>UCOS+LED1+LED2</b>+LED3(多<b class='flag-5'>任務(wù)</b>)

    uCOS與FreeRTOS的區(qū)別是什么?

    uCOS的中斷服務(wù)中,必須用OSIntEnter()和OSIntExit()括起來。如下: //USB喚醒中斷服務(wù)函數(shù) void USBWakeUp_IRQHandler(void
    發(fā)表于 10-31 06:42