国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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,也就是參數檢查和堆棧清除。

清除棧的順序與棧的增長方向有關??吹皆创a就知道清除堆棧,其實就是在初始時清空一下堆??臻g。

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

    文章

    51

    瀏覽量

    9412
  • ucos2
    +關注

    關注

    0

    文章

    15

    瀏覽量

    3707
  • 操作系統內核

    關注

    0

    文章

    8

    瀏覽量

    2485
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內核伙伴系統內存申請函數詳解:從原理到實戰

    在 Linux 內核中,內存管理是整個系統穩定運行的基石,而伙伴系統(Buddy System) 作為內核物理內存分配的核心機制,更是驅動開發、內核
    的頭像 發表于 02-10 16:58 ?3630次閱讀
    Linux<b class='flag-5'>內核</b>伙伴<b class='flag-5'>系統</b>內存申請函數詳解:從原理到實戰

    Linux系統內核參數調優實戰指南

    Linux 內核參數調優是系統性能優化的核心環節。隨著云原生架構的普及和硬件性能的飛速提升,默認的內核參數配置往往無法充分發揮系統潛力。在高并發 Web 服務、大數據處理、容器化部署等
    的頭像 發表于 01-28 14:27 ?432次閱讀

    【瑞薩FPB-RA6E2試用】環境配置及基礎任務代碼示例

    安裝,這里建議前文講述的RA和Zephyr可以分開創建文件夾,單獨創建一個Zephyr,方便后續對薩瑞芯片的開發 在這里我們選擇第個方式,在本地
    發表于 01-24 20:47

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】Linux內核開發基礎

    感謝電子發燒友論壇提供的《Linux設備驅動開發(第2版)》閱讀機會,測評將從Linux內核開發基礎、Linux內核平臺抽象和設備驅動程序、發揮硬件潛力以及嵌入式領域內的多種內核子系統
    發表于 01-12 22:45

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀內核處理的核心輔助函數

    防塵薄膜包裝,拿在手上很有分量。 本書上架于異步社區,屬于社區的精品IT圖書,由中國工信出版集團、人民郵電出版社出版,印刷清晰,排版合理。本書共大篇,即第1篇,Linux內核開發基礎;第2
    發表于 01-10 22:08

    大模型驅動的發射任務智能調度分系統軟件平臺的應用與未來發展

    功能、應用案例及未來趨勢個維度進行系統闡述。 ? ?應用案例 ? ?北京華盛恒輝科技和北京五木恒潤科技推出的大模型驅動的發射任務智能調度分系統,廣泛適用于各行業等領域,可出色完成大模
    的頭像 發表于 12-19 14:50 ?297次閱讀

    什么是嵌入式操作系統

    、嵌入式操作系統的定義 嵌入式操作系統是專門為資源受限的嵌入式設備(比如 STM32 單片機、物聯網模塊、工業控制器)設計的微型操作系統,核心作用是:管理硬件資源、調度多任務、提供標
    發表于 12-09 10:33

    Linux-RT特點及簡單應用

    處理器時間。這意味著實時任務可以在硬實時約束下運行,從而保證任務的響應時間和執行時間。 固定優先級調度:實時內核調度器通常采用固定優先級調度策略,其中任務的優先級在
    發表于 12-05 07:37

    ucos與freertos哪個好?

    選擇uCOS或FreeRTOS取決于項目的具體需求和資源限制。 FreeRTOS的優點包括: 更小的內核ROM和RAM占用,特別是在RAM方面,適合資源受限的嵌入式系統。 支持協程
    發表于 12-05 07:13

    FreeRTOS 空閑任務

    FreeRTOS 中很多人會注意到為什么有一個叫IDLE task的任務占用了CPU百分之九十多的使用權,但是這個任務并沒有自己手動創建。原因就是這個空閑任務
    發表于 12-04 07:35

    【HZ-T536開發板免費體驗】—— linux創建線程

    任務,并行是多個處理器或多核處理器同時執行不同的任務。 Linux系統中進行多線程編程時,會涉及到主線程和子線程的操作: 1)主線程是程序的執行入口,它是程序中第一個創建的線程。
    發表于 09-01 21:31

    Task任務:LuatOS實現“任務級并發”的核心引擎

    Task任務通過其強大的并發處理能力,使LuatOS能夠在單線程環境中模擬多線程執行,通過協程的掛起與恢復機制,實現任務級的并行操作,顯著提升系統效能。 sys核心庫是LuatOS運行框架庫,也是
    的頭像 發表于 08-28 13:49 ?508次閱讀
    Task<b class='flag-5'>任務</b>:LuatOS實現“<b class='flag-5'>任務</b>級并發”的核心引擎

    揭秘LuatOS Task:多任務管理的“智能中樞”

    Task任務作為LuatOS的核心組成部分,通過智能化的任務管理機制,實現任務創建、調度與協同運行,讓復雜應用得以高效并行處理,滿足實時場景下的嚴苛需求。 sys核心庫是LuatOS
    的頭像 發表于 08-28 13:48 ?635次閱讀
    揭秘LuatOS Task:多<b class='flag-5'>任務</b>管理的“智能中樞”

    同步任務開發指導

    {// 調用靜態類對象中實現的同步等待調用Handle.syncSet(num);return true;}// 步驟2: 創建任務并執行async function asyncGet(): Promise
    發表于 06-19 07:57

    瑞薩RA8快速上手指南:Cortex-M85內核瑞薩RA8開發環境搭建 并點亮一個LED

    因為Cortex-M內核,瑞薩RA8系列單片機支持多種市面上常見的開發環境,像Keil MDK、IAR EWARM等,而本文講述的是瑞薩自家官方的IDE(e2 studio)。
    的頭像 發表于 03-17 14:35 ?1927次閱讀
    瑞薩RA8快速上手指南:Cortex-M85<b class='flag-5'>內核</b>瑞薩RA8開發環境搭建 并點亮一個LED