第5章消息管理_第1頁(yè)
第5章消息管理_第2頁(yè)
第5章消息管理_第3頁(yè)
第5章消息管理_第4頁(yè)
第5章消息管理_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式操作系統(tǒng)嵌入式操作系統(tǒng) 與程序設(shè)計(jì)與程序設(shè)計(jì) 第5章 消息管理 5.1 消息郵箱 5.1.1 建立消息郵箱 5.1.2等消息 5.1.3 發(fā)消息 5.1.4 刪除消息郵箱 5.1.5放棄郵箱等待 5.1.6 無(wú)等待請(qǐng)求消息 5.1.7查詢郵箱狀態(tài) 5.1.8 消息郵箱的例子 5.2 消息隊(duì)列 5.2.1 消息隊(duì)列數(shù)據(jù)結(jié)構(gòu) 5.2.2 初始化消息隊(duì)列 5.2.3 建立消息隊(duì)列 5.2.4發(fā)消息到消息隊(duì)列 5.2.5等待消息隊(duì)列中的消息 5.2.6刪除消息隊(duì)列 5.2.7取得消息隊(duì)列的狀態(tài) 5.2.8消息隊(duì)列應(yīng)用舉例 習(xí)題 在信號(hào)量、互斥信號(hào)量和事件標(biāo)志組的內(nèi)容 結(jié)束后,讀者對(duì)事件之間如何同

2、步,如何根 據(jù)不同需要設(shè)計(jì)同步程序,應(yīng)該有了深入的 理解和提高。本章的消息管理中包括消息郵 箱和消息隊(duì)列兩方面的內(nèi)容,適用于任務(wù)之 間的信息交流和同步。從原理上講,消息管 理也應(yīng)該屬于事件管理的范疇 。 5.1 消息郵箱消息郵箱 消息郵箱是C/OS-II中的另一種通信機(jī)制,可以使一個(gè)任務(wù)或 者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)消息。傳遞這個(gè)消息 的媒體是一個(gè)指針型變量,該指針指向一個(gè)包含了“消息”的 某種數(shù)據(jù)結(jié)構(gòu)。 5.1.1 建立消息郵箱建立消息郵箱 在系統(tǒng)初始化之后,并不存在一個(gè)消息郵箱。這時(shí)操作系統(tǒng)中的事件管理數(shù) 據(jù)結(jié)構(gòu)事件控制塊ECB為全空,所有的事件控制塊都在ECB空閑鏈表中 排隊(duì)。

3、消息郵箱的建立函數(shù)OSMboxCreate將使用一個(gè)并配置一個(gè)ECB, 使其具備消息郵箱的屬性。 表5.2創(chuàng)建信號(hào)量函數(shù)OSMboxCreate解析 1.檢查是否這中斷服務(wù)程序中創(chuàng)建消息郵箱。 同不允許在中斷服務(wù)程序中創(chuàng)建信號(hào)量一樣,操作系統(tǒng)C/OS-II同樣不允許 在中斷服務(wù)程序中創(chuàng)建消息郵箱。 2.檢查是否有空閑的事件控制塊。 將OSEventFreeList賦值給pevent,如果pevent為空指針,表示沒有空閑的 事件控制塊,函數(shù)返回。 3.在事件控制塊空閑鏈表中取下表頭。 因?yàn)閜event現(xiàn)在已經(jīng)是用于郵箱的事件控制塊,讀者可以直接把他理解為一 個(gè)郵箱。那么,需要執(zhí)行的操作顯然就是

4、在事件控制塊空閑鏈表中將他 刪除,這時(shí)候OSEventFreeList應(yīng)該指向第二個(gè)ECB。 4.對(duì)事件控制塊賦值 假設(shè)信號(hào)量值為5,則賦值后的ECB應(yīng)該如圖5-1所示 5.返回ECB地址。 5.1.2等消息等消息 等消息也稱為請(qǐng)求消息。含義是當(dāng)消息存在的時(shí)候獲取消息,等消息也稱為請(qǐng)求消息。含義是當(dāng)消息存在的時(shí)候獲取消息, 當(dāng)消息不存在的時(shí)候就放棄對(duì)當(dāng)消息不存在的時(shí)候就放棄對(duì)CPU的占有,直到有消息的時(shí)的占有,直到有消息的時(shí) 候才被喚醒。當(dāng)任務(wù)后續(xù)的操作離不開消息,這時(shí)任務(wù)就不該候才被喚醒。當(dāng)任務(wù)后續(xù)的操作離不開消息,這時(shí)任務(wù)就不該 死死占著死死占著CPU不讓其他的任務(wù)運(yùn)行,就應(yīng)該去休息,而當(dāng)

5、消不讓其他的任務(wù)運(yùn)行,就應(yīng)該去休息,而當(dāng)消 息到來(lái)的時(shí)候系統(tǒng)會(huì)將消息喚醒回就緒態(tài),任務(wù)獲得消息后繼息到來(lái)的時(shí)候系統(tǒng)會(huì)將消息喚醒回就緒態(tài),任務(wù)獲得消息后繼 續(xù)運(yùn)行。續(xù)運(yùn)行。 表5.3等待消息郵箱函數(shù)OSMboxPend解析 開開始始 返返回回 參參數(shù)數(shù)檢檢查查是是否否通通 過(guò)過(guò) 是是 是 否否 p pm ms sg g是是否否 不不為為空空 否 置置位位O OS ST TC CB BS St ta at t中中 等等待待消消息息標(biāo)標(biāo)志志 調(diào)調(diào)用用 O OS S_ _E Ev ve en nt tT Ta as sk kW Wa ai it t終終 止止當(dāng)當(dāng)前前任任務(wù)務(wù),E EC CB B事事件件

6、 表表中中添添加加當(dāng)當(dāng)前前任任務(wù)務(wù) 執(zhí)執(zhí)行行一一次次任任務(wù)務(wù)調(diào)調(diào)度度 存存儲(chǔ)儲(chǔ)超超時(shí)時(shí)時(shí)時(shí)間間到到 O OS ST TC CB BD Dl ly y 及及等等待待狀狀 況況OSTCBStatPend 否 這這里里任任務(wù)務(wù) 又又一一次次被被調(diào)調(diào)度度 了了!從從阻阻塞塞態(tài)態(tài)回回 到到就就緒緒態(tài)態(tài)又又被被調(diào)調(diào) 度度 這這里里任任務(wù)務(wù)被被 剝剝奪奪了了C CP PU U! 進(jìn)進(jìn)入入阻阻塞塞態(tài)態(tài)! 等等待待標(biāo)標(biāo)志志 是是否否有有效效 是 如如果果是是資資源源滿滿足足而而 結(jié)結(jié)束束等等待待,只只需需要要 設(shè)設(shè)置置任任務(wù)務(wù)塊塊的的E EC CB B 指指針針為為空空 返返回回值值設(shè)設(shè)置置為為 O OS S_

7、 _T TI IM ME EO OU UT T任任務(wù)務(wù)仍仍 不不能能使使用用資資源源 是 返返回回值值設(shè)設(shè)置置為為 O OS S_ _N NO O_ _E ER RR R任任務(wù)務(wù)可可 使使用用資資源源 p pe er rr r中中填填寫寫對(duì)對(duì) 應(yīng)應(yīng)的的出出錯(cuò)錯(cuò)信信息息 是是 將將郵郵箱箱中中的的消消息息 地地址址送送p pm ms sg g 是是否否是是等等待待 超超時(shí)時(shí) 調(diào)調(diào)用用O OS S_ _E Ev ve en nt tT Ta as sk kR Re em mo ov ve e 清清除除任任務(wù)務(wù)塊塊相相關(guān)關(guān)等等待待標(biāo)標(biāo)志志 和和任任務(wù)務(wù)塊塊O OS ST TC CB BS St ta

8、 at t 清清除除任任務(wù)務(wù)塊塊相相關(guān)關(guān)等等待待標(biāo)標(biāo)志志 返返回回值值設(shè)設(shè)置置為為 O OS S_ _E ER RR R_ _P PE EN ND D_ _A AB BO OR RT T任任務(wù)務(wù)仍仍 不不能能使使用用資資源源 否 5.1.3 發(fā)消息發(fā)消息 當(dāng)一個(gè)任務(wù)因?yàn)榈却⒍蛔枞臅r(shí)候,只有當(dāng)其他 任務(wù)發(fā)出了消息,被阻塞的任務(wù)才能被恢復(fù)到就緒態(tài), 從而獲得消息后繼續(xù)運(yùn)行。阻塞的函數(shù)在前一節(jié)分析過(guò) 了,發(fā)消息的函數(shù)為OSMboxPost,參數(shù)是消息類型的 ECB的指針,以及消息的地址。 表5.4發(fā)消息函數(shù)OSMboxPost解析 開開始始 返返回回 參參數(shù)數(shù)檢檢查查 是是否否通通過(guò)過(guò) 否

9、否否 將將消消息息放放入入郵郵箱箱 是是 是是否否有有任任務(wù)務(wù)等等待待 該該信信號(hào)號(hào)量量 是 調(diào)調(diào)用用 O OS S_ _E Ev ve en nt tT Ta as sk kR Rd dy y 使使等等待待該該消消息息的的 最最高高優(yōu)優(yōu)先先級(jí)級(jí)任任務(wù)務(wù) 就就緒緒 執(zhí)執(zhí)行行一一次次任任務(wù)務(wù)調(diào)調(diào)度度 返返回回值值進(jìn)進(jìn)行行相相 應(yīng)應(yīng)設(shè)設(shè)置置,提提示示 出出錯(cuò)錯(cuò) 返返回回值值設(shè)設(shè)置置為為 O OS S_ _N NO O_ _E ER RR R 郵郵箱箱是是否否是是滿滿的的 否 返返回回值值設(shè)設(shè)置置為為或或 O OS S_ _N NO O_ _E ER RR R 是 返返回回值值設(shè)設(shè)置置為為 O OS

10、 S_ _E ER RR R_ _M MB BO OX X _ _F FU UL LL L 5.1.4 刪除消息郵箱刪除消息郵箱 當(dāng)消息郵箱不再使用了,就應(yīng)該盡快歸還給系統(tǒng),即將消息占 用的ECB歸還給ECB空閑鏈表以備它用。消息郵箱的刪除函數(shù) 是OSMboxDel。刪除一個(gè)消息也要涉及方方面面,因?yàn)榭赡?有任務(wù)正在等待這個(gè)郵箱中的消息。 表5.5刪除消息郵箱的函數(shù)OSMboxDel解析 開開始始 返返回回 參參數(shù)數(shù)檢檢查查 是是否否通通過(guò)過(guò) 若若有有任任務(wù)務(wù)等等待待該該郵郵箱箱 T Ta as sk ks s_ _w wa ai it ti in ng g= =T TR RU UE E 否否

11、則則為為F FA AL LS SE E 是是 OS_DEL_NO_PEND 其其他他值值 否否 設(shè)設(shè)置置該該E EC CB B屬屬性性為為 未未用用 空空閑閑E EC CB B鏈鏈表表表表頭頭 插插入入該該E EC CB B 無(wú)無(wú)任任務(wù)務(wù)等等待待 該該郵郵箱箱? ? 根根據(jù)據(jù)o op pt t值值進(jìn)進(jìn)行行 分分支支轉(zhuǎn)轉(zhuǎn)移移 是 否否 OS_DEL_ALWAYS 使使所所有有的的等等待待該該 信信號(hào)號(hào)量量的的任任務(wù)務(wù)就就 緒緒 設(shè)設(shè)置置該該E EC CB B屬屬性性為為 未未用用 空空閑閑E EC CB B鏈鏈表表表表頭頭 插插入入該該E EC CB B 若若有有任任務(wù)務(wù)等等待待該該 信信號(hào)號(hào)量

12、量執(zhí)執(zhí)行行一一次次 任任務(wù)務(wù)調(diào)調(diào)度度 5.1.5放棄郵箱等待放棄郵箱等待 同放棄對(duì)信號(hào)量的等待類似,放棄等待郵箱也絕對(duì)不會(huì)是放棄本任務(wù)對(duì)郵箱 的等待。放棄等待郵箱函數(shù)將放棄的是所有等待某郵箱的任務(wù)對(duì)該郵箱 的等待或等待某郵箱的優(yōu)先級(jí)最高的任務(wù)對(duì)郵箱的等待。 表5.6放棄等待郵箱函數(shù)OSMboxPendAbort解析 流程如下: 1.檢查事件控制塊指針是否有效及事件控制塊類型是否有效。 2.如果pevent-OSEventGrp為0說(shuō)明沒有任務(wù)等待消息郵箱,取消等待的任 務(wù)數(shù)是0,返回0。 3.否則根據(jù)參數(shù)opt(選項(xiàng))進(jìn)行分支轉(zhuǎn)移,如為 OS_PEND_OPT_BROADCAST,使用whil

13、e語(yǔ)句循環(huán)地將等待該郵箱的 每個(gè)任務(wù)用OS_EventTaskRdy來(lái)取消等待并使其就緒(除非任務(wù)還被掛 起);如果為其他值則只將最高優(yōu)先級(jí)的任務(wù)取消等待并就緒之。 4.返回取消等待信號(hào)量的任務(wù)數(shù)。 5.1.6 無(wú)等待請(qǐng)求消息無(wú)等待請(qǐng)求消息 在中斷服務(wù)程序和有些用戶任務(wù)中,需要無(wú)等待的請(qǐng)求消息 郵箱。也就是說(shuō),到郵箱中取郵件,如果有郵件就獲得郵件, 如果沒有并不阻塞自己,而是繼續(xù)執(zhí)行其他代碼。 OSMboxAccept就是無(wú)等待的請(qǐng)求消息郵箱函數(shù),參數(shù)是請(qǐng)求 的消息郵箱的ECB指針。該函數(shù)的返回值是指向郵箱的指針, 如果沒有取得消息,那么就返回空指針。 表5.7無(wú)等待地請(qǐng)求消息郵箱函數(shù)OSMb

14、oxAccept解析 首先參數(shù)檢查ECB是否有效,如果有效,將消息郵箱中郵件 的地址OSEventPtr賦值給pmsg,然后清郵箱內(nèi)容,返回獲得的 郵件的地址pmsg。這樣,如果郵箱中有郵件,那么返回郵件的 地址,如果沒有,返回值就是空地址。 5.1.7查詢郵箱狀態(tài)查詢郵箱狀態(tài) 消息郵箱狀態(tài)查詢函數(shù)OSMboxQuery的參數(shù)是ECB地址和 一個(gè)指向OS_MBOX_DATA類型的地址。ECB地址指向郵箱, OS_MBOX_DATA類型的地址指向返回結(jié)果的一個(gè) S_MBOX_DATA類型的對(duì)象。 表5.9查詢消息郵箱狀態(tài)函數(shù)OSMboxQuery解析 Example5_1: task1任務(wù)每任務(wù)

15、每1秒記錄運(yùn)行次數(shù),發(fā)送到消息郵箱;秒記錄運(yùn)行次數(shù),發(fā)送到消息郵箱; task2任務(wù)每任務(wù)每1秒從消息郵箱接收消息并打印。秒從消息郵箱接收消息并打印。 消息郵箱例程消息郵箱例程 5.1.8 消息郵箱的例子消息郵箱的例子 假設(shè)有任務(wù)TaskMessageSen和TaskMessageRec, TaskMessageSen在事件片1創(chuàng) 建一個(gè)郵箱,如果郵箱中已沒有郵件,每秒向郵箱發(fā)送一個(gè)消息,消息內(nèi)容為從0 開始的計(jì)數(shù)值,該計(jì)數(shù)值每秒加1。任務(wù)TaskMessageRec從時(shí)間1開始,做的事情 就是查看郵箱,然后把郵件打印出來(lái)。 現(xiàn)在我們采用郵件管理完成這兩個(gè)任務(wù)的設(shè)計(jì)。 5.2 消息隊(duì)列消息隊(duì)列

16、 消息郵箱中只能存放一則消息,太少了,能不能像電子郵件一樣,管理多 條消息呢? C/OS為實(shí)現(xiàn)這一目的,設(shè)計(jì)了消息隊(duì)列管理。使用消息隊(duì)列管理,就允 許使用可以容納多條信息的大郵箱,按照先進(jìn)先出(FIFO)的原則,發(fā)送和 接收郵件。需要注意的是,這樣的郵箱不是操作系統(tǒng)提供的,而是要由用戶 任務(wù)來(lái)提供。操作系統(tǒng)提供的是對(duì)其進(jìn)行管理的程序。另外,郵箱中的內(nèi)容 仍然是郵件的地址。 消息隊(duì)列的代碼單獨(dú)存放在os_q.c中 5.2.1 消息隊(duì)列數(shù)據(jù)結(jié)構(gòu)消息隊(duì)列數(shù)據(jù)結(jié)構(gòu) 1消息隊(duì)列及其控制塊消息隊(duì)列及其控制塊 typedef struct os_q /* 隊(duì)列控制塊隊(duì)列控制塊QCB*/ struct os_

17、q *OSQPtr; /*在空閑在空閑QCB鏈表中,指示下一個(gè)鏈表中,指示下一個(gè)QCB*/ void *OSQStart; /*隊(duì)列數(shù)據(jù)的首地址隊(duì)列數(shù)據(jù)的首地址*/ void *OSQEnd; /*隊(duì)列數(shù)據(jù)的末地址隊(duì)列數(shù)據(jù)的末地址*/ void *OSQIn; /*指示下次插入消息的位置指示下次插入消息的位置 */ void *OSQOut; /* 指示下次提取消息的位置指示下次提取消息的位置*/ INT16U OSQSize; /*隊(duì)列的最大容量隊(duì)列的最大容量*/ INT16U OSQEntries; /*隊(duì)列中當(dāng)前的消息量隊(duì)列中當(dāng)前的消息量*/ OS_Q; 2消息控制塊實(shí)體消息控制塊實(shí)體

18、OS_Q OSQTblOS_MAX_QS; 3空閑消息隊(duì)列鏈表 消息控制塊QCB中OSQWaitList用來(lái)指示空閑消息控制塊QCB鏈表中的下一個(gè)消息 控制塊QCB。 5.2.2 初始化消息隊(duì)列初始化消息隊(duì)列 消息隊(duì)列初始化函數(shù)在操作系統(tǒng)初始化時(shí)被調(diào)用,主要用于 初始化消息隊(duì)列使用的數(shù)據(jù)結(jié)構(gòu)。消息隊(duì)列初始化函數(shù)的名稱 為OS_QInit 表5.13消息隊(duì)列初始化函數(shù)OS_QInit解析 1. 將所有QCB全部清為全0。 2. 使用for循環(huán)將除最后一個(gè)消息控制塊 OSQTblOS_MAX_QS - 1之外的所有消息控制塊初始化,構(gòu) 建了單向的消息隊(duì)列空閑鏈表。 3.初始化最后一個(gè)QCB,將消息

19、隊(duì)列空閑鏈表完善。 5.2.3 建立消息隊(duì)列建立消息隊(duì)列 創(chuàng)建消息隊(duì)列就是將從ECB空閑鏈表中取下一個(gè)事件控制塊ECB來(lái),將其用于 消息隊(duì)列管理。并從QCB空閑鏈表的表頭取下一個(gè)消息控制塊QCB,將其各種屬 性進(jìn)行設(shè)置,用于指示消息的位置以及提取和插入消息的位置。 創(chuàng)建消息隊(duì)列的函數(shù)名稱為OSQCreate。 表5.14消息隊(duì)列創(chuàng)建函數(shù)OSQCreate分析 1. 判斷是否在中斷服務(wù)程序中調(diào)用本函數(shù),如果是就返回。 2. 取得消息隊(duì)列的鏈表首地址送pevent。 3. 判斷pevent是否為空指針,如果是則說(shuō)明是系統(tǒng)已經(jīng)沒有空閑的ECB可供使用, 填寫錯(cuò)誤信息,返回空指針。 4. 從空閑ECB

20、鏈表取下表頭。 5. 空閑QCB鏈表首地址送pq。 6. 如果沒有有效的空閑QCB鏈表,恢復(fù)空閑ECB鏈表,返回空ECB指針。 7. 在空閑QCB鏈表中取一個(gè)pq指向的QCB,對(duì)其進(jìn)行初始化。設(shè)置OSQStart為消息 指針數(shù)組的首地址start。OSQEnd值為&startsize即消息指針數(shù)組(消息隊(duì)列)中 最后一個(gè)指針后面的一個(gè)地址。OSQIn和OSQOut也設(shè)置為start。OSQSize的值為 size。OSQEntries為0表示該隊(duì)列中還沒有消息。 8. 接下來(lái)對(duì)pevent指向的ECB進(jìn)行初始化。OSEventType為OS_EVENT_TYPE_Q 表示用于消息隊(duì)列管理。OS

21、EventCnt在這里沒有用,設(shè)置為0。OSEventPtr指向 QCB,即設(shè)置為pq。調(diào)用OS_EventWaitListInit初始化ECB中的事件等待表和事件等 待組。 9.返回ECB指針。 5.2.4發(fā)消息到消息隊(duì)列發(fā)消息到消息隊(duì)列 發(fā)消息到消息隊(duì)列的函數(shù)名稱為OSQPost。參數(shù)是事件控制塊ECB的地 址pevent和消息的地址pmsg。 表5.15發(fā)消息到消息對(duì)列函數(shù)OSQPost分析 1.首先進(jìn)行參數(shù)檢查,如果參數(shù)檢查失敗則返回。 2. 如果有任務(wù)等待消息隊(duì)列中的消息,那么消息隊(duì)列現(xiàn)在必然是空的。不 需要將消息存入隊(duì)列,而直接將消息給在等待的優(yōu)先級(jí)最高的消息,并將 其就緒。執(zhí)行一

22、次任務(wù)調(diào)度然后返回。 3. 如果沒有任務(wù)等待消息隊(duì)列中的消息,那么就需要將該消息加入消息隊(duì) 列。如果消息隊(duì)列是滿的,不能容納更多的消息,返回出錯(cuò)信息。否則, 在消息控制塊QCB的OSQIn所指示的消息指針數(shù)組位置存入該消息,然后 將OSQIn 指向下一個(gè)單元以便下次使用。判斷OSQIn是否到超過(guò)了表尾, 如果超過(guò)了,將其指向隊(duì)首。然后返回。 5.2.5等待消息隊(duì)列中的消息等待消息隊(duì)列中的消息 等待消息隊(duì)列的消息是消息隊(duì)列管理中的又一核心函數(shù)。如果消息隊(duì)列中有消息, 那么就取出消息,然后返回;如果沒有消息,只有在ECB中標(biāo)記自己的等待,然后 阻塞。 等待消息隊(duì)列的函數(shù)的名稱為OSQPend,參數(shù)

23、是ECB的指針、等待超時(shí)時(shí)間和返 回函數(shù)執(zhí)行信息的指針的perr。函數(shù)的返回值是指向消息的指針。 表5.16消息隊(duì)列等待函數(shù)OSQPend分析 1.首先進(jìn)行參數(shù)、ECB類型、中斷、調(diào)度鎖檢查,失敗則返回。 2. 取得ECB中的QCB指針,查詢消息隊(duì)列中是否有消息。如果有消息,那么請(qǐng)求 直接成功,取得消息隊(duì)列中OSQOut所指的消息,將OSQOut指向消息隊(duì)列中的下 一個(gè)元素以備下一次的消息提取。如果OSQOut指向了消息隊(duì)列之外,就指向消息 隊(duì)列的首地址。將OSQEntries減1表示消息數(shù)量減少了一個(gè)。然后返回消息的指針。 3. 如果沒有消息,那么任務(wù)就只有被阻塞。首先在TCB中的STCBS

24、tat中添加消息 隊(duì)列等待標(biāo)志,任務(wù)延時(shí)時(shí)間,初始化等待狀態(tài),然后調(diào)用OS_EventTaskWait 添 加等待標(biāo)志和取消就緒標(biāo)志,接著調(diào)用OS_Sched執(zhí)行一次任務(wù)調(diào)度。 4. 任務(wù)恢復(fù)運(yùn)行后,根據(jù)TCB中的等待狀態(tài)OSTCBStatPend決定程序走向。如果 獲得了消息,進(jìn)行一些處理后返回該消息。如果是退出等待,或是等待超時(shí),分別 填寫沒有取得消息的原因,然后返回空指針。 5.2.6刪除消息隊(duì)列刪除消息隊(duì)列 當(dāng)消息隊(duì)列不再使用了,就應(yīng)該盡快歸還給系統(tǒng),即將消息占用的 ECB歸還給ECB空閑鏈表以備它用,將QCB也歸還給空閑QCB鏈表。 刪除消息隊(duì)列的函數(shù)的名稱為OSQDel,參數(shù)是EC

25、B的指針、刪除操作的 選項(xiàng)opt和返回函數(shù)執(zhí)行信息的指針的perr。 其中opt的值為 OS_DEL_NO_PEND 表示只有當(dāng)沒有任務(wù)等待該消息隊(duì)列的時(shí)候才允 許刪除,opt的值為OS_DEL_ALWAYS 表示無(wú)論如何都刪除。 如果成功刪除,返回空指針;否則返回ECB的指針。 表5.17消息隊(duì)列刪除函數(shù)OSQDel解析 1.首先進(jìn)行參數(shù)的檢查。 2. 根據(jù)選項(xiàng)opt決定程序的分支 3. 如果opt不是這兩個(gè)值當(dāng)中的一個(gè),那就是說(shuō)明是錯(cuò)誤的選項(xiàng),也屬于參 數(shù)檢查失敗。因此,標(biāo)記錯(cuò)誤信息perr為OS_ERR_INVALID_OPT后, 直接返回原來(lái)ECB指針pevent。 5.2.7取得消息隊(duì)列的狀態(tài)取得消息隊(duì)列的狀態(tài) 消息隊(duì)列數(shù)據(jù)OS_Q_DATA是為返回消息隊(duì)列信息而提供的,因此用戶 程序如果想了解消息隊(duì)列的信息,要先創(chuàng)建OS_Q_DATA的實(shí)例。然后以 消息隊(duì)列所在ECB地址及該實(shí)例的地址為指針為參數(shù)調(diào)用獲取消息隊(duì)列的 狀態(tài)函數(shù)OSQQuery 表5.19獲取消息隊(duì)列的狀態(tài)函數(shù)OSQQuery解析 5.2.8消息隊(duì)列應(yīng)用舉例消息隊(duì)列應(yīng)用舉例 假設(shè)有任務(wù)假設(shè)有任務(wù)TaskQSen和和

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論