?

uC/OS-n多任務切換方法研究

2021-11-05 10:51曹雷欣孔祥坤
消費電子 2021年9期
關鍵詞:信號量多任務調用

曹雷欣 孔祥坤

【關鍵詞】uC/OS-II任務;多任務切換;信號量機制;任務TCB;Task控制塊

一、uC/OS-II的五種任務狀態的含義

(一)uC/OS-II其任務建立一般在多任務運行前,子任務也可以動態地被運行著的任務建立。如果該任務被另一個未運行任務所建,兩個任務中高優先級任務將取得CPU的控制權。

(二)一個任務被創建后,可能處在以下五種狀態:

休眠態(Dormant State)指任務被調到內存中準備運行,但還沒有被uC/OS-II內核轉讓管理權時的狀態。

任務就緒態(Ready State)指將要運行的任務準備就緒,即將開始運行。

任務等待態(Waiting State)指等待一段時間然后將會被調用進入運行狀態。

中斷服務狀態(Interrupt Service State)指任務因高優先級任務搶占被中斷執行,被迫進入中斷服務例程的狀態。

執行狀態(Executive state)指任務正處于運行的狀態。

二、五種任務狀態之間互相切換的方法。

(一)就緒態、運行態、等待態轉為休眠態的切換方法:

一個任務處于就緒狀態或運行狀態或等待狀態時,要想切換到休眠態需要調用OSTaskDel()返回到休眠態。

(二)由睡眠態進入就緒態的方法

任務處于休眠態要調用OSTaskCreate()或OSTaskCreateExt0函數,這樣就可以把任務交給uC/OS-II內核管理,同時進入就緒態狀態( Ready State),準備運行。

(三)由運行態進入等待狀態的方法

任務要想進入運行態需要OSTimeDly()或OSTimeDlyHMSMO函數方法,任務進入運行態將等待下一個優先級更高的、達到了就緒態的任務到來,并轉入CPU控制權。

將運行態的任務變換成等待某一事件發生的等待態(WAITING State)需要調用OSSemPend(),OSMboxPend0,或OSQPend0函數。掛起任務(PendTask),由于等待事件或所需資源沒有就緒,CPU的控制權會被下一個優先級更高的、提前進入就狀態緒態的任務搶占。

(四)由等待狀態進入就緒態

uC/OS-II系統服務函數OSTimeTick()發現處于等待態的任務等待時間片耗盡后,會切換任務進入到就緒態。之前被掛起的任務發現等待的事件發生了(所需資源被釋放),也將進入就緒態。這種消息可能來自系統的中斷服務例程或自某一個任務。

(五)運行狀態與中斷狀態之間的相互轉換

一個處于運行狀態的任務被內部或外部的中斷了就進入了中斷服務態(ISR)。子中斷服務程序當執行的任務被掛起時會交還CPU的使用權。

處于中斷狀態的任務當中斷服務子程序執行完返回后系統將會調用OSlnext()函數使優先級最高的并進入就緒狀態的任務得以運行。

(六)就緒狀態與運行狀態的相互轉換

任務在處于就緒態時,當系統調度OSStart()函數執行時,就進入了運行態。

一個正在運行的狀態由于某種原因它的CPU使用權被剝奪時就進入了就緒狀態。

(七)任務狀態之間相互轉換的關系在uC/OS-II中如圖1所示。

三、uC/OS-II多任務間的同步與通信

(一)多任務之間通信,在uC/OS-II系統中主要考慮了兩個問題:

Task(任務)之間可以共享資源,但在資源訪問上是一種互斥關系,是一種獨占式的共享。正在執行的任務在沒有釋放獨占資源時,其他任務則只能等待;當任務獲得任務執行所需事件及資源都具備后,等待當前任務結束會順序執行,否則任務只能循環等待。

(二)任務間的通信

1、事件

uC/OS-II任務之間實現通信的媒介包括信號量、消息隊列和消息郵箱。事件之間的通信包括發送事件、請求事件,其操作就是任務把信息從一個事件發送到另一個事件上。請求事件又被叫做讀取事件,或者稱之為等待事件。

2、信號量

信號量本質上說是事件,是uC/OS-II中實現任務間通信的一種機制設置。信號量的機制中有一種二值形式的信號量(兩種狀態),可以實現資源的獨占式共享,又叫做互斥型的信號量,其余信號量機制還有計數式信號量等。

在信號量機制的設計上,是基于打破請求保持的死鎖條件的考慮。為防止任務間因相互持有對方任務執行所必需的資源,且繼續請求其他所需資源,造成多個任務都無法得到執行的情況發生,因此在等待信號量的時間上規定了一個時限,即等待時限。當任務等待時間超過規定,仍未等到這個信號,就強制命令該任務停止等待,釋放所保持資源。

在以優先級作為調度依據的可搶占式實時操作系統uC/OS-II的核心代碼中,優先級的高低完全決定了任務獲得CPU使用權的先后順序。系統依據信號量獲得與否,決定調度任務能否被運行。因此在某些使用信號量同步機制的實時任務中,有兩個限制任務能否運行的條件:一是任務優先級的高下:二是正在等待信號量的獲得與否。

3、消息郵箱

uC/OS-II實時操作系統中,多任務間采用消息郵箱傳遞信息,這種方法很好地實現了任務間的通信。通常,多任務系統的內存中有共享存儲區,以作消息緩沖。對緩沖區的數據存取操作,可以實現任務間的消息傳遞。消息郵箱的數據類型是存取消息的指針型數據結構。

4、消息隊列

消息郵箱可以在設計的時候設計為多個也可以為單個。多消息郵箱以指針數組的形式實現,一個個數組元素里存放著消息緩沖區指針的數組型數據結構,就是所謂的消息隊列,消息緩沖區以指針數組的方式一次實現多個消息傳遞。

四、uC/OS-II的多任務的管理與控制

(一)任務就緒表

uc/OS-II總是運行進入就緒狀態任務中優先級最高的那一個。所有任務的就緒態都存放于在一個叫就緒表( Ready List)的數據結構中。就緒表是提供給任務調度使用的,無需用戶干預,系統會從若干個不同優先級的任務中找出相應就緒的任務進入運行狀態。

(二)就緒表的構成

就緒表由OSRdyGrp和OSRdyTbl[]構成,在OSRdyGrp中,任務按優先級分組,8個任務一組,當前系統最多有64個優先級,所以OSRdyGrp有8個有效位,一共可以對應8組任務。每一位對應一組任務,第O位對應的就是優先級0-7的任務,這8個任務之間是“或”的關系,只要一個任務處于就緒狀態,那么OSRdyGrp的第O位就是1,如下圖2所示。

(三)事件的等待任務列表

uC/OS-II實現事件管理的功能有兩個:一是對等待該事件或資源的所有任務,依據其到來的先后,對任務進行記錄和排序;二是對正在等待執行的所有任務,允許其在一定時間內等待,而不是一直等待。uC/OS-II采用了與任務就緒表類似的方法實現對于等待事件任務的記錄和排序,定義一個8位整型( INT8U)有記錄功能的數組OSEventTbl[],作為等待任務的記錄表。uC/OS-II在事件機制上,還定義另一個8位整型( INT8U)的變量OSEventGrp,作為等待任務記錄表中的任務組。

任務控制塊( TCB)的成員函數OSTCBDly可以記錄任務的等待時件,在下個時鐘節拍到來時,中斷服務程序將會自動進行計數。當出現超時任務時,TCB則將會把記錄從事件等待任務表中刪除,并重新恢復任務進入就緒態。

(四)任務控制塊OS-TCB與任務棧OS_STK

OS-TCB這種數據結構,就用來描述任務所具有的某些屬性的,uC/OS-II將會用它來對各個任務進行處理:

1、當前任務被建立時,任務控制塊將被初始化;

2、當前任務CPU使用權被搶占后,TCB將會保存任務的狀態;

3、當前任務重新獲得CPU使用權時,為了確保任務能夠從中斷之時繼續執行下去,TCB會把保存的數據裝載到要執行任務的堆棧中進行恢復。

由于OS_TCB只有在任務創建之后才有意義,所以其全部駐留在RAM當中。

任務堆棧(OS_STK)在uC/OS-II中的作用是保存任務運行時涉及到的資源,例如使用到的寄存器、調用這個任務的返回地址,或者是任務內部函數嵌套時用到的返回地址保存參數等。

(五)事件控制塊ECB

uC/OS-II中有關任務調度技術上,設置了一個事件控制塊( ECB)。ECB的能夠把事件的等待任務表和與事件有關的信息捆綁在一起,并定義為事件。ECB這種結構是用來存儲諸如信號量、郵箱(消息郵箱)和消息隊列等事件。

從OSEventTbI[OS_EVENT_TBL_SIZE]其定義來看,其實際為指針數組,其數據類型和任務就緒表在定義格式上頗似。程序中,所有任務按照其優先級高低,各自在表中占據一個二進制位,以二值(1或者0)的形式來記錄。該位標記對應的任務是否是正在等待事件的任務,標記任務狀態的這張表又被稱為任務等待表。

1、事件控制塊的基本函數操作

TCB基本操作函數,其函數方法,都定義在內核文件OS_CORE.C中,供信號量事件,消息郵箱事件,消息隊列事件來調用。

(1)事件控制塊的初始化函數

#if (OS_Q_EN&&(OS_MAX_QS>=2))11 0S_MBOX_EN ll OS_SEM_EN//初始化條件

void OSEventWaitListlnit (OS_EVENT *PREVENT)//指向TCB的指針OS_EVENT *PREVENT

該函數在任務調用OS***Create0函數時進行事件創建,被OS****Create0函數作為子函數調用。在此指代:Sem,Mutex,Mbox,Q。

(2)切換Task進入等待狀態的函數

需要把一個任務切換成等待狀態,系統會調用OSEventTaskWait0功能函數。

#if (OS_Q_EN&&(OS_MAX_QS>=2))11 0S_MBOX_EN|| OS_SEM_EN

void OSEventTaskWait (OS_EVENT*pevent)

上邊的OSEventTaskWait()函數,將在任務調用函數OS***Pend0發送事件時,被OS***Pend0來調用。

(3)切換Task進入正在等待就緒狀態的函數

在當前任務中,調用OSEventTaskRdy0函數把該任務在Task等待表中所置位清0,等切換出等待狀態后,任務就緒表中把該任務所在的對應,設置為1,新一輪的任務的調度工作將啟動。

(六)空事件控制塊鏈表

空事件控制塊鏈表其數據結構實現上,與管理任務控制塊的實現方法頗有相似,uC/OS-II把事件控制塊也組織成為兩條鏈表來管理。

uC/OS-II在系統完成初始化后,會在初始化函數OSlnit0中,按照應用程序使用事件總數的最大值,創建OS_MAX_EVENTS個空事件塊,并以成員OSEventPtr作為鏈接指針組成單向鏈表。

五、結束語

本文簡要介紹了uG/OS-II的多任務切換方法和uG/OS-II的任務之間的通信機制。本文初步的對uC/OS-II的初步探究揭示了實時操作系統( RTOS)的多任務的一般實現途徑,將對研究其他操作系統的多任務的實現和管理機制的研究有一定的借鑒作用。

猜你喜歡
信號量多任務調用
基于STM32的mbedOS信號量調度機制剖析
核電項目物項調用管理的應用研究
基于中心化自動加權多任務學習的早期輕度認知障礙診斷
LabWindows/CVI下基于ActiveX技術的Excel調用
Nucleus PLUS操作系統信號量機制的研究與測試
基于系統調用的惡意軟件檢測技術研究
基于判別性局部聯合稀疏模型的多任務跟蹤
基于多任務異步處理的電力系統序網絡拓撲分析
未知環境下基于粒子群優化的多任務聯盟生成
μC/OS- -III對信號量的改進
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合