基于μC/OS-Ⅲ的多任務(wù)間郵箱機制分析與應用
摘要:為靈活、有效地在多任務(wù)程序設計中應用μC/OS-Ⅲ操作系統中的郵箱,采用理論分析與實(shí)例實(shí)驗相結合的方法,得到基于μC/OS-Ⅲ操作系統的郵箱機制在全雙工任務(wù)間通信、二值信號量和充當延遲函數等方面的應用技巧和方法。實(shí)驗表明,郵箱的靈活應用不僅可以實(shí)現傳統的任務(wù)間數據通信,還可以方便地替代互斥信號量和實(shí)現延時(shí)功能。
關(guān)鍵字:嵌入式系統;任務(wù)間通信;μC/OS-Ⅲ;郵箱
0 引言
嵌入式系統軟件通常由多個(gè)功能模塊構成,而模塊的功能一般由基于嵌入式操作系統的任務(wù)來(lái)實(shí)現。在實(shí)際應用中,常需要進(jìn)行任務(wù)間通信來(lái)實(shí)現特定的功能,如變量的傳遞、資源的共享等,這就需要針對操作系統建立可靠的任務(wù)間通信,而郵箱是最常用的任務(wù)間通信機制之一。本文基于μC/OS-Ⅲ嵌入式實(shí)時(shí)操作系統,研究了郵箱的使用和技巧,不僅探討了郵箱在傳統任務(wù)間通信和數據的傳遞中的應用,還通過(guò)實(shí)例研究了郵箱在二值信號量和實(shí)現延時(shí)功能中的靈活應用。
1 μC/OS-Ⅲ簡(jiǎn)介
嵌入式實(shí)時(shí)操作系統(RTOS)是嵌入式系統的關(guān)鍵組成部分。近年來(lái),μC/OS-Ⅲ操作系統以其較小的體積、開(kāi)放的源碼和值得信賴(lài)的可靠性獲得了工程技術(shù)人員的青睞。2011年,μC/OS-Ⅲ的升級版μC/OS-Ⅲ發(fā)布。μC/OS-Ⅲ秉承了前一版本的優(yōu)點(diǎn),是一個(gè)高度可移植、可固化、可擴展,具有優(yōu)先搶占的實(shí)時(shí)性,專(zhuān)為滿(mǎn)足當今嵌入式系統的苛刻要求的多任務(wù)內核,它的最大改進(jìn)之處在于允許多個(gè)任務(wù)運行于同一優(yōu)先級上,相同優(yōu)先級的任務(wù)按時(shí)間片輪轉調度,內核對象的數量不受限制以及接近于零的終端禁用時(shí)鐘周期。μC/OS-Ⅲ內核為程序員提供了高效的實(shí)時(shí)任務(wù)調度、中斷管理以及任務(wù)間通信。與前期版本不同,μC/OS-Ⅲ支持無(wú)限多個(gè)任務(wù),無(wú)限多個(gè)優(yōu)先級,無(wú)限多個(gè)信號量,同時(shí)支持互斥信號量、消息郵箱等任務(wù)間通信方式。
2 任務(wù)間通信與郵箱的應用
由于嵌入式系統軟件通常由基于操作系統的若干個(gè)任務(wù)實(shí)現,因此,不可避免的需要任務(wù)之間或中斷服務(wù)子程序與任務(wù)間的通信,這種信息傳遞機制稱(chēng)為任務(wù)間的通信。μC/OS-Ⅲ任務(wù)間的通信可以通過(guò)共享內存、信號量、任務(wù)內建消息隊列、外部消息隊列、事件標志組實(shí)現。共享內存方式使用全局變量或緩存,對大型而復雜的程序,多個(gè)任務(wù)同時(shí)對一個(gè)變量進(jìn)行讀寫(xiě)操作會(huì )引起沖突或緩存區的溢出,因此共享內存用于共享一些對數據安全性不高的通用數據。信號量的通信模型雖然可以很好地起到互斥的作用,但在多個(gè)任務(wù)同時(shí)與某一任務(wù)通信是就會(huì )產(chǎn)生對信號量的競爭,引起通信發(fā)起端的排隊,降低系統的效率。任務(wù)內建消息隊列一般用于接收少量消息(如中斷服務(wù)程序發(fā)送過(guò)來(lái)的消息)、外部消息隊列主要面向于多個(gè)任務(wù)共同等待的消息,事件標志組則用于多個(gè)任務(wù)間的同步。
總結來(lái)說(shuō),μC/OS-Ⅲ任務(wù)間通信有2個(gè)途徑:通過(guò)全局變量或發(fā)消息給另一個(gè)任務(wù)。用全局變量時(shí),必須保證每個(gè)任務(wù)或中斷服務(wù)子程序獨享該變量。中斷服務(wù)中保證獨享的惟一辦法是關(guān)中斷。如果2個(gè)任務(wù)共享某變量,各任務(wù)實(shí)現獨享該變量的辦法可以使關(guān)中斷,再開(kāi)中斷,或使用信號量。需要注意的是,任務(wù)只能通過(guò)全局變量與中斷服務(wù)子程序通信,而任務(wù)并不知道什么時(shí)候全局變量被中斷服務(wù)子程序修改了,除非中斷服務(wù)子程序以信號量方式向任務(wù)發(fā)信號,或者是該任務(wù)以查詢(xún)方式不斷周期地查詢(xún)變量的值。這樣就不可避免地給程序設計帶來(lái)了一定的難度,為避免這種情況,常用的解決方法是采用郵箱。
典型的消息郵箱(Message Mail Box)也稱(chēng)作交換消息,即用一個(gè)指針型變量,一個(gè)任務(wù)或一個(gè)中斷服務(wù)子程序通過(guò)內核,可以把一則消息(一個(gè)指針)放到郵箱中。同樣,一個(gè)或多個(gè)任務(wù)通過(guò)內核,可以接收這則消息。發(fā)送消息的任務(wù)和接收消息的任務(wù)約定,某個(gè)指針指向的內容就是它們要傳送的消息,如發(fā)送消息用指針*Txmsg,而接收消息用指針*Rxmsg。這種消息傳送的過(guò)程與通過(guò)郵箱收發(fā)郵件頗為相似,故稱(chēng)消息郵箱,或簡(jiǎn)稱(chēng)郵箱。
為了在μC/OS-Ⅲ中使用郵箱,必須將OS_CFG.H文件中相應的配置常數置1。具體配置項如表1所示。
需要說(shuō)明的是,由于μC/OS-Ⅲ的郵箱管理必須有函數OSMboxCreate()和OSMboxPend()的參與,所以它們不能單獨被屏蔽掉。但從表1中可以看出,將OS_MBOX_EN選項置0即可屏蔽所有郵箱函數,當然也可以屏蔽OSMboxCreate()和OSMboxPend()函數。
評論