在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

UCOS2系統內核講述(五) _初始化TCB詳情

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

Ⅰ、寫在前面

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

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

上一篇文章講述了關于函數“OSTaskCreateExt”創建任務函數體里面重要一些的內容,本文接著上一張講述關于“OSTaskCreateExt”函數體里面調用的一個函數“OS_TCBInit”初始化任務控制塊,“OS_TCBInit”也是與系統內核緊密相關的一個函數。

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

Ⅱ、OS_TCBInit參數詳情

在學習OS_TCBInit之前要明確一下,“OS_TCBInit”和“OS_InitTCBList”(OSInit下面調用的函數),從命名上看上去有點相似,但仔細看一下區別還是可以看到出來的。

“OS_InitTCBList”在前面文章有講述過(可以看我前面相關的文章),主要是初始化TCB鏈表。“OS_InitTCBList”函數體內容相關于將TCB鏈表復位。

本文將的“OS_TCBInit”是在創建任務時初始化一個任務的TCB,要將優先級、堆棧等信息初始化。“OS_TCBInit”函數體內容相當于對任務的TCB里面對應的內容落實到具體的參數上。

可以將“OS_TCBInit”和“OS_InitTCBList”區別比喻如下:

“OS_TCBInit”是將某一個整形變量初始話為0(復位值);

“OS_InitTCBList”是將某一個整形變量賦值為1(具體值);

從main函數跟蹤代碼可以找到“OS_TCBInit”函數,如下動畫:

“OS_TCBInit”函數的每一個參數在函數體源代碼上面都有注釋(我也將源代碼注釋修改為中文了,可以下載參看)。


該函數位于“os_core.c”下面;

1.第一個參數prio

prio看過UCOS系統的朋友應該對整個參數不會陌生,它就是任務的優先級。

這個參數是從“OSTaskCreateExt”函數參數中傳下來的(原封不動,一樣的參數)。

注意:任務的優先級數值越小,它的優先級越高。比如:

Task1優先級是1,Task2優先級是2。則Task1優先級高于Task2的優先級。

2.第二個參數ptos

ptos這個參數和上一篇文章中OSTaskCreateExt創建任務中的ptos一樣,是指向棧頂的指針。創建任務中利用“OSTaskStkInit”初始化堆棧得到棧頂的指針psp,將該指針傳遞給OS_TCBInit函數的參數。

同樣說明一下:這個參數和“第三個參數pbos”對應,需要根據棧的增長方向“OS_STK_GROWTH”來決定。

3.第三個參數pbos

pbos這個參數和“第二個參數”一樣,是從上一層的OSTaskCreateExt創建任務中的ptob參數意思一樣,是指向棧底的指針。

4.第四個參數id

id這個參數不多說,和上文一樣的意思。

5.第五個參數stk_size

stk_size這個參數和上一篇文章也是一樣,這里再提示一下,它就是堆棧的大小,就是你分配堆棧空間(定義堆棧數組)的大小。

6.第六個參數pext

pext這個參數是指向用戶提供的內存(指針)。

這個參數對初學者意義不大,可暫時不用去理解它,你把它理解為擴展使用就是了。

7.第六個參數opt

opt:用戶操作選項參數。

上一篇文章已經說的很詳細,具體說明見上一篇文章。

到此,細心的會發現,其實“OS_TCBInit”函數的參數基本是繼承“OSTaskCreateExt”函數的參數。從這里可以看得出“OS_TCBInit”函數才是創建任務重要的函數。

Ⅲ、OS_TCBInit函數體內容描述

上一章節講述了“OS_TCBInit”的參數,其實傳遞進來的參數是保存在TCB鏈表里面的,用于保存一個任務重要的信息,具體如何實現就要看接下來的函數體說明(建議下載源代碼一起參考學習)。

1.第一部分


A.鏈表節點及參數:

OSTCBFreeList是當前空閑TCB鏈表,相當于每初始化一個任務就要將OSTCBFreeList指向下一個沒有使用的FreeList,保證在每次創建任務的時候有OSTCBFreeList可用。

if (ptcb != (OS_TCB *)0)

這個條件就是上面說的,判斷還有沒有空閑TCB鏈表,如果沒有空閑TCB鏈表就會返回“錯誤”。

OSTCBFreeList = ptcb->OSTCBNext;指向下一個TCB鏈表。

下面來的就是其它參數賦值(堆棧、優先級、任務狀態就緒等)。

B.任務參數:

這里說的任務參數和上一篇文章說的不一樣,主要說的是傳遞下來的參數信息,歸位到對應的空間,也就是參數賦值。

ptcb->OSTCBDelReq = OS_ERR_NONE;

這里有一個語句,就是任務可以刪除(當我們使能了刪除任務功能,在創建任務之后就可以刪除創建的任務)。

2.第二部分


A.優先級:

UCOS優先級實現其功能具體的這部分是比較困難的,使用了“優先級表”,而且查找優先級的算法也相對來說比較困難,初學者暫時可以不用考慮,感興趣的朋友可以網上“UCOS優先級調度算法”。

B.事件:

這個需要結合事件(信號量、消息郵箱等)來講述,我會在后面講述UCOS資源的事件中提及相關的信息。

C.性能分析參數:

這個參數可以從注釋的意思來理解,“性能分析”意思就是對系統運行的性能,CPU使用率等來理解。前面在講述OS_TaskIdle空閑任務時就看到,函數體里面有這么一條語句:OSIdleCtr++; 也就是統計空閑任務的計數次數。

3.第三部分


在上面上部分的“準備”工作之后,這剩下的就是“就緒”工作了。

OSTCBInitHook(ptcb);和OSTaskCreateHook(ptcb);這兩個函數一般都是成對出現,是用戶自己的HOOK函數,用戶自己要實現某一些功能就寫在這里。

OSTCBPrioTbl[prio] = ptcb; 這條語句將該任務在TCB表中有一個對應的位置。

ptcb->OSTCBNext = OSTCBList;和上面第一部分類似,指向TCB鏈表。

OSTaskCtr++;任務也有一個統計計數的變量。

Ⅳ、實例工程下載

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

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

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

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

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

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

https://yunpan.cn/ckKeBFx25VIEB訪問密碼 a9df

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

官網下載(需要賬號):

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

360云盤下載:

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 源代碼
    +關注

    關注

    96

    文章

    2946

    瀏覽量

    66811
  • ucos2
    +關注

    關注

    0

    文章

    15

    瀏覽量

    3563
  • 操作系統內核

    關注

    0

    文章

    8

    瀏覽量

    2377
收藏 人收藏

    評論

    相關推薦

    OMAP5912多媒體處理器初始化參考指南

    電子發燒友網站提供《OMAP5912多媒體處理器初始化參考指南.pdf》資料免費下載
    發表于 12-17 16:20 ?0次下載
    OMAP5912多媒體處理器<b class='flag-5'>初始化</b>參考指南

    STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

    STM32F407微控制器單元(MCU)與SD NAND的結合提供了強大的存儲解決方案。然而,不斷電初始化失效問題可能會導致系統穩定性和數據完整性受損。我們將STM32F407與SD NAND集成時可能遇到的初始化問題,并提供專
    的頭像 發表于 12-11 10:51 ?390次閱讀
    STM32F407 MCU使用SD NAND?不斷電<b class='flag-5'>初始化</b>失效解決方案

    segger編譯器初始化問題

    的圖; 2.第二張圖是該變量在文件中的所有操作,第一行是初始化,該行代碼在初始化部分最后一個,執行完就是主循環了; 3.第2,3行也是對變量的賦值,在主循環中; 4.第4行已注釋; 5
    發表于 12-09 18:06

    請問LMX2595配置時如何進行初始化

    您好,查閱手冊說初始化按照1.r0的rest置為1;2.r0的reset置為1;3.按照寄存器表格配置寄存器;4.fcal_en置為1的順序來初始化。請問在第三步中,按照寄存器表配置寄存器,這些
    發表于 11-12 06:51

    基于旋轉平移解耦框架的視覺慣性初始化方法

    精確和魯棒的初始化對于視覺慣性里程計(VIO)至關重要,因為不良的初始化會嚴重降低姿態精度。
    的頭像 發表于 11-01 10:16 ?384次閱讀
    基于旋轉平移解耦框架的視覺慣性<b class='flag-5'>初始化</b>方法

    TMS320C6000 McBSP初始化

    電子發燒友網站提供《TMS320C6000 McBSP初始化.pdf》資料免費下載
    發表于 10-26 10:10 ?0次下載
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    如何在i.MX RT微控制器上初始化LWIP協議棧

    在i.MX RT微控制器上初始化LWIP協議棧是一個復雜但有趣的過程,它涉及多個步驟和關鍵組件的配置.
    的頭像 發表于 10-12 11:48 ?391次閱讀
    如何在i.MX RT微控制器上<b class='flag-5'>初始化</b>LWIP協議棧

    視頻引擎初始化失敗怎么回事

    視頻引擎初始化失敗是一個常見的技術問題,它可能由多種原因引起,包括軟件沖突、硬件問題、驅動程序問題、系統設置錯誤等。要解決這個問題,需要對可能的原因進行詳細的分析和診斷。 1. 軟件沖突 1.1
    的頭像 發表于 09-18 18:18 ?1361次閱讀

    瀚海微SD NAND應用之SD協議存儲功能描述2 初始化命令

    初始化和識別過程: 總線激活后,主機啟動卡初始化和識別過程。 初始化過程從SD SEND OP COND (ACMD41)開始,通過設置其操作條件和OCR中的HCS位。HCS (Host
    的頭像 發表于 07-22 10:54 ?393次閱讀
    瀚海微SD NAND應用之SD協議存儲功能描述<b class='flag-5'>2</b> <b class='flag-5'>初始化</b>命令

    stm32f4跑ucos+emwin5.16 gui_init()初始化失敗的原因?

    我用stm32f4discovery 連了一塊ra8875的4.3寸屏幕, ucosii已經移植成功了,但是移植emwin5。16的時候在gui初始化的時候就會進入 HardFault_Handler(); 不知道是什么情況; 單獨跑emwin 也能跑,為什么和ucos
    發表于 05-17 12:33

    初始化IO口為外部中斷線的時候,最先初始化的會被后初始化的覆蓋掉為什么?

    初始化IO口為外部中斷線的時候,比如GPIOA6與GPIOB6先后初始化為外部中斷,最先初始化的會被后初始化的覆蓋掉,不知道是為什么?
    發表于 05-14 08:26

    使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失敗的原因?怎么解決?

    使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失敗,有人知道原因嗎?
    發表于 03-25 07:50

    字符型、指針型等變量等該如何初始化

     對于數值類型的變量往往初始化為0,但對于其他類型的變量,如字符型、指針型等變量等該如何初始化呢?
    的頭像 發表于 03-18 11:02 ?1542次閱讀

    【鴻蒙】小型系統LiteOS-A內核

    對該芯片架構的支持,這個工作較為復雜,不在這篇文章范圍內。 基礎適配 LiteOS-A 提供系統運行所需的系統初始化流程和定制配置選項。移植過程中,需要關注
    的頭像 發表于 02-29 16:16 ?1239次閱讀
    【鴻蒙】小型<b class='flag-5'>系統</b>LiteOS-A<b class='flag-5'>內核</b>

    MCU單片機GPIO初始化該按什么順序配置?為什么初始化時有電平跳變?

    GPIO初始化時有時鐘配置、模式配置、輸出配置、復用配置,那么在編寫初始化代碼時,到底該按什么順序執行呢?如果順序不當那初始化過程可能會出現短暫的電平跳變。
    的頭像 發表于 02-22 11:07 ?1575次閱讀
    MCU單片機GPIO<b class='flag-5'>初始化</b>該按什么順序配置?為什么<b class='flag-5'>初始化</b>時有電平跳變?
    主站蜘蛛池模板: 在线精品国产成人综合第一页| 色偷偷888欧美精品久久久| 国产成人毛片毛片久久网| 桃色婷婷| 伊人五月婷婷| 亚洲日本色图| 一级特黄特黄xxx视频| 迅雷www天堂在线资源| 国产精品午夜自在在线精品| 国产男女怕怕怕免费视频| 亚洲欧洲一区| 日韩系列| 国产一区二区高清在线| 男人天堂综合网| 热久久这里只有精品| 四虎国产永久免费久久| 亚洲欧美高清| 日韩免费在线视频| 激情五月开心网| 久久青青成人亚洲精品| 国产一区二区三区在线观看视频 | 最黄毛片| 四虎国产精品成人永久免费影视| 欧美三级小视频| 日本高清视频色www在线观看| 鲁一鲁色一色| 狠狠五月深爱婷婷网免费| bt种子搜索在线| 成年网站在线看| 成年午夜一级毛片视频| 台湾久久| 国产小视频免费观看| 男人的天堂欧美| 91大神免费视频| 优优优色| 特黄特色三级在线播放| 久久综合一| 天天干天天射天天舔| 欧美又黄又嫩大片a级| 欧美一级特黄高清免费| xvideos69日本hd|