專(zhuān)利名稱(chēng):一種基于共享內(nèi)存的通信方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信技術(shù)領(lǐng)域, 具體涉及一種基于共享內(nèi)存的通信方法及裝置。
背景技術(shù):
在兩個(gè)CPU之間通過(guò)共享內(nèi)存通信時(shí),目前較常見(jiàn)的有以下幾種方法。第一種方法是將共享內(nèi)存存分為兩塊,分別作為兩個(gè)CPU的發(fā)送、接收通道, 如圖1所示。每個(gè)通道提供一個(gè)讀寫(xiě)標(biāo)志位,該標(biāo)志初始為可寫(xiě)態(tài)。發(fā)送方發(fā)送數(shù)據(jù)后 將讀寫(xiě)標(biāo)志由可寫(xiě)態(tài)修改為可讀態(tài),等待接收方接收。接收方接收數(shù)據(jù)后將讀寫(xiě)標(biāo)志由 可讀態(tài)修改為可寫(xiě)態(tài),以便發(fā)送方可以繼續(xù)發(fā)送。采用這種方法,每一次的數(shù)據(jù)交互都 需要等待對(duì)方讀或?qū)懲戤?,效率很低。第二種方法也是將共享內(nèi)存分為兩塊,分別作為兩個(gè)CPU的發(fā)送、接收通道, 每個(gè)通道用一個(gè)環(huán)形隊(duì)列實(shí)現(xiàn)循環(huán)讀寫(xiě),如圖2所示。環(huán)形隊(duì)列通過(guò)存放在郵箱中的讀 寫(xiě)指針進(jìn)行管理。以CPUl發(fā)送為例,CPUl有數(shù)據(jù)需要發(fā)送時(shí),首先通過(guò)環(huán)形隊(duì)列1的 讀、寫(xiě)指針計(jì)算是否有足夠的剩余空間,如果空間足夠,則將消息包寫(xiě)入寫(xiě)指針?biāo)肝?置,并更新寫(xiě)指針。CPU2定時(shí)輪詢(xún)環(huán)形隊(duì)列1,發(fā)現(xiàn)有新的消息包時(shí),則讀取消息包, 并更新讀指針。由于發(fā)送方和接收方可以同時(shí)操作共享內(nèi)存,比前面的方法效率上大大 提高,但是還是存在以下問(wèn)題1、數(shù)據(jù)一般按定長(zhǎng)打包發(fā)送,對(duì)于消息包長(zhǎng)度相差大,例如最小長(zhǎng)度為4字 節(jié),最大長(zhǎng)度為40字節(jié),都要按最大的40字節(jié)打包發(fā)送,造成浪費(fèi)。2、在隊(duì)列尾端空間不夠存放新消息包時(shí),一般為了操作方便不允許消息包卷 繞,就需要填充特殊值(例如OxFFFF)指示該尾端空間無(wú)效,并將消息包放置到隊(duì)列頭 部。接收時(shí)需要和特殊值比較,判斷是正常消息包還是卷繞時(shí)的填充值。如果正常消息 包中包含特殊值,就會(huì)產(chǎn)生沖突。第三種方法,即現(xiàn)有專(zhuān)利文獻(xiàn)《一種基于共享存儲(chǔ)器的雙CPU通信方法》,專(zhuān) 利申請(qǐng)?zhí)枮?00610103231.0,使用了兩個(gè)環(huán)形隊(duì)列,如圖3所示,一個(gè)用于存放消息索 弓丨,另一個(gè)用于存放消息實(shí)體。其中,消息索引是大小固定為4字節(jié)且指向消息實(shí)體的 指針,如圖4所示,消息實(shí)體大小可變。但此方法有如下不足1、在程序設(shè)計(jì)中必須時(shí)刻注意消息索引和消息實(shí)體隊(duì)列的同步,需要同時(shí)維護(hù) 兩個(gè)隊(duì)列,增加了程序的復(fù)雜性。2、易造成浪費(fèi)。當(dāng)有很多小的消息包致使消息索引隊(duì)列滿(mǎn)時(shí),整個(gè)消息通道將 不可用,即使消息實(shí)體隊(duì)列還有很大的空間也不能使用。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題是,提供一種基于共享內(nèi)存的通信方法及裝置,可 以支持多通道、可變消息長(zhǎng)度。為了解決上述問(wèn)題,本發(fā)明公開(kāi)了一種基于共享內(nèi)存的通信方法,包括
發(fā)送方將所要發(fā)送的內(nèi)容作為消息體寫(xiě)入內(nèi)存的通道,并為該消息體配置定長(zhǎng) 的消息頭以構(gòu)成傳輸消息,其中,所述消息頭中至少攜帶所述消息體的長(zhǎng)度;接收方從所述通道中讀取所述消息頭,根據(jù)所述消息頭的起始地址以及消息頭 的長(zhǎng)度確定所述消息體的起始地址,再根據(jù)所述消息體的起始地址以及所述消息頭中消 息體的長(zhǎng)度,確定所述消息體在所述內(nèi)存通道的位置,在該位置上讀取所述消息體,進(jìn) 行處理。進(jìn)一步地,在所述發(fā)送方將所述消息體寫(xiě)入內(nèi)存通道前,上述方法還包括; 所述發(fā)送方與所述接收方將內(nèi)存劃分為多個(gè)通道,為各通道配置通道描述符, 所述通道描述符包括通道的基地址、通道的大小以及通道的讀寫(xiě)指針。其中,發(fā)送方將所要發(fā)送的消息體寫(xiě)入內(nèi)存通道時(shí),還將該通道的寫(xiě)指針指向 該通道的下一個(gè)可用單元;所述接收方判斷所述通道的讀、寫(xiě)指針不相等時(shí),才讀取所述傳輸消息,并將 所述通道的讀指針指向下一個(gè)傳輸消息。所述消息頭還包括下一跳地址,所述下一跳地址表示下一個(gè)傳輸消息的消息頭 的起始地址。所述發(fā)送方將所述傳輸消息寫(xiě)入內(nèi)存的通道時(shí),若所述通道底部空閑空間小于 所述傳輸消息的長(zhǎng)度,且所述通道頂部空閑空間大于所述傳輸消息的長(zhǎng)度,則在所述通 道的底部寫(xiě)入一空消息頭,將所述傳輸消息寫(xiě)入所述通道的頂部,其中,所述空消息頭 中消息體的長(zhǎng)度為零,下一跳地址為零;若所述接收方從所述通道中讀取到所述空消息頭,則從所述通道的頂部讀取傳 輸消息,進(jìn)行處理。本發(fā)明還公開(kāi)了一種基于共享內(nèi)存的通信裝置,包括發(fā)送單元、接收單元,處 理單元,其中所述發(fā)送單元,用于將所述處理單元發(fā)送的傳輸消息寫(xiě)入內(nèi)存的通道;所述接收單元,用于從內(nèi)存的通道中讀取傳輸消息的消息頭,根據(jù)所述消息頭 的起始地址以及消息頭的長(zhǎng)度確定所述傳輸消息的消息體的起始地址,再根據(jù)所述消息 體的起始地址以及所述消息頭中消息體的長(zhǎng)度,確定所述消息體在所述內(nèi)存通道的位 置,在該位置上讀取所述消息體,并將所讀取的消息體發(fā)送到所述處理單元;所述處理單元,用于將所要傳輸?shù)膬?nèi)容作為消息體,為該消息體配置定長(zhǎng)的消 息頭以構(gòu)成傳輸消息,并將所述傳輸消息發(fā)送給所述發(fā)送單元,以及用于接收所述接收 單元發(fā)送的消息體,對(duì)該消息體進(jìn)行處理。進(jìn)一步地,上述通信裝置中,所述處理單元,還用于將內(nèi)存劃分為多個(gè)通道, 為各通道配置通道描述符,所述通道描述符包括通道的基地址、通道的大小以及通道的 讀寫(xiě)指針。其中,所述發(fā)送單元,將所述消息寫(xiě)入內(nèi)存的通道時(shí),還用于將該通道的寫(xiě)指 針指向該通道的下一個(gè)可用單元;所述接收單元,還用于判斷所述通道的讀、寫(xiě)指針是否相等,當(dāng)所述通道的 讀、寫(xiě)指針不相等時(shí),讀取所述傳輸消息的消息頭,并將該通道的讀指針指向下一個(gè)傳 輸消息。
所述處理單元,在所述消息頭中配置下一跳地址,所述下一跳地址表示下一個(gè) 傳輸消息的消息頭的起始地址。所述處理單元,在所述內(nèi)存的通道底部空閑空間小于所述傳輸消息的長(zhǎng)度,且 所述通道頂部空閑空間大于所述傳輸消息的長(zhǎng)度時(shí),還用于向所述發(fā)送單元發(fā)送一空消 息頭,其中,所述空消息頭中消息體的長(zhǎng)度為零,下一跳地址為零;所述發(fā)送單元,還用于接收所述處理單元發(fā)送的空消息頭,并將所述空消息頭 寫(xiě)入所述通道的底部,將所述傳輸消息寫(xiě)入所述通道的頂部,以及在讀取到空消息頭 時(shí),再?gòu)乃鐾ǖ赖捻敳孔x取傳輸消息,并將所述傳輸消息的消息體發(fā)送給所述處理單元。采用本發(fā)明技術(shù)方案后,可支持多通道,可支持可變長(zhǎng)消息,本發(fā)明技術(shù)方案 尤其適用于消息流量大、且消息包不定長(zhǎng)的情況。此外本發(fā)明也可用于基于共享內(nèi)存的 單一 CPU下的多任務(wù)間通信。
圖1是現(xiàn)有技術(shù)的共享內(nèi)存的雙CPU通信示意圖;圖2是現(xiàn)有技術(shù)的每個(gè)通道用一個(gè)環(huán)形隊(duì)列的雙CPU通信示意圖;圖3是現(xiàn)有技術(shù)中的每個(gè)通道用兩個(gè)環(huán)形隊(duì)列的雙CPU通信示意圖;圖4是現(xiàn)有技術(shù)中的消息索引與消息實(shí)體關(guān)系示意圖;圖5是本發(fā)明裝置實(shí)現(xiàn)通信的示意圖;圖6是本發(fā)明中傳輸消息的結(jié)構(gòu)示意圖;圖7是本發(fā)明中發(fā)送消息流程圖;圖8是本發(fā)明中通道描述符示意圖;圖9是本發(fā)明中各通道示意圖;圖10是本發(fā)明中接收消息流程圖。
具體實(shí)施例方式本發(fā)明的主要構(gòu)思是,定義第一裝置(例如,CPUl或者任務(wù)一的實(shí)現(xiàn)裝置)發(fā) 送、第二裝置(例如,CPU2或任務(wù)二)接收的通道為下行通道,而第二裝置發(fā)送、第一 裝置接收的通道為上行通道。對(duì)于下行通道,寫(xiě)指針第一裝置可寫(xiě),第二裝置只讀,讀 指針第一裝置只讀,第二裝置可寫(xiě);對(duì)于上行通道,寫(xiě)指針第二裝置可寫(xiě),第一裝置只 讀,讀指針第二裝置只讀,第一裝置可寫(xiě),如圖5所示。發(fā)送方(第一裝置或者第二裝置)傳輸消息后,可以通過(guò)中斷方式通知接收方 (第二裝置或者第一裝置)去接收,另外,接收方也可以用輪詢(xún)的方式接收。在整個(gè)通訊處理過(guò)程中進(jìn)一步分為如下三個(gè)流程第一部分,初始化流程根據(jù)系統(tǒng)需要,分別設(shè)定下行通道和上行通道個(gè)數(shù),其中,一個(gè)通道即為一個(gè) 隊(duì)列,初始化讀寫(xiě)指針指均向隊(duì)列頭部。第二部分,發(fā)送傳輸消息流程根據(jù)傳輸消息和隊(duì)列的大小,判斷是否可以寫(xiě)入新的傳輸消息,如果是,則將新的傳輸消息寫(xiě)入對(duì)應(yīng)通道,并更新該通道的寫(xiě)指針(寫(xiě)指針指向新的傳輸消息之后的 可用單元),否則延遲后再發(fā)。第三部分,接收傳輸消息流程通過(guò)判斷隊(duì)列讀、寫(xiě)指針是否相等,以確定是否有新的傳輸消息,當(dāng)讀、寫(xiě)指 針不相等時(shí),表示有新的傳輸消息;讀、寫(xiě)指針相等,表示沒(méi)有新的傳輸消息;
當(dāng)有新的傳輸消息時(shí),獲取消息頭,更新隊(duì)列讀指針(指向下一個(gè)傳輸消息), 并根據(jù)消息頭,使用用戶(hù)注冊(cè)的回調(diào)函數(shù)對(duì)該新的傳輸消息的數(shù)據(jù)進(jìn)行處理。下面結(jié)合具體實(shí)施例及附圖對(duì)本發(fā)明技術(shù)方案作進(jìn)一步的描述。一種基于共享內(nèi)存的通訊裝置,包括發(fā)送單元,接收單元以及處理單元。下面 介紹各單元的功能。發(fā)送單元,用于發(fā)送處理單元發(fā)送的新的傳輸消息,即將新的傳輸消息寫(xiě)入通 道;其中,發(fā)送單元在發(fā)送傳輸消息過(guò)程中,需要判斷所要發(fā)送的新的傳輸消息的 長(zhǎng)度(即消息頭與消息體的總長(zhǎng)度)是否大于等于該通道的空閑空間,其中,當(dāng)所要發(fā)送 的新的傳輸消息的長(zhǎng)度大于等于該通道的空閑空間時(shí),表示通道滿(mǎn),無(wú)法寫(xiě)入新的傳輸 消息,此時(shí)需要繼續(xù)等待;當(dāng)所要發(fā)送的新的傳輸消息的長(zhǎng)度小于通道的空閑空間時(shí), 表示通道未滿(mǎn),可以寫(xiě)入新的傳輸消息;進(jìn)一步地,當(dāng)處理單元向所述發(fā)送單元發(fā)送空的消息頭(即該空消息頭中的消 息長(zhǎng)度為0,下一跳地址為0)時(shí),發(fā)送單元在該通道底部寫(xiě)入該空消息頭,將新的傳輸 消息寫(xiě)入該通道的頂部;接收單元,用于接收對(duì)端發(fā)送的新的傳輸消息,即讀取通道中的新的傳輸消 息,讀取新的傳輸消息的消息頭,并根據(jù)消息頭地址及消息頭長(zhǎng)度,確定消息體的起始 地址,從該起始地址開(kāi)始讀取消息體,要讀取的長(zhǎng)度為消息頭中的消息體長(zhǎng)度,將所讀 取的消息體發(fā)送到處理單元;處理單元,用于構(gòu)造新的傳輸消息,將新的傳輸消息發(fā)送到發(fā)送單元,以及用 于接收接收單元發(fā)送的消息體,并使用注冊(cè)的回調(diào)函數(shù)對(duì)該消息進(jìn)行處理;其中,處理單元所構(gòu)造的新的傳輸消息分為定長(zhǎng)的消息頭和消息體(即為所要 傳輸?shù)膬?nèi)容)兩部分,如圖6所示,其中,定長(zhǎng)有消息頭為16字節(jié),消息頭中,魔數(shù)占 4字節(jié),消息類(lèi)型占4字節(jié),消息體長(zhǎng)度占4字節(jié),下一跳地址(即為下一個(gè)消息的消息 頭地址)占4字節(jié),而消息體長(zhǎng)度可變。進(jìn)一步地,當(dāng)內(nèi)存的通道的底部空閑空間小于新的傳輸消息的長(zhǎng)度,而該通道 的頂部空閑空間大于新的傳輸消息的長(zhǎng)度時(shí),處理單元還構(gòu)造一個(gè)空消息頭發(fā)送給發(fā)送 單元,該空消息頭中消息長(zhǎng)度置為0,下一跳地址設(shè)置為0。下面介紹上述裝置之間進(jìn)行通訊的過(guò)程,在本實(shí)施例中,各裝置即為一個(gè) CPU,即本實(shí)施例為雙CPU之間實(shí)現(xiàn)通訊的過(guò)程,現(xiàn)以該通訊過(guò)程的下行方向(即第一 裝置向第二裝置傳輸消息的方向)為例,介紹通訊過(guò)程,該過(guò)程分為發(fā)送部分和接收部 分,其中,發(fā)送過(guò)程,如圖7所示,包括以下步驟步驟700:將共享內(nèi)存分別劃分為多個(gè)上行通道和下行通道,為各通道配置通 道描述符,并將通道描述符中通道的讀寫(xiě)指針初始化為0,以表示隊(duì)列空,沒(méi)消息,同時(shí)注冊(cè)收到消息時(shí)處理的回調(diào)函數(shù); 本實(shí)施例中,可以根據(jù)用戶(hù)需要或者傳輸消息的大小,將共享內(nèi)存劃分為四個(gè) 通道(一個(gè)通道即為一個(gè)傳輸隊(duì)列),其中,兩個(gè)通道為上行通道,另外兩個(gè)通道為下行 通道,各通道描述符,用于描述各通道的基地址、通道的大小以及通道的讀寫(xiě)指針,如 圖8所示。步驟701:發(fā)送方判斷下行通道是否滿(mǎn),如果是,則繼續(xù)等待,否則進(jìn)入步驟 702 ;該步驟中,發(fā)送方可以判斷所要發(fā)送的新的傳輸消息的長(zhǎng)度(新的傳輸消息的 長(zhǎng)度指消息頭與消息體的總長(zhǎng)度)是否大于等于該通道的空閑空間,以判斷下行通道是 否滿(mǎn),其中,當(dāng)新所要發(fā)送的新的傳輸消息的長(zhǎng)度大于等于該通道的空閑空間時(shí),表示 通道滿(mǎn),無(wú)法寫(xiě)入新的傳輸消息,此時(shí)需要繼續(xù)等待;當(dāng)新所要發(fā)送的新的傳輸消息的 長(zhǎng)度小于通道的空閑空間時(shí),表示通道未滿(mǎn),可以寫(xiě)入新的傳輸消息;具體地,根據(jù)該通道的讀、寫(xiě)指針,即可判斷新的傳輸消息的長(zhǎng)度是否大于等 于該通道的空閑空間。通道的空閑空間可以通過(guò)讀、寫(xiě)指針來(lái)計(jì)算寫(xiě)指針大于讀指針 時(shí),通道的空閑空間=通道的長(zhǎng)度_(寫(xiě)指針_讀指針);讀指針大于寫(xiě)指針時(shí),隊(duì)列的 空閑空間=讀指針-寫(xiě)指針。步驟702:判斷該通道的底部空閑空間是否大于等于新的傳輸消息的長(zhǎng)度,如 果是,進(jìn)入步驟706,否則進(jìn)入步驟703;步驟703:判斷該通道的頂部空閑空間是否小于等于新的傳輸消息的長(zhǎng)度,如 果是,則繼續(xù)等待,否則進(jìn)入步驟704;步驟704:發(fā)送方在該通道底部寫(xiě)入空消息頭,將該空消息頭中的消息長(zhǎng)度設(shè) 置為0,并該空消息頭中的下一跳地址設(shè)置為0;步驟705:發(fā)送方在該通道的頂部空閑空間寫(xiě)入新的傳輸消息,結(jié)束發(fā)送流 程;步驟706:將新的傳輸消息依次寫(xiě)入該通道的空閑空間,并更新該新的傳輸消 息的消息頭中的下一跳地址,以及該通道的寫(xiě)指針,結(jié)束發(fā)送流程。本實(shí)施例中,在下行通道中寫(xiě)入各個(gè)消息后,如圖9所示;每個(gè)新的傳輸消息 分為消息頭和消息體兩部分,如圖6所示,其中,消息頭是定長(zhǎng)的16字節(jié),消息頭中, 魔數(shù)占4字節(jié),消息類(lèi)型占4字節(jié),消息體長(zhǎng)度占4字節(jié),下一跳地址占4字節(jié),而消息 體長(zhǎng)度(即為消息的具體內(nèi)容)可變。整個(gè)通道的大小以消息頭的長(zhǎng)度(也即16字節(jié)) 對(duì)齊。待寫(xiě)入的新的傳輸消息的長(zhǎng)度在寫(xiě)入隊(duì)列時(shí)也以消息頭的長(zhǎng)度(也即16字節(jié))對(duì) 齊。接收過(guò)程如圖10所示,包括以下步驟步驟1001:接收方判斷下行通道中是否有新的傳輸消息,如果有,進(jìn)入步驟 1002,否則繼續(xù)等待;該步驟中,接收方判斷下行通道為空時(shí),即表示沒(méi)有新的傳輸消息,判斷下行 通道不為空時(shí),表示有新的傳輸消息,具體地,判斷該下行通道的讀、寫(xiě)指針相等時(shí), 表示通道為空,判斷下行通道的讀、寫(xiě)指針不相等時(shí),表示該下行通道非空。步驟1002 讀取該新的傳輸消息的消息頭,并根據(jù)該消息頭的地址及其長(zhǎng)度確定該新的傳輸消息的消息體的起始地址,即消息頭的地址+消息頭的長(zhǎng)度=消息體的地 址,并使用注冊(cè)的回調(diào)函數(shù)對(duì)該消息進(jìn)行處理,同時(shí)并更新該下行通道的讀指針(即將 讀指針指向下一個(gè)消息)。該步驟中,當(dāng)接收方獲取 的消息頭中的消息體長(zhǎng)度和下一跳地址均為0時(shí),表 明該消息在發(fā)送時(shí)由于隊(duì)列底部空間不夠,只在底部存放了一個(gè)空頭,而真正的消息存 放在隊(duì)列的頂部,此時(shí)直接讀取隊(duì)列頂部即可獲得真正的消息頭。在本實(shí)施例中,在訪(fǎng)問(wèn)消息頭和隊(duì)列描述符時(shí)還要注意字節(jié)序的問(wèn)題,因?yàn)?CPUl和CPU2可能字節(jié)序不同。在其他實(shí)施例中,各裝置可以代表一任務(wù)的實(shí)現(xiàn)裝置,兩個(gè)裝置之間的通訊過(guò) 程,即為兩個(gè)任務(wù)(例如任務(wù)1和任務(wù)2)間進(jìn)行大數(shù)據(jù)量的通信過(guò)程。從上述實(shí)施例可以看出,本發(fā)明技術(shù)方案可支持多通道,可支持可變長(zhǎng)消息。 并且,為了避免消息包卷繞時(shí)填充特殊值,在隊(duì)列尾端空間不夠存放新消息包時(shí),直接 存放到隊(duì)列頭,根本無(wú)需關(guān)心消息包是否卷繞。發(fā)送方還可以連續(xù)發(fā)送消息,將多條消 息堆積在緩沖區(qū)內(nèi),而接收方則可以連續(xù)處理緩沖區(qū)內(nèi)的多條消息。這樣就減少了發(fā) 送方和接收方的等待時(shí)間,減少了接收方重復(fù)進(jìn)中斷或查詢(xún)的次數(shù),提高了 CPU的利用 率,提高了數(shù)據(jù)吞吐量和處理速度。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的 技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的 任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種基于共享內(nèi)存的通信方法,其特征在于,該方法包括發(fā)送方將所要發(fā)送的內(nèi)容作為消息體寫(xiě)入內(nèi)存的通道,并為該消息體配置定長(zhǎng)的消 息頭以構(gòu)成傳輸消息,其中,所述消息頭中至少攜帶所述消息體的長(zhǎng)度;接收方從所述通道中讀取所述消息頭,根據(jù)所述消息頭的起始地址以及消息頭的長(zhǎng) 度確定所述消息體的起始地址,再根據(jù)所述消息體的起始地址以及所述消息頭中消息體 的長(zhǎng)度,確定所述消息體在所述內(nèi)存通道的位置,在該位置上讀取所述消息體,進(jìn)行處 理。
2.如權(quán)利要求1所述的方法,其特征在于,在所述發(fā)送方將所述消息體寫(xiě)入內(nèi)存通道 前,該方法還包括;所述發(fā)送方與所述接收方將內(nèi)存劃分為多個(gè)通道,為各通道配置通道描述符,所述 通道描述符包括通道的基地址、通道的大小以及通道的讀寫(xiě)指針。
3.如權(quán)利要求2所述的方法,其特征在于,發(fā)送方將所要發(fā)送的消息體寫(xiě)入內(nèi)存通道時(shí),還將該通道的寫(xiě)指針指向該通道的下 一個(gè)可用單元;所述接收方判斷所述通道的讀、寫(xiě)指針不相等時(shí),才讀取所述傳輸消息,并將所述 通道的讀指針指向下一個(gè)傳輸消息。
4.如權(quán)利要求1至3任一項(xiàng)所述的方法,其特征在于,所述消息頭還包括下一跳地址,所述下一跳地址表示下一個(gè)傳輸消息的消息頭的起 始地址。
5.如權(quán)利要求4所述的方法,其特征在于,所述發(fā)送方將所述傳輸消息寫(xiě)入內(nèi)存的通道時(shí),若所述通道底部空閑空間小于所述 傳輸消息的長(zhǎng)度,且所述通道頂部空閑空間大于所述傳輸消息的長(zhǎng)度,則在所述通道的 底部寫(xiě)入一空消息頭,將所述傳輸消息寫(xiě)入所述通道的頂部,其中,所述空消息頭中消 息體的長(zhǎng)度為零,下一跳地址為零;若所述接收方從所述通道中讀取到所述空消息頭,則從所述通道的頂部讀取傳輸消 息,進(jìn)行處理。
6.—種基于共享內(nèi)存的通信裝置,其特征在于,該裝置包括發(fā)送單元、接收單元, 處理單元,其中所述發(fā)送單元,用于將所述處理單元發(fā)送的傳輸消息寫(xiě)入內(nèi)存的通道;所述接收單元,用于從內(nèi)存的通道中讀取傳輸消息的消息頭,根據(jù)所述消息頭的起 始地址以及消息頭的長(zhǎng)度確定所述傳輸消息的消息體的起始地址,再根據(jù)所述消息體的 起始地址以及所述消息頭中消息體的長(zhǎng)度,確定所述消息體在所述內(nèi)存通道的位置,在 該位置上讀取所述消息體,并將所讀取的消息體發(fā)送到所述處理單元;所述處理單元,用于將所要傳輸?shù)膬?nèi)容作為消息體,為該消息體配置定長(zhǎng)的消息頭 以構(gòu)成傳輸消息,并將所述傳輸消息發(fā)送給所述發(fā)送單元,以及用于接收所述接收單元 發(fā)送的消息體,對(duì)該消息體進(jìn)行處理。
7.如權(quán)利要求6所述的通信裝置,其特征在于,所述處理單元,還用于將內(nèi)存劃分為多個(gè)通道,為各通道配置通道描述符,所述通 道描述符包括通道的基地址、通道的大小以及通道的讀寫(xiě)指針。
8.如權(quán)利要求7所述的通信裝置,其特征在于,所述發(fā)送單元,將所述消息寫(xiě)入內(nèi)存的通道時(shí),還用于將該通道的寫(xiě)指針指向該通 道的下一個(gè)可用單元;所述接收單元,還用于判斷所述通道的讀、寫(xiě)指針是否相等,當(dāng)所述通道的讀、 寫(xiě)指針不相等時(shí),讀取所述傳輸消息的消息頭,并將該通道的讀指針指向下一個(gè)傳輸消 肩、ο
9.如權(quán)利要求6至8任一項(xiàng)所述的通信裝置,其特征在于,所述處理單元,在所述消息頭中配置下一跳地址,所述下一跳地址表示下一個(gè)傳輸 消息的消息頭的起始地址。
10.如權(quán)利要求9所述的通信裝置,其特征在于,所述處理單元,在所述內(nèi)存的通道底部空閑空間小于所述傳輸消息的長(zhǎng)度,且所 述通道頂部空閑空間大于所述傳輸消息的長(zhǎng)度時(shí),還用于向所述發(fā)送單元發(fā)送一空消息 頭,其中,所述空消息頭中消息體的長(zhǎng)度為零,下一跳地址為零;所述發(fā)送單元,還用于接收所述處理單元發(fā)送的空消息頭,并將所述空消息頭寫(xiě)入 所述通道的底部,將所述傳輸消息寫(xiě)入所述通道的頂部,以及在讀取到空消息頭時(shí),再 從所述通道的頂部讀取傳輸消息,并將所述傳輸消息的消息體發(fā)送給所述處理單元。
全文摘要
本發(fā)明公開(kāi)了一種基于共享內(nèi)存的通信方法及裝置,涉及通信技術(shù)領(lǐng)域。本發(fā)明公開(kāi)的通信方法包括發(fā)送方將所要發(fā)送的內(nèi)容作為消息體寫(xiě)入內(nèi)存的通道,并為該消息體配置定長(zhǎng)的消息頭以構(gòu)成傳輸消息,其中,所述消息頭中至少攜帶所述消息體的長(zhǎng)度;接收方從所述通道中讀取所述消息頭,根據(jù)所述消息頭的起始地址以及消息頭的長(zhǎng)度確定所述消息體的起始地址,再根據(jù)所述消息體的起始地址以及所述消息頭中消息體的長(zhǎng)度,確定所述消息體在所述內(nèi)存通道的位置,在該位置上讀取所述消息體,進(jìn)行處理。采用本發(fā)明技術(shù)方案后,可支持多通道,可支持可變長(zhǎng)消息。
文檔編號(hào)G06F15/167GK102023961SQ20091017213
公開(kāi)日2011年4月20日 申請(qǐng)日期2009年9月10日 優(yōu)先權(quán)日2009年9月10日
發(fā)明者秦曉輝 申請(qǐng)人:中興通訊股份有限公司