国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

uC/OS—III外建消息隊(duì)列及任務(wù)內(nèi)建消息隊(duì)列深度解析

2013-12-29 00:00:00屈環(huán)宇陳麗萍唐曉媚
電腦知識與技術(shù) 2013年4期

摘要:在uC/OS-II的基礎(chǔ)上,uC/OS-III對消息隊(duì)列做了較大的改進(jìn),并新增一項(xiàng)特有的功能:任務(wù)內(nèi)建消息隊(duì)列。任務(wù)內(nèi)建消息隊(duì)列不僅可以降低消息隊(duì)列占用的存儲空間、提高消息與任務(wù)間的通信效率,還能實(shí)現(xiàn)消息與任務(wù)的相互一一對應(yīng),從而保證了系統(tǒng)的健壯性。

關(guān)鍵詞:消息隊(duì)列;任務(wù)內(nèi)建消息隊(duì)列;嵌入式操作系統(tǒng)

中圖分類號:TP313 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2013)04-0908-03

Depth Analysis Of uC/OS-III's Message Queue and Task Built-in Message Queue

QU Huan-yu,CHEN Li-ping, TANG Xiao-mei

(School of Mathematics,Physics and Informaiton Engineering, Jiaxing University,Jiaxing 314001,China)

Abstract: On the basis of uC/OS-II, uC/OS-III has made a great improvement on it's message queue function,and add a unique function: the task built-in message queue.Task built-in message queue can not only reduce the occupancy storage space of message queue、improve the communication efficiency of messages and tasks, but also can realize one-to-one correspondence between tasks and messages,ensure the system's robustness

Key words: message queues;task built-in message queue;embedded operation system

多任務(wù)調(diào)度系統(tǒng)中,任務(wù)間互相通信的方法可以是共享全局變量、共享內(nèi)存、信號量等。但若要區(qū)分任務(wù)對通信數(shù)據(jù)占有的優(yōu)先級、實(shí)現(xiàn)通信數(shù)據(jù)的臨界性操作、支配通信數(shù)據(jù)的可訪問次數(shù)等更為高級的應(yīng)用,就必須依靠消息隊(duì)列這一媒介。

uC/OS-III的非必須功能均具有可裁剪性,用戶需在OS_CFG.H文件中設(shè)置OS_CFG_TASK_Q_EN為1,任務(wù)內(nèi)建消息隊(duì)列才會被分配到任務(wù)控制塊中,否則任務(wù)內(nèi)建消息隊(duì)列部分就會被裁剪而失效。

1 uC/OS-III 消息隊(duì)列的結(jié)構(gòu)

1.1 外建消息隊(duì)列

外建消息隊(duì)列主要由五個(gè)部分組成:

struct os_q {

OS_OBJ_TYPE Type; //結(jié)構(gòu)體標(biāo)識部分

CPU_CHAR *NamePtr; //消息隊(duì)列命名部分

OS_PEND_LIST PendList; //消息掛起部分

#if OS_CFG_DBG_EN > 0u //功能調(diào)試部分

OS_Q *DbgPrevPtr;

OS_Q *DbgNextPtr;

CPU_CHAR *DbgNamePtr;

#endif

OS_MSG_Q MsgQ; }; //消息存儲部分

1)結(jié)構(gòu)體標(biāo)識部分:存放消息隊(duì)列的標(biāo)識數(shù)據(jù),是操作系統(tǒng)識別此結(jié)構(gòu)體為消息隊(duì)列的依據(jù) 。

2)消息隊(duì)列命名部分:存放該消息隊(duì)列的名字,可直接訪問該地址并查看該隊(duì)列名字相對應(yīng)的ASCII碼或者通過uC/Probe查看其相對應(yīng)的字符串。該命名功能主要應(yīng)用于產(chǎn)品設(shè)計(jì)時(shí)的調(diào)試,區(qū)分各個(gè)消息隊(duì)列。

3)消息掛起部分:該部分由指針HeadPtr、TailPtr和計(jì)數(shù)變量NbrEntries組成,指針指向的是內(nèi)建于任務(wù)控制塊的os_pend_data結(jié)構(gòu)體,多個(gè)結(jié)構(gòu)體與上述兩個(gè)指針一起構(gòu)成了消息掛起隊(duì)列,等待該消息的任務(wù)都以鏈的形式存放在該隊(duì)列中。

當(dāng)任務(wù)被添加進(jìn)掛起隊(duì)列中,uC/OS-III會根據(jù)該任務(wù)的優(yōu)先級、相等優(yōu)先級時(shí)依據(jù)添加順序進(jìn)行重新排列,以保證當(dāng)消息到來時(shí)最先獲得消息的是隊(duì)列中優(yōu)先級最高的任務(wù)。計(jì)數(shù)變量記錄了當(dāng)前該掛起隊(duì)列中所存放的任務(wù)個(gè)數(shù)。

4)功能調(diào)試部分:當(dāng)配置宏OS_CFG_DBG_EN為1時(shí),便使能了uC/OS-III提供的專用于調(diào)試的代碼,其作用是將所有的內(nèi)建和外建消息隊(duì)列按照創(chuàng)建時(shí)的順序以隊(duì)列的形式展現(xiàn)給用戶,方便用戶調(diào)試時(shí)查看所有消息隊(duì)列及其數(shù)據(jù)。

5)消息存儲部分:該部分由指針I(yè)nPtr、OutPtr和計(jì)數(shù)變量NbrEntriesSize、NbrEntries、NbrEntriesMax組成。指針I(yè)nPtr、OutPtr指向的是os_msg消息結(jié)構(gòu)體,多個(gè)該類型結(jié)構(gòu)體與上述兩指針一起構(gòu)成了消息存儲隊(duì)列,該隊(duì)列為環(huán)形隊(duì)列,環(huán)的大小為NbrEntriesSize所設(shè)置的數(shù)值。

當(dāng)消息掛起隊(duì)列中無任務(wù)被掛起時(shí),被提交的消息會存儲在消息存儲隊(duì)列中直到該隊(duì)列所允許的上限后,被提交的消息將不能再存儲進(jìn)該消息存儲隊(duì)列中,此時(shí),欲提交該消息的函數(shù)會返回相應(yīng)的錯(cuò)誤代號以告知用戶該消息隊(duì)列存儲消息已滿,該消息將溢出。

變量NbrEntriesSize記錄了該隊(duì)列存放消息的上限個(gè)數(shù),變量NbrEntries記錄了該隊(duì)列當(dāng)前時(shí)刻存放的消息數(shù),變量NbrEntriesSizeMax記錄了到當(dāng)前時(shí)刻為止該隊(duì)列存放消息數(shù)的峰值。

1.2任務(wù)內(nèi)建消息隊(duì)列

內(nèi)建的消息隊(duì)列僅包括上述的消息存儲部分。

在uC/OS-II中,消息隊(duì)列均為外建消息隊(duì)列,可實(shí)現(xiàn)任務(wù)間的互相通信,中斷服務(wù)程序ISR對消息隊(duì)列的通信(注意這是單向的,ISR不能被掛起等待消息,否則會因?yàn)檎{(diào)度的混亂而導(dǎo)致系統(tǒng)崩潰)。

考慮到某些應(yīng)用中一種消息只為一個(gè)任務(wù)服務(wù)等簡單的通信操作時(shí),沒必要再為這個(gè)任務(wù)創(chuàng)建單獨(dú)的一個(gè)外建消息隊(duì)列,因而在uC/OS-III中新添了任務(wù)內(nèi)建消息隊(duì)列的功能。內(nèi)建的消息隊(duì)列僅包括上述的消息存儲部分,不僅降低的存儲空間的要求,同時(shí)也使消息能直接傳遞給任務(wù)而無需通過外建消息隊(duì)列等媒介,提高了實(shí)時(shí)系統(tǒng)的效率。

2 消息隊(duì)列接口函數(shù)

2.1外建消息隊(duì)列的接口函數(shù)

uC/OS-III為外建消息隊(duì)列提供了6個(gè)接口函數(shù),如圖3所示,任務(wù)可以通過接口函數(shù)往消息隊(duì)列中發(fā)送消息、接收消息。但中斷服務(wù)程序卻只能往消息隊(duì)列中發(fā)送數(shù)據(jù),這是因?yàn)槿糁袛喾?wù)程序等待消息的到來,那么此中斷嵌套將一直被掛起,CPU不能夠繞過此中斷嵌套以恢復(fù)該中斷前的狀態(tài),從而導(dǎo)致系統(tǒng)的崩潰。

OSQCreate():用于創(chuàng)建外建消息隊(duì)列,調(diào)用該函數(shù)前必須定義一個(gè)消息隊(duì)列的結(jié)構(gòu)體,并將該結(jié)構(gòu)體的地址作為參數(shù)傳遞給該函數(shù),該函數(shù)的參數(shù)同時(shí)也定義了消息隊(duì)列所能存放的消息數(shù)。

OSQDel():用于刪除不再使用的消息隊(duì)列,使用該函數(shù)時(shí)需非常謹(jǐn)慎,最好是先刪除與該消息隊(duì)列相關(guān)的所有任務(wù),或者事先解除那些任務(wù)與該消息隊(duì)列間的聯(lián)系,不然會導(dǎo)致這些任務(wù)的失效。如果失效的任務(wù)是系統(tǒng)或應(yīng)用中的關(guān)鍵任務(wù),后果將不堪設(shè)想,因此,使用該函數(shù)時(shí)應(yīng)當(dāng)非常慎重。

OSQFlush():清空該消息隊(duì)列中的所有消息,該功能主要用于批量的消息更替,比如ISR從串口接收到一系列的新數(shù)據(jù)需更替掉原先的舊數(shù)據(jù)時(shí),該函數(shù)相當(dāng)有效。

OSQPend():任務(wù)調(diào)用該函數(shù)后將被掛起,有兩種掛起方式,OS_OPT_PEND_BLOCKING方式:消息隊(duì)列中沒有消息時(shí),任務(wù)等待直到消息隊(duì)列中有消息分配給它或者所設(shè)定的等待期限滿而該函數(shù)返回個(gè)錯(cuò)誤代號。OS_OPT_PEND_NON_BLOCKING方式:消息隊(duì)列中沒有消息時(shí),任務(wù)不進(jìn)行等待,該函數(shù)直接返回個(gè)錯(cuò)誤代號。

該函數(shù)的其中一個(gè)重要參數(shù)是設(shè)置任務(wù)等待消息的時(shí)間期限,若超過這個(gè)時(shí)間期限任務(wù)也未能接收到其所等待的消息時(shí),函數(shù)便返回一個(gè)相應(yīng)的錯(cuò)誤代號。當(dāng)該參數(shù)設(shè)置為0時(shí),表示該任務(wù)永久地等待消息的到來。

OSQPendAbort():使該消息隊(duì)列中的等待任務(wù)取消掛起,有兩種取消方式,OS_OPT_PEND_ABORT_1:使該消息隊(duì)列中優(yōu)先級最高的一個(gè)任務(wù)取消掛起,OS_OPT_PEND_ABORT_ALL:該消息隊(duì)列中的所有任務(wù)均取消掛起。取消任務(wù)掛起后,uC/OS-III會自動執(zhí)行調(diào)度。若應(yīng)用中不需其在取消任務(wù)后實(shí)現(xiàn)調(diào)度,可在上述兩種方式后或操作宏OS_OPT_POST_NO_SCHED。

OSQPost():提交消息到對應(yīng)的消息隊(duì)列,消息的提交方式有三種,OS_OPT_POST_FIFO:先進(jìn)先出方式,OS_OPT_POST_LIFO:后進(jìn)先出方式,OS_OPT_POST_ALL:該消息將傳遞給所有在消息隊(duì)列中掛起的任務(wù)。同樣,或操作宏OS_OPT_POST_NO_SCHED可避免調(diào)度。

該函數(shù)的另外兩個(gè)關(guān)鍵參數(shù)是所要被傳輸消息數(shù)據(jù)的首地址及其數(shù)據(jù)的大小,數(shù)據(jù)的大小以字節(jié)為單位。

在此需說明的技巧是:當(dāng)同時(shí)提交多個(gè)消息時(shí),可先失能提交后的調(diào)度,待到最后一個(gè)消息被提交時(shí),再使能調(diào)度。從而避免了需提交幾個(gè)消息就得執(zhí)行幾次調(diào)度的尷尬局面,提高了系統(tǒng)的實(shí)時(shí)性。

2.2任務(wù)內(nèi)建消息隊(duì)列的接口函數(shù)

在uC/OS-III中,任務(wù)內(nèi)建消息隊(duì)列共有3個(gè)接口函數(shù),該3個(gè)函數(shù)幾乎是外建消息隊(duì)列接口函數(shù)的精簡版。

OSTaskQPend():任務(wù)調(diào)用該函數(shù)后被掛起,不同于外建消息隊(duì)列的是,任務(wù)被掛起的信息不是存放在消息隊(duì)列中,而是直接由uC/OS-III內(nèi)核直接管理。

OSTaskQPendAbort():調(diào)用該函數(shù)后任務(wù)被取消掛起,由于目標(biāo)任務(wù)為調(diào)用該函數(shù)的任務(wù)本身,取消方式僅為一種,OS_OPT_POST_NONE:取消該任務(wù)的掛起。同樣,或操作宏OS_OPT_POST_NO_SCHED可避免調(diào)度。

OSTaskQPost():提交消息到任務(wù)內(nèi)建消息隊(duì)列,消息的提交方式有兩種:OS_OPT_POST_FIFO,OS_OPT_POST_LIFO。同樣,或操作宏OS_OPT_POST_NO_SCHED可避免調(diào)度。

3 結(jié)束語

消息隊(duì)列為任務(wù)間提供了異步的通信協(xié)議,消息的發(fā)送者和接收者均可在適當(dāng)?shù)臅r(shí)候與消息進(jìn)行信息的交互。作為媒介,消息隊(duì)列傳遞的僅是數(shù)據(jù)的存放地址以及數(shù)據(jù)的大小,這使得信息的傳遞變得非常簡單、高效。

作為對時(shí)間要求非常嚴(yán)格的嵌入式實(shí)時(shí)系統(tǒng),uC/OS-III引入了任務(wù)內(nèi)建消息機(jī)制,降低了消息隊(duì)列占用的存儲空間、提高消息與任務(wù)間的通信效率、實(shí)現(xiàn)了消息與任務(wù)的相互對應(yīng),從而進(jìn)一步提高了系統(tǒng)的微型性、實(shí)時(shí)性和健壯性。

參考文獻(xiàn):

[1] 邵貝貝.嵌入式實(shí)時(shí)操作系統(tǒng)μC\OS-Ⅱ [M].北京:北京航空航天大學(xué)出版社,2003:56-89

[2] 王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)--基于ARM微處理器與uc/OS-II實(shí)時(shí)操作系統(tǒng)[M].北京:清華大學(xué)出版社,2003:103-135.

[3] 任哲.嵌入式操作系統(tǒng)基礎(chǔ)uc/os-II和Linux [M].北京:北京航空航天大學(xué)出版社,2006:52.

[4] Micrium Micrium-uCOS-III-UserManual [M] .R&D Books,2011.

安新县| 巍山| 沂水县| 赫章县| 吉首市| 平和县| 浪卡子县| 海丰县| 绥德县| 克东县| 屏山县| 屯门区| 阜宁县| 卢湾区| 兖州市| 鄯善县| 门头沟区| 霸州市| 西城区| 定日县| 兴山县| 宁津县| 阜新市| 汽车| 奉节县| 株洲市| 井陉县| 景洪市| 璧山县| 古交市| 青川县| 开鲁县| 玛多县| 维西| 齐齐哈尔市| 鲁甸县| 鄂托克前旗| 咸阳市| 府谷县| 北海市| 颍上县|