色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

Ⅰ、寫在前面

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

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

UCOS2系統內核講述(一)_總體描述

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

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

上一篇文章講述了關于TCB(Task 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_CHK和OS_TASK_OPT_STK_CLR,也就是參數檢查和堆棧清除。

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

2.OSTaskStkInit

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


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

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

Ⅳ、實例工程下載

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

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

我將最新UCOS2.92操作系統移植到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

    文章

    50

    瀏覽量

    9009
  • ucos2
    +關注

    關注

    0

    文章

    15

    瀏覽量

    3557
  • 操作系統內核

    關注

    0

    文章

    8

    瀏覽量

    2369
收藏 人收藏

    評論

    相關推薦

    esp8266的freertos+lwip不支持在多個任務創建多個不同的socket嗎?

    我用的是V1.5.0版本的rtos的sdk。 我起了兩個任務,每個任務創建一個tcp socket 客戶端,每個socket都是設置成非阻塞的。 其中一個任務的socket,我用
    發表于 07-11 07:29

    如何使用freeRTOS在兩個任務之間傳輸任務數據?

    大家好, 我是 PSoC6 的新手,并嘗試以運行第二個任務的方式調整“ PSoC? 6 MCU:emFile 文件系統”,該任務作為 I2C 主控運行。 i
    發表于 07-03 07:55

    esp32-c3工程中怎么創建多個freertos任務?

    ESP-IDF中給出的ESP32-C3的例程都只有一個任務。即void app_main() 而且沒看見這個app_main任務是在哪里被創建的??? 如果我想建一個ESP32-C3的多任務
    發表于 06-27 06:37

    esp32S2創建任務時,若任務堆棧大小配置超過 4096*6 ,該任務創建失敗,如何解決?

    esp32S2創建任務時,若任務堆棧大小配置超過 4096*6 ,該任務創建失敗, xTask
    發表于 06-20 08:26

    STM32F303 ucos ii任務調度都用什么?

    現在303上用ucos ii跑了兩個任務,一個是顯示LCD,一個是讀取FRAM。現在發現,若讀FRAM的優先級高,有時LCD會花屏一閃,若顯示優先級高,有時FRAM讀出的數會不對。 目前是做個信號量做互鎖,但這樣跟不用系統時差不
    發表于 05-14 06:16

    uCOS使用FATFS的時候如果操作SD卡的優先級低了,uCOS就死機怎么解決?

    不知道大家遇到過這個情況沒有,uCOS使用FATFS的時候如果操作SD卡的優先級低了,uCOS相應的任務會死機,我的FATFS的可重入也已經打開了
    發表于 05-14 06:13

    請問一下FREERTOS只能創建4個任務,修改哪個宏定義可以增加創建任務的數量?

    請問一下FREERTOS只能創建4個任務,修改哪個宏定義可以增加創建任務的數量?解決方法:增加FREERTOS的堆。
    發表于 05-13 06:44

    emwin發布信號量給ucos的其他任務失敗的原因?

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

    基于STM32Cubemx創建FreeRTOS,創建UART任務遇到的兩個問題求解

    基于STM32Cubemx創建FreeRTOS,創建UART任務,經過測試發現有以下兩個問題: 1、串口波特率問題: 在STM32Cubemx中串口設置如下: /* USART3 init
    發表于 05-10 07:33

    用STM32CubeMX中的FreeRTOS創建3任務無法運行的原因?

    用STM32CubeMX中的FreeRTOS 創建3任務 Task Priority =osPrioirityNoral 等級的任務,無法運行。 如果創建
    發表于 05-09 07:02

    OpenHarmony語言基礎類庫【@ohos.taskpool(啟動任務池)】

    任務池(taskpool)作用是為應用程序提供一個多線程的運行環境,降低整體資源的消耗、提高系統的整體性能,且您無需關心線程實例的生命周期。您可以使用任務池API創建后臺
    的頭像 發表于 04-24 17:45 ?346次閱讀
    OpenHarmony語言基礎類庫【@ohos.taskpool(啟動<b class='flag-5'>任務</b>池)】

    freertos任務創建,每一個任務分配的內存是多大才好,怎么計算呢?

    小白剛剛接觸freertos,想問一下就創建任務而言,每一個任務分配的內存是多大才好,怎么計算呢? 另外,每個任務的執行周期怎么確定?在任務
    發表于 04-23 06:39

    請問stm32L4是不是M4內核

    為什么L4在ucos 庫里是屬于 M3內核,F4系列 在ucos庫里是屬于 M4內核
    發表于 04-17 07:07

    請問FreeRTOS同一個任務多次創建會有什么后果?

    比如在初始創建任務時就創建任務1、2、3、4、5 然后在任務
    發表于 04-15 06:36

    RZ/G2L Linux系統如何添加新的內核模塊

    RZ/G2L Linux系統的鏡像基于yocto構建,本篇介紹如何添加新的內核模塊。
    的頭像 發表于 01-04 12:19 ?1783次閱讀
    RZ/G<b class='flag-5'>2</b>L Linux<b class='flag-5'>系統</b>如何添加新的<b class='flag-5'>內核</b>模塊
    主站蜘蛛池模板: 玩弄放荡人妻一区二区三区| 久久秋霞理伦片| 国产99精品视频| 柏木舞子在线| music radio在线收听| 99精品免费久久久久久久久日本| 在线观看中文字幕码2021不用下载| 亚洲欧美精品一中文字幕| 亚洲久热无码中文字幕| 亚洲精品久久久992KVTV| 亚洲精品久久久午夜福利电影网| 亚州三级久久电影| 亚洲成人黄色片| 亚洲欧美精品无码大片在线观看| 亚洲区 bt下载| 亚洲在线无码免费观看| 又大又硬又爽免费视频| 中文字幕 日韩 无码 在线| 5G在线观看免费年龄确认18| 99国产精品综合AV无码| wwwwwwwww日本电影| 国产AV精品久久久免费看| 国产精品色吧国产精品| 黑人巨茎大战白人女40CMO| 九九精品视频一区二区三区| 老妇xxxxbbbb| 秋霞伦理机在线看片| 天天摸夜添狠狠添高| 亚洲免费视频日本一区二区| 诱人的女邻居9中文观看| 999久久国产精品免费人妻| 成人亚洲视频在线观看| 国产精品久久久久久精品...| 韩国伦理电影在线神马网| 理论片午午伦夜理片久久| 强壮的公次次弄得我高潮韩国电影| 日韩一区二区三区精品| 亚洲看片无码免费视频| 97干97吻| 国产精品69人妻无码久久久 | 网友自拍区视频精品|