摘要: 為靈活、有效地在多任務(wù)程序設(shè)計中應(yīng)用μC/OS?Ⅲ操作系統(tǒng)中的郵箱,采用理論分析與實例實驗相結(jié)合的方法,得到基于μC/OS?Ⅲ操作系統(tǒng)的郵箱機制在全雙工任務(wù)間通信、二值信號量和充當延遲函數(shù)等方面的應(yīng)用技巧和方法。實驗表明,郵箱的靈活應(yīng)用不僅可以實現(xiàn)傳統(tǒng)的任務(wù)間數(shù)據(jù)通信, 還可以方便地替代互斥信號量和實現(xiàn)延時功能。
關(guān)鍵字: 嵌入式系統(tǒng); 任務(wù)間通信; μC/OS?Ⅲ; 郵箱
中圖分類號: TN311?34 文獻標識碼: A 文章編號: 1004?373X(2013)06?0042?03
0 引 言
嵌入式系統(tǒng)軟件通常由多個功能模塊構(gòu)成,而模塊的功能一般由基于嵌入式操作系統(tǒng)的任務(wù)來實現(xiàn)。在實際應(yīng)用中,常需要進行任務(wù)間通信來實現(xiàn)特定的功能,如變量的傳遞、資源的共享等,這就需要針對操作系統(tǒng)建立可靠的任務(wù)間通信,而郵箱是最常用的任務(wù)間通信機制之一[1?2]。本文基于μC/OS?Ⅲ嵌入式實時操作系統(tǒng)[3],研究了郵箱的使用和技巧,不僅探討了郵箱在傳統(tǒng)任務(wù)間通信和數(shù)據(jù)的傳遞中的應(yīng)用,還通過實例研究了郵箱在二值信號量和實現(xiàn)延時功能中的靈活應(yīng)用。
1 μC/OS?Ⅲ簡介
2 任務(wù)間通信與郵箱的應(yīng)用
由于嵌入式系統(tǒng)軟件通常由基于操作系統(tǒng)的若干個任務(wù)實現(xiàn),因此,不可避免的需要任務(wù)之間或中斷服務(wù)子程序與任務(wù)間的通信,這種信息傳遞機制稱為任務(wù)間的通信。μC/OS?Ⅲ任務(wù)間的通信可以通過共享內(nèi)存、信號量、任務(wù)內(nèi)建消息隊列、外部消息隊列、事件標志組實現(xiàn)。共享內(nèi)存方式使用全局變量或緩存,對大型而復(fù)雜的程序,多個任務(wù)同時對一個變量進行讀寫操作會引起沖突或緩存區(qū)的溢出,因此共享內(nèi)存用于共享一些對數(shù)據(jù)安全性不高的通用數(shù)據(jù)。信號量的通信模型雖然可以很好地起到互斥的作用,但在多個任務(wù)同時與某一任務(wù)通信是就會產(chǎn)生對信號量的競爭,引起通信發(fā)起端的排隊,降低系統(tǒng)的效率。任務(wù)內(nèi)建消息隊列一般用于接收少量消息(如中斷服務(wù)程序發(fā)送過來的消息)、外部消息隊列主要面向于多個任務(wù)共同等待的消息,事件標志組則用于多個任務(wù)間的同步[6?7]。
總結(jié)來說,μC/OS?Ⅲ任務(wù)間通信有2個途徑:通過全局變量或發(fā)消息給另一個任務(wù)。用全局變量時,必須保證每個任務(wù)或中斷服務(wù)子程序獨享該變量。中斷服務(wù)中保證獨享的惟一辦法是關(guān)中斷。如果2個任務(wù)共享某變量,各任務(wù)實現(xiàn)獨享該變量的辦法可以使關(guān)中斷,再開中斷,或使用信號量。需要注意的是,任務(wù)只能通過全局變量與中斷服務(wù)子程序通信,而任務(wù)并不知道什么時候全局變量被中斷服務(wù)子程序修改了,除非中斷服務(wù)子程序以信號量方式向任務(wù)發(fā)信號,或者是該任務(wù)以查詢方式不斷周期地查詢變量的值。這樣就不可避免地給程序設(shè)計帶來了一定的難度,為避免這種情況,常用的解決方法是采用郵箱[1]。
典型的消息郵箱(Message Mail Box)也稱作交換消息,即用一個指針型變量,一個任務(wù)或一個中斷服務(wù)子程序通過內(nèi)核,可以把一則消息(一個指針)放到郵箱中。同樣,一個或多個任務(wù)通過內(nèi)核,可以接收這則消息。發(fā)送消息的任務(wù)和接收消息的任務(wù)約定,某個指針指向的內(nèi)容就是它們要傳送的消息,如發(fā)送消息用指針*Txmsg,而接收消息用指針*Rxmsg。這種消息傳送的過程與通過郵箱收發(fā)郵件頗為相似,故稱消息郵箱,或簡稱郵箱。
下述代碼給出了2個郵箱TxMbox和RxMbox的建立方法,同時TaskOne和TaskTwo兩個任務(wù)使用郵箱實現(xiàn)了全雙工的應(yīng)答式通信。
從代碼可以看出,使用內(nèi)核提供的郵箱服務(wù)實現(xiàn)任務(wù)間通信方便、簡單,這也是郵箱作為任務(wù)間通信最常用手段的原因。此外,在實際應(yīng)用中,通過分析郵箱的功能特點,還可以將其應(yīng)用到其他場合以實現(xiàn)一些靈活的功能。
3 郵箱的靈活應(yīng)用
3.1 用郵箱作為二值信號量
4 結(jié) 語
本文基于嵌入式操作系統(tǒng)μC/OS?Ⅲ探討了郵箱在任務(wù)間通信中的應(yīng)用方法及注意事項,分析了各郵箱函數(shù)的關(guān)系及使能/屏蔽方法,并給出示例實現(xiàn)2個任務(wù)的全雙工通信;在此基礎(chǔ)上,還研究了郵箱在二值信號量和延時功能中的靈活應(yīng)用,并給出實例代碼驗證,這在嵌入式系統(tǒng)開發(fā)過程中有一定的參考價值。
參考文獻
[1] 張皓,伍云,周志杰.基于VxWorks的任務(wù)間通信模型設(shè)計[J].計算機工程,2007(2):131?135.
[2] 曾蜀芳,郭兵,沈艷.統(tǒng)一優(yōu)先級軟/硬件任務(wù)協(xié)同調(diào)度下的任務(wù)間通信機制[J].單片機與嵌入式系統(tǒng)應(yīng)用,2009(4):21?24.
[3] LABROSSE J J, TORRES Freddy. μC/OS?Ⅲ: the real?time kernel for the NXP LPC1700 [M]. [S.l.]: Micrium, 2010.
[4] 李承創(chuàng),陳躍斌.μC/OS?Ⅲ在Cortex?M3處理器上的移植[J].昆明冶金高等專科學校學報,2012,28(1):37?40.
[5] 邵貝貝.淺談μC/OS 任務(wù)調(diào)度算法的硬件實現(xiàn)[J].單片機與嵌入式系統(tǒng)應(yīng)用,2010(9):5?7.
[6] 屈環(huán)宇,陳麗萍.μC/OS?Ⅲ任務(wù)間通信的研究[J].電腦知識與技術(shù),2012(1):306?309.
[7] 邵貝貝.嵌入式操作系統(tǒng)μC/OS?Ⅲ[EB/OL].[2011?08?30].http://www.hqew.com/tech/news/373642.html.