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

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

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

UCOS2系統(tǒng)內(nèi)核講述(三)_ TCB任務(wù)控制塊

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

Ⅰ、寫在前面

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

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

UCOS2系統(tǒng)內(nèi)核講述(一)_總體描述

UCOS2系統(tǒng)內(nèi)核講述(二)_初始化調(diào)用函數(shù)

上一篇文章講述了關(guān)于OSInit函數(shù)體中幾個關(guān)于系統(tǒng)內(nèi)核重要的函數(shù),本文將針對上一篇文章中OS_InitTCBList(初始化任務(wù)控制塊)函數(shù)重點講述一下TCB(Task Control Block)任務(wù)控制塊。

TCB任務(wù)控制塊是用來記錄任務(wù)的堆棧指針、任務(wù)的當(dāng)前狀態(tài)、任務(wù)的優(yōu)先級別等一些與任務(wù)有關(guān)屬性的一個數(shù)據(jù)結(jié)構(gòu)表(因此,學(xué)習(xí)本文之前需要了解數(shù)據(jù)結(jié)構(gòu))。任務(wù)控制塊相當(dāng)于一個任務(wù)的“身份證”,它記錄著任務(wù)的重要信息。

對于系統(tǒng)內(nèi)核而言,各個任務(wù)就是通過控制任務(wù)塊將其鏈接成一個表。因此,任務(wù)控制塊在任務(wù)中占據(jù)重要地位。

本文還是結(jié)合前面移植好、可以運行的源代碼來進行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)核部分代碼(圍繞源代碼來講述)。

對于想學(xué)習(xí)UCOS的朋友,本文講述的內(nèi)容可不用深入理解,可以先做個了解。

關(guān)于本文的更多詳情請往下看。

Ⅱ、全局TCB

在上一篇文章中講述的OS_InitTCBList是整個系統(tǒng)初始化重要的一個函數(shù)。


在該函數(shù)中可以看到OS_TCB這么一個數(shù)據(jù)類型,在第一條執(zhí)行語句中可以看到“OSTCBTbl”這個TCB表,下面可以看到“OSTCBPrioTbl”、“OSTCBList”、“OSTCBFreeList”等一些關(guān)于TCB數(shù)據(jù)類型的變量。由此可知道,這個函數(shù)體里面的內(nèi)容全是關(guān)于OS_TCB類型的。

跟蹤代碼可以知道“OSTCBTbl”這些變量定義在ucos_ii.h中,其實這些變量是控制整個系統(tǒng)任務(wù)的一些全局TCB.


從變量后面的注釋可以知道關(guān)于任務(wù)的切換需要修改多少變量(指針),下一章節(jié)我們將進一步講述關(guān)于“OS_TCB”這個數(shù)據(jù)結(jié)構(gòu)體。

Ⅲ、OS_TCB數(shù)據(jù)結(jié)構(gòu)體

要想理解OS_TCB結(jié)構(gòu)體,需要理解數(shù)據(jù)結(jié)構(gòu)(也就是C語言中結(jié)構(gòu)體、指針、鏈表等這些知識),因為OS_TCB里面使用的就是這些知識,先看一下ucos_ii.h中定義的OS_TCB結(jié)構(gòu)體,如下圖:


上面的截圖就是整個“OS_TCB”結(jié)構(gòu)體的內(nèi)容,最重要的幾個參數(shù)就是我用紅色框出來的那些,其他都是次要,或者不必要的參數(shù)。

下面就重點講述一下紅色標(biāo)記的幾個參數(shù):

1.三個重要的OS_TCB參數(shù)

OS_STK *OSTCBStkPtr; 指向當(dāng)前棧頂?shù)闹羔?/p>

struct os_tcb *OSTCBNext; 指向(TCB鏈表中)下一個TCB的指針

struct os_tcb *OSTCBPrev; 指向(TCB鏈表中)上一個TCB的指針

將這三個參數(shù)結(jié)合在一起來講述是為了便于理解任務(wù)控制塊之間的關(guān)聯(lián)。學(xué)過鏈表的人應(yīng)該知道這個寫法,其實它就是將各個TCB構(gòu)成一個關(guān)聯(lián)的表,利用指針將一個個TCB關(guān)聯(lián)起來。

指向上一個TCB的指針、指向當(dāng)前TCB的指針、指向下一個TCB的指針,初學(xué)者只需要將這三個結(jié)合起來思考,理解起來就不難了。

2.任務(wù)運行時重要的OS_TCB參數(shù)

這里說的參數(shù)見上面截圖中最后紅色標(biāo)記部分,這些參數(shù)是任務(wù)運行是重要的參數(shù)。

A.INT32U OSTCBDly;任務(wù)延時滴答 或 事件超時等待:

這個參數(shù)結(jié)合實例中三個任務(wù)的OSTimeDly函數(shù)一起理解就容易多了。OSTimeDly就是將該任務(wù)延時(該任務(wù)掛起)多少個滴答,其中重要的一個參數(shù)就是這里說的“OSTCBDly”,這個參數(shù)傳遞的信息就是延時。

B.INT8U OSTCBStat; 任務(wù)狀態(tài):

這個參數(shù)就是一個標(biāo)示,標(biāo)示任務(wù)處于什么狀態(tài)。包括運行、掛起等,具體見ucos_ii.h第101行“TASK STATUS”的宏定義。

C.INT8U OSTCBStatPend; 任務(wù)懸掛狀態(tài):

這個參數(shù)和上面“任務(wù)狀態(tài)”類似。主要包括三個狀態(tài):OS_STAT_PEND_OK、OS_STAT_PEND_TO和OS_STAT_PEND_ABORT。詳情可見ucos_ii.h第117行“TASK PEND STATUS”的宏定義。

D.INT8U OSTCBPrio; 任務(wù)優(yōu)先級:

任務(wù)優(yōu)先級在學(xué)習(xí)UCOS之前都聽說過這個詞,這個參數(shù)就是標(biāo)明任務(wù)優(yōu)先級的參數(shù)。提示的是:任務(wù)優(yōu)先級值越小,其優(yōu)先級越高。所以,空閑任務(wù)優(yōu)先級是設(shè)置最低。

E.優(yōu)先級計算參數(shù)

INT8U OSTCBX; 優(yōu)先級低3位對應(yīng)的數(shù)值,即=prio&0x07

INT8U OSTCBY; 優(yōu)先級高3位對應(yīng)的數(shù)值,即=prio>>3

OS_PRIO OSTCBBitX; "對應(yīng)"就緒表組的值 OSRdyTbl[OSTCBY] |= OSTCBBitX

OS_PRIO OSTCBBitY; 就緒表組 OSRdyGrp |= OSTCBBitY 即上面的"對應(yīng)"組

這四個參數(shù)是計算任務(wù)優(yōu)先級用的,至于是如何計算的,可以自己研究一下。

Ⅳ、實例工程下載

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

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

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

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

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

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

https://yunpan.cn/cMGZKfnVVb2Li訪問密碼 49c2

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

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

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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制塊
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6378
  • STM32F10
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    15593
  • ucos2
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

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

    關(guān)注

    0

    文章

    8

    瀏覽量

    2361
收藏 人收藏

    評論

    相關(guān)推薦

    自動發(fā)電控制系統(tǒng)的基本任務(wù)

    自動發(fā)電控制系統(tǒng)(Automatic Generation Control,簡稱AGC)在電力系統(tǒng)中扮演著至關(guān)重要的角色,其基本任務(wù)可以歸納為以下幾個方面:   發(fā)電機輸出功率與總負荷功率匹配
    的頭像 發(fā)表于 10-03 15:03 ?150次閱讀

    freertos最多支持多少個任務(wù)

    以下幾個因素: 系統(tǒng)資源 :FreeRTOS能夠支持的任務(wù)數(shù)量受到系統(tǒng)硬件資源的限制,特別是處理器的RAM大小和性能。RAM用于存儲任務(wù)控制
    的頭像 發(fā)表于 09-02 14:21 ?552次閱讀

    星旗下Semes正通過TCB設(shè)備瞄準(zhǔn)HBM市場

    在半導(dǎo)體產(chǎn)業(yè)日新月異的今天,星電子的子公司Semes正以其獨特的戰(zhàn)略眼光,在熱壓鍵合(TCB)設(shè)備領(lǐng)域開辟新徑,特別是在高帶寬存儲器(HBM)市場的布局上展現(xiàn)出強勁勢頭。面對TCB設(shè)備市場的多元化
    的頭像 發(fā)表于 07-18 10:09 ?559次閱讀

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

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

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

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

    emwin發(fā)布信號量給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

    freertos系統(tǒng)如何劃分任務(wù)

    芯片; 2,單片機通過串口和上位機通訊,和上位機通訊時單片機IO腳控制一個LED閃爍。 3,單片機作為從設(shè)備通過SPI2和主設(shè)備通訊,通過檢測單片機的另一個IO腳的狀態(tài),來判斷該設(shè)備是否作為SPI從設(shè)備被選中; 要是劃分
    發(fā)表于 05-08 07:16

    智能集成:整合模擬元件和ARM微控制內(nèi)核,解決棘手嵌入式系統(tǒng)問題

    智能集成:整合模擬元件和ARM微控制內(nèi)核,解決棘手嵌入式系統(tǒng)問題
    的頭像 發(fā)表于 01-05 18:18 ?619次閱讀
    智能集成:整合模擬元件和ARM微<b class='flag-5'>控制</b>器<b class='flag-5'>內(nèi)核</b>,解決棘手嵌入式<b class='flag-5'>系統(tǒng)</b>問題

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

    RZ/G2L Linux系統(tǒng)的鏡像基于yocto構(gòu)建,本篇介紹如何添加新的內(nèi)核模塊。
    的頭像 發(fā)表于 01-04 12:19 ?1617次閱讀
    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ù)棧、
    的頭像 發(fā)表于 12-01 16:36 ?672次閱讀
    RTOS內(nèi)功修煉記(一)— <b class='flag-5'>任務(wù)</b>到底應(yīng)該怎么寫?

    內(nèi)核觀測技術(shù)BPF詳解

    補丁和不斷完善代碼,BPF程序變成了一個更通用的執(zhí)行引擎,可以完成多種任務(wù)。簡單來說,BPF提供了一種在各種內(nèi)核時間和應(yīng)用程序事件發(fā)生時運行一小段程序的機制。其允許內(nèi)核系統(tǒng)和應(yīng)用程序
    的頭像 發(fā)表于 11-10 10:34 ?1108次閱讀

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

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

    SCP基本構(gòu)建介紹

    1-什么是SCP ? 將電源和系統(tǒng)管理任務(wù)從應(yīng)用處理器(AP)中抽象出來。 ? 符合ARM系統(tǒng)控制和管理接口(SCMI)規(guī)范。 ? 執(zhí)行環(huán)境不固定??梢栽赗TOS或裸機環(huán)境中運行。 2
    的頭像 發(fā)表于 11-02 16:52 ?808次閱讀
    SCP基本構(gòu)建<b class='flag-5'>塊</b>介紹

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

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