Ⅰ、寫在前面html
學習本文以前能夠參看我前面的文章:微信
UCOS2系統內核講述(一)_整體描述electron
上一篇文章講述了關於OSInit函數體中幾個關於系統內核重要的函數,本文將針對上一篇文章中OS_InitTCBList(初始化任務控制塊)函數重點講述一下TCB(Task Control Block)任務控制塊。學習
TCB任務控制塊是用來記錄任務的堆棧指針、任務的當前狀態、任務的優先級別等一些與任務有關屬性的一個數據結構表(所以,學習本文以前須要瞭解數據結構)。任務控制塊至關於一個任務的「身份證」,它記錄着任務的重要信息。測試
對於系統內核而言,各個任務就是經過控制任務塊將其連接成一個表。所以,任務控制塊在任務中佔據重要地位。spa
本文還是結合前面移植好、能夠運行的源代碼來進行講述關於最新版本UCOS2系統內核部分代碼(圍繞源代碼來說述)。操作系統
對於想學習UCOS的朋友,本文講述的內容可不用深刻理解,能夠先作個瞭解。3d
關於本文的更多詳情請往下看。
Ⅱ、全局TCB
在上一篇文章中講述的OS_InitTCBList是整個系統初始化重要的一個函數。
在該函數中能夠看到OS_TCB這麼一個數據類型,在第一條執行語句中能夠看到「OSTCBTbl」這個TCB表,下面能夠看到「OSTCBPrioTbl」、「OSTCBList」、「OSTCBFreeList」等一些關於TCB數據類型的變量。由此可知道,這個函數體裏面的內容全是關於OS_TCB類型的。
跟蹤代碼能夠知道「OSTCBTbl」這些變量定義在ucos_ii.h中,其實這些變量是控制整個系統任務的一些全局TCB.
從變量後面的註釋能夠知道關於任務的切換須要修改多少變量(指針),下一章節咱們將進一步講述關於「OS_TCB」這個數據結構體。
Ⅲ、OS_TCB數據結構體
要想理解OS_TCB結構體,須要理解數據結構(也就是C語言中結構體、指針、鏈表等這些知識),由於OS_TCB裏面使用的就是這些知識,先看一下ucos_ii.h中定義的OS_TCB結構體,以下圖:
上面的截圖就是整個「OS_TCB」結構體的內容,最重要的幾個參數就是我用紅色框出來的那些,其餘都是次要,或者沒必要要的參數。
下面就重點講述一下紅色標記的幾個參數:
1. 三個重要的OS_TCB參數
OS_STK *OSTCBStkPtr; 指向當前棧頂的指針
struct os_tcb *OSTCBNext; 指向(TCB鏈表中)下一個TCB的指針
struct os_tcb *OSTCBPrev; 指向(TCB鏈表中)上一個TCB的指針
將這三個參數結合在一塊兒來說述是爲了便於理解任務控制塊之間的關聯。學過鏈表的人應該知道這個寫法,其實它就是將各個TCB構成一個關聯的表,利用指針將一個個TCB關聯起來。
指向上一個TCB的指針、指向當前TCB的指針、指向下一個TCB的指針,初學者只須要將這三個結合起來思考,理解起來就不難了。
2. 任務運行時重要的OS_TCB參數
這裏說的參數見上面截圖中最後紅色標記部分,這些參數是任務運行是重要的參數。
A.INT32U OSTCBDly; 任務延時滴答 或 事件超時等待:
這個參數結合實例中三個任務的OSTimeDly函數一塊兒理解就容易多了。OSTimeDly就是將該任務延時(該任務掛起)多少個滴答,其中重要的一個參數就是這裏說的「OSTCBDly」,這個參數傳遞的信息就是延時。
B.INT8U OSTCBStat; 任務狀態:
這個參數就是一個標示,標示任務處於什麼狀態。包括運行、掛起等,具體見ucos_ii.h第101行「TASK STATUS」的宏定義。
C.INT8U OSTCBStatPend; 任務懸掛狀態:
這個參數和上面「任務狀態」相似。主要包括三個狀態:OS_STAT_PEND_OK、OS_STAT_PEND_TO和OS_STAT_PEND_ABORT。詳情可見ucos_ii.h第117行「TASK PEND STATUS」的宏定義。
D.INT8U OSTCBPrio; 任務優先級:
任務優先級在學習UCOS以前都據說過這個詞,這個參數就是標明任務優先級的參數。提示的是:任務優先級值越小,其優先級越高。因此,空閒任務優先級是設置最低。
E.優先級計算參數:
INT8U OSTCBX; 優先級低3位對應的數值,即=prio&0x07
INT8U OSTCBY; 優先級高3位對應的數值,即=prio>>3
OS_PRIO OSTCBBitX; "對應"就緒表組的值 OSRdyTbl[OSTCBY] |= OSTCBBitX
OS_PRIO OSTCBBitY; 就緒表組 OSRdyGrp |= OSTCBBitY 即上面的"對應"組
這四個參數是計算任務優先級用的,至因而如何計算的,能夠本身研究一下。
Ⅳ、實例工程下載
筆者針對於初學者提供的例程都是去掉了許多沒必要要的功能,精簡了官方的代碼,對初學者一看就明白,以簡單明瞭的工程供你們學習。
筆者提供的實例工程都是在板子上通過屢次測試並無問題才上傳至360雲盤,歡迎下載測試、參照學習。
我將最新UCOS2.92操做系統移植到F0、F一、F三、F4各個硬件平臺上,能夠根據你芯片系列選擇下載。
UCOS基於STM32F0、F一、F三、F4系列實例工程源代碼(彙總):
https://yunpan.cn/cM9Fjv88cXbjI 訪問密碼 048d
本文所講述部分註釋修改爲中文(軟件工程源代碼):
https://yunpan.cn/cMGZKfnVVb2Li 訪問密碼 49c2
基於STM32平臺的UCOS源代碼工程(官方原始軟件工程)
官網下載(須要帳號):
360雲盤下載:
https://yunpan.cn/cM9Gzv4drXqxv 訪問密碼 c82c
Ⅴ、說明
UCOS相關的文章我會第一時間在微信公衆號裏面和你們分享,也能夠到我博客上查看。
當你掌握UCOS在一種平臺上的移植,其餘平臺移植原理相似,請不要侷限某一平臺。
以上總結僅供參考,如有不對之處,敬請諒解。
Ⅵ、最後
更多精彩文章我將第一時間在微信公衆號裏面分享,若是不想錯過,能夠關注個人微信公衆號。
本着免費分享的原則,方便你們手機學習知識,按期在微信平臺分享技術知識。若是你以爲分享的內容對你有用,又想了解更多相關的文章,請用微信搜索「EmbeddDeveloper」 或者掃描下面二維碼、關注,將有更多精彩內容等着你。