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