專利名稱:基于消息隊(duì)列的外界數(shù)據(jù)接收方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種自動控制設(shè)備的重要數(shù)據(jù)接收方法,尤其是一種對安全要求特別 高的場合如軌道交通自動控制中使用的數(shù)據(jù)接收方法,具體地說是一種基于消息隊(duì)列的外 界數(shù)據(jù)接收方法。
背景技術(shù):
眾所周知,在一些涉及重大人身和設(shè)備安全的自動控制系統(tǒng)領(lǐng)域,如城市地下軌 道交通系統(tǒng)就要求系統(tǒng)具有極高的實(shí)時(shí)性,為此,在系統(tǒng)中運(yùn)行的任務(wù)執(zhí)行操作所花的時(shí) 間會有嚴(yán)格的要求。但在任務(wù)的執(zhí)行過程中,部分操作因?yàn)橐却饨鐐魅霐?shù)據(jù),它的執(zhí)行 時(shí)間在運(yùn)行過程中是不確定的。在高安全性系統(tǒng)中,這些執(zhí)行時(shí)間不確定性的因素屬于風(fēng) 險(xiǎn)的一部分,對其需要有完善的防護(hù)措施。要做到一旦操作執(zhí)行超時(shí)了,就進(jìn)行相應(yīng)的異常 處理,而且處理后應(yīng)用任務(wù)能夠照常運(yùn)行。應(yīng)用任務(wù)接收外界數(shù)據(jù)的操作通常是調(diào)用一個(gè)函數(shù),不妨假設(shè)它為recv函數(shù)。為 了防止recv函數(shù)超時(shí),在實(shí)現(xiàn)recv函數(shù)的時(shí)候,通常會加入定時(shí)器機(jī)制,一旦超過某個(gè)時(shí) 間值,該函數(shù)就會返回,告訴應(yīng)用任務(wù)超時(shí)了。這樣的實(shí)現(xiàn)方式雖然能滿足風(fēng)險(xiǎn)防護(hù)的要求,但從機(jī)制上講不夠靈活。recv函數(shù) 如果是由自己來實(shí)現(xiàn),其定時(shí)器機(jī)制肯定能滿足自己的需求,但如果recv函數(shù)是第三方接 口,那么其中的定時(shí)器機(jī)制就不一定能滿足自己的需求了。例如,在某些實(shí)時(shí)性系統(tǒng)中,定 時(shí)器不能采用系統(tǒng)時(shí)鐘,而要采用專用的獨(dú)立信號來實(shí)現(xiàn)。對這種特殊的情況,定時(shí)器機(jī)制 需要自己來實(shí)現(xiàn)。但recv函數(shù)卻是第三方接口,兩者沒法融合在一起。導(dǎo)致這樣結(jié)果的原因就在于recv函數(shù)與定時(shí)器機(jī)制捆綁在了一起。因此,急需發(fā) 明一種將接收外界數(shù)據(jù)的操作和定時(shí)器分開方法來解決數(shù)據(jù)接收的安全和靈活兼容的問 題。
發(fā)明內(nèi)容
本發(fā)明的目的是針對現(xiàn)有的設(shè)備控制系統(tǒng)需將數(shù)據(jù)接收與定時(shí)器捆綁進(jìn)行帶來 的靈活性差,存在安全隱患的問題,提供一種基于消息隊(duì)列的外界數(shù)據(jù)接收方法。該方法將 應(yīng)用任務(wù)接收外界數(shù)據(jù)的操作與定時(shí)器機(jī)制實(shí)現(xiàn)了分離,使應(yīng)用任務(wù)可以按自己的需求定 制每個(gè)操作的定時(shí)器。本發(fā)明的技術(shù)方案是一種基于消息隊(duì)列的外界數(shù)據(jù)接收方法,其特征是為每個(gè)與外界有交互的應(yīng)用任 務(wù)定義一個(gè)消息隊(duì)列msgQEvent,作為該任務(wù)接收跟外界傳入數(shù)據(jù)相關(guān)的事件的唯一方式; 若有事件需要通知該任務(wù),則往msgQEvent中放入一條消息,這樣應(yīng)用任務(wù)那邊收到消息 后,就可以被喚醒并執(zhí)行相應(yīng)的處理。所述的消息類型有數(shù)據(jù)接收完畢消息和數(shù)據(jù)接收超時(shí)消息;所述的數(shù)據(jù)接收完畢 消息是假設(shè)應(yīng)用任務(wù)中接收外界數(shù)據(jù)的函數(shù)為recv函數(shù),采用消息隊(duì)列msgQEvent后,將recv函數(shù)從應(yīng)用任務(wù)中挪出,換成從msgQEvent中等待消息,另外用一個(gè)獨(dú)立的任務(wù)Task A單獨(dú)進(jìn)行recv操作,該任務(wù)的優(yōu)先級要高于應(yīng)用任務(wù),當(dāng)recv操作完成后,Task A往 msgQEvent中放入數(shù)據(jù)接收完畢消息。注意這里的數(shù)據(jù)接收完畢消息并不包含數(shù)據(jù)內(nèi)容, 如要獲取具體的數(shù)據(jù),屬于下一步的處理,如通過全局?jǐn)?shù)據(jù)區(qū)獲取數(shù)據(jù)、從消息隊(duì)列中獲取 數(shù)據(jù)等。應(yīng)用任務(wù)從msgQEvent收到該消息后,就去獲取具體的數(shù)據(jù),然后進(jìn)行下一步的處 理;所述的數(shù)據(jù)接收超時(shí)消息是指在應(yīng)用任務(wù)從msgQEvent中等待消息之前,啟動一個(gè)定 時(shí)器,該定時(shí)器可以采用系統(tǒng)時(shí)鐘實(shí)現(xiàn),也可以用其他的時(shí)鐘源實(shí)現(xiàn),當(dāng)定時(shí)器超時(shí)后,則 往msgQEvent中發(fā)送數(shù)據(jù)接收超時(shí)消息,這樣,應(yīng)用任務(wù)就可以被喚醒,然后進(jìn)行相應(yīng)的異 常處理。例如,如果該報(bào)文很重要,則在異常處理中,應(yīng)用任務(wù)可以給對方發(fā)送重發(fā)請求,然 后繼續(xù)調(diào)用msgQReceive等待。
本發(fā)明的有益效果本發(fā)明通過將應(yīng)用任務(wù)接收外界數(shù)據(jù)的操作與定時(shí)器機(jī)制實(shí)現(xiàn)了分離,使應(yīng)用任 務(wù)可以按自己的需求定制每個(gè)操作的定時(shí)器。本發(fā)明的方法具有風(fēng)險(xiǎn)低,可實(shí)現(xiàn)多方數(shù)據(jù)通訊,方便靈活,可提高系統(tǒng)的運(yùn)行效率。
圖1是本發(fā)明的發(fā)送數(shù)據(jù)接收完畢消息流程示意圖;圖2是本發(fā)明的發(fā)送數(shù)據(jù)接收超時(shí)消息流程示意圖;圖3是本發(fā)明的多機(jī)容錯系統(tǒng)示意圖。
具體實(shí)施例方式下面結(jié)合附圖和實(shí)施例對本發(fā)明作進(jìn)一步的說明。如圖1-3所示。一種基于消息隊(duì)列的外界數(shù)據(jù)接收方法,首先是為每個(gè)與外界有交互的應(yīng)用任務(wù) 定義一個(gè)消息隊(duì)列msgQEvent,作為該任務(wù)接收跟外界傳入數(shù)據(jù)相關(guān)的事件的唯一方式。若 有事件需要通知該任務(wù),則往msgQEvent中放入一條消息,這樣應(yīng)用任務(wù)那邊收到消息后, 就可以被喚醒并執(zhí)行相應(yīng)的處理。為了滿足應(yīng)用任務(wù)正常功能的需要,消息的類型通常有 數(shù)據(jù)接收完畢消息、數(shù)據(jù)接收超時(shí)消息兩種。一、數(shù)據(jù)接收完畢消息假設(shè)應(yīng)用任務(wù)中接收外界數(shù)據(jù)的函數(shù)為recv函數(shù)。采用消息隊(duì)列msgQEvent后, 將recv函數(shù)從應(yīng)用任務(wù)中挪出,換成從msgQEvent中等待消息。另外用一個(gè)獨(dú)立的任務(wù) Task A單獨(dú)進(jìn)行recv操作,該任務(wù)的優(yōu)先級要高于應(yīng)用任務(wù)。當(dāng)recv操作完成后,Task A 往msgQEvent中放入數(shù)據(jù)接收完畢消息。(注意這里的消息并不包含數(shù)據(jù)內(nèi)容,如要獲取 具體的數(shù)據(jù),屬于下一步的處理,如通過全局?jǐn)?shù)據(jù)區(qū)獲取數(shù)據(jù)、從消息隊(duì)列中獲取數(shù)據(jù)等)。 應(yīng)用任務(wù)從msgQEvent收到該消息后,就去獲取具體的數(shù)據(jù),然后進(jìn)行下一步的處理。發(fā)送 數(shù)據(jù)接收完畢消息的流程如圖1所示。二、數(shù)據(jù)接收超時(shí)消息在應(yīng)用任務(wù)從msgQEvent中等待消息之前,起一個(gè)定時(shí)器。該定時(shí)器可以采用系統(tǒng)時(shí)鐘實(shí)現(xiàn),也可以用其他的時(shí)鐘源實(shí)現(xiàn)。當(dāng)定時(shí)器超時(shí)后,則往msgQEvent中發(fā)送數(shù)據(jù)接 收超時(shí)消息。這樣,應(yīng)用任務(wù)就可以被喚醒,然后進(jìn)行相應(yīng)的異常處理。例如,如果該報(bào)文 很重要,則在異常處理中,應(yīng)用任務(wù)可以給對方發(fā)送重發(fā)請求,然后繼續(xù)調(diào)用msgQReceive 等待。發(fā)送數(shù)據(jù)接收超時(shí)消息的流程如圖2所示。下面以多機(jī)容錯系統(tǒng)為例進(jìn)一步說明如下 如圖3所示該系統(tǒng)中多臺計(jì)算機(jī)由統(tǒng)一的外部時(shí)鐘信號驅(qū)動,在定時(shí)器機(jī)制上 也必須采用外部時(shí)鐘信號,保證每臺計(jì)算機(jī)中定時(shí)器的一致性。該系統(tǒng)接收的外界數(shù)據(jù)都 屬于報(bào)文數(shù)據(jù),所以下面涉及“數(shù)據(jù)”的地方都用“報(bào)文”替代。假設(shè)該系統(tǒng)中有兩個(gè)應(yīng)用任務(wù)跟外界有報(bào)文交互,分別為Tl、T2,則分別創(chuàng)建 msgQUmsgQ2作為接收跟外界傳入報(bào)文相關(guān)的事件的消息隊(duì)列。將該系統(tǒng)中接收外界報(bào)文 的recv函數(shù)放到Task A中執(zhí)行。Task A—旦接收到報(bào)文,就會根據(jù)報(bào)文的類型通知相應(yīng) 的應(yīng)用任務(wù)。假設(shè)應(yīng)用任務(wù)Tl對外發(fā)送了一個(gè)請求報(bào)文,然后等待外部傳入確認(rèn)請求報(bào)文。則 Tl會先啟動一個(gè)定時(shí)器M1,然后調(diào)用msgQReceive。如果外界在規(guī)定時(shí)間內(nèi)傳入一個(gè)報(bào)文,則Task A收到報(bào)文后,發(fā)現(xiàn)該報(bào)文屬于 Tl,就往msgQl中放入報(bào)文接收完畢消息。應(yīng)用任務(wù)Tl收到消息后,取出報(bào)文,如果報(bào) 文內(nèi)容正確,則取消定時(shí)器M1,然后進(jìn)行下面的處理;如果不是期望的報(bào)文,則繼續(xù)調(diào)用 msgQReceive。如果定時(shí)器Ml到期時(shí)外界還未傳入報(bào)文,則定時(shí)器觸發(fā),在觸發(fā)函數(shù)中往應(yīng)用任 務(wù)Tl的msgQl中放入報(bào)文接收超時(shí)消息。Tl收到該消息后,進(jìn)入異常處理分支。本發(fā)明未涉及部分均與現(xiàn)有技術(shù)相同或可采用現(xiàn)有技術(shù)加以實(shí)現(xiàn)。
權(quán)利要求
一種基于消息隊(duì)列的外界數(shù)據(jù)接收方法,其特征是為每個(gè)與外界有交互的應(yīng)用任務(wù)定義一個(gè)消息隊(duì)列msgQEvent,作為該任務(wù)接收跟外界傳入數(shù)據(jù)相關(guān)的事件的唯一方式;若有事件需要通知該任務(wù),則往msgQEvent中放入一條消息,這樣應(yīng)用任務(wù)那邊收到消息后,就可以被喚醒并執(zhí)行相應(yīng)的處理。
2.根據(jù)權(quán)利要求1所述的基于消息隊(duì)列的外界數(shù)據(jù)接收方法,其特征是所述的消息類 型有數(shù)據(jù)接收完畢消息和數(shù)據(jù)接收超時(shí)消息;所述的數(shù)據(jù)接收完畢消息是假設(shè)應(yīng)用任務(wù) 中接收外界數(shù)據(jù)的函數(shù)為recv函數(shù),采用消息隊(duì)列msgQEvent后,將recv函數(shù)從應(yīng)用任務(wù) 中挪出,換成從msgQEvent中等待消息,另外用一個(gè)獨(dú)立的任務(wù)Task A單獨(dú)進(jìn)行recv操 作,該任務(wù)的優(yōu)先級要高于應(yīng)用任務(wù),當(dāng)recv操作完成后,Task A往msgQEvent中放入數(shù) 據(jù)接收完畢消息,應(yīng)用任務(wù)從msgQEvent收到該消息后,就去獲取具體的數(shù)據(jù),然后進(jìn)行下 一步的處理;所述的數(shù)據(jù)接收超時(shí)消息是指在應(yīng)用任務(wù)從msgQEvent中等待消息之前,啟 動一個(gè)定時(shí)器,該定時(shí)器可以采用系統(tǒng)時(shí)鐘實(shí)現(xiàn),也可以用其他的時(shí)鐘源實(shí)現(xiàn),當(dāng)定時(shí)器超 時(shí)后,則往msgQEvent中發(fā)送數(shù)據(jù)接收超時(shí)消息,這樣,應(yīng)用任務(wù)就可以被喚醒,然后進(jìn)行 相應(yīng)的異常處理。
全文摘要
一種基于消息隊(duì)列的外界數(shù)據(jù)接收方法,其特征是為每個(gè)與外界有交互的應(yīng)用任務(wù)定義一個(gè)消息隊(duì)列msgQEvent,作為該任務(wù)接收跟外界傳入數(shù)據(jù)相關(guān)的事件的唯一方式;若有事件需要通知該任務(wù),則往msgQEvent中放入一條消息,這樣應(yīng)用任務(wù)那邊收到消息后,就可以被喚醒并執(zhí)行相應(yīng)的處理。本發(fā)明通過將應(yīng)用任務(wù)接收外界數(shù)據(jù)的操作與定時(shí)器機(jī)制實(shí)現(xiàn)了分離,使應(yīng)用任務(wù)可以按自己的需求定制每個(gè)操作的定時(shí)器。本發(fā)明的方法具有風(fēng)險(xiǎn)低,可實(shí)現(xiàn)多方數(shù)據(jù)通訊,方便靈活,可提高系統(tǒng)的運(yùn)行效率。
文檔編號G05B19/418GK101847107SQ201010135670
公開日2010年9月29日 申請日期2010年3月30日 優(yōu)先權(quán)日2010年3月30日
發(fā)明者朱騫, 束元, 蔡李峰 申請人:南京恩瑞特實(shí)業(yè)有限公司