李路野 丁琳琳 黎賀
(南京電子技術(shù)研究所 江蘇省南京市 210039)
為了適應(yīng)未來(lái)裝備支持新功能、新算法快速迭代和應(yīng)用的需求,要求應(yīng)用軟件與底層操作系統(tǒng)和硬件解耦合,通信中間件屏蔽了底層分布式異構(gòu)硬件環(huán)境的差異,提供統(tǒng)一標(biāo)準(zhǔn)的通信接口,已經(jīng)成為雷達(dá)開(kāi)放式體系架構(gòu)的核心組成部分[1]。
雷達(dá)信息處理領(lǐng)域?qū)?shí)時(shí)性要求很高,多一次數(shù)據(jù)的拷貝都可能會(huì)帶來(lái)單幀數(shù)據(jù)時(shí)延的增加。為了最小化數(shù)據(jù)傳輸帶來(lái)的時(shí)延,本文提出了一種零拷貝方法設(shè)計(jì)面向嵌入式異構(gòu)平臺(tái)的通信中間件。同時(shí),為了支持應(yīng)用靈活部署在不同節(jié)點(diǎn)上,應(yīng)用層采用同一種通信接口實(shí)現(xiàn)了節(jié)點(diǎn)內(nèi)、節(jié)點(diǎn)間的高實(shí)時(shí)通信。
公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu)(CORBA, Common Object Request Broker Architecture)規(guī)范[2]由對(duì)象管理組織(OMG, Object Management Group)提出,于1991年頒布了1.0 版本。CORBA 技術(shù)用于提供分布式對(duì)象之間的互操作性,支持信息交換,獨(dú)立于硬件平臺(tái)、編程語(yǔ)言和操作系統(tǒng)。不過(guò)CORBA 標(biāo)準(zhǔn)過(guò)于復(fù)雜,并沒(méi)有大范圍流行。
2004年,OMG 組織提出了數(shù)據(jù)分發(fā)服務(wù)(DDS,Data Distribution Service)規(guī)范[3],它是在CORBA 和HLA 等標(biāo)準(zhǔn)的基礎(chǔ)上,制定的分布式系統(tǒng)實(shí)時(shí)通信中間件技術(shù)規(guī)范。DDS 模型建立了共享數(shù)據(jù)空間的概念,數(shù)據(jù)發(fā)布者發(fā)布的數(shù)據(jù)可以被任何應(yīng)用使用。數(shù)據(jù)的發(fā)布者和訂閱者之間解耦合,無(wú)需知道彼此是否存在,也不用關(guān)注底層通信實(shí)現(xiàn)細(xì)節(jié),具有以下通信特點(diǎn):
(1)可擴(kuò)展性,新的用戶可以很容易地加入系統(tǒng)中,而系統(tǒng)本身不需要做任何改動(dòng);
(2)匿名性,信息生產(chǎn)者和消費(fèi)者互相不向?qū)Ψ奖┞蹲约旱纳矸菪畔ⅲ?/p>
(3)多點(diǎn)通信,一個(gè)事件可以同時(shí)被發(fā)送到多個(gè)信息消費(fèi)者;
(4)可配置通信,以數(shù)據(jù)為中心來(lái)進(jìn)行數(shù)據(jù)分發(fā),并將資源狀況、對(duì)資源的期待程度、網(wǎng)絡(luò)狀況等都用QoS 參數(shù)來(lái)配置,大大增強(qiáng)了通信的實(shí)時(shí)性和靈活性。如圖1 所示。
圖1:DDS 發(fā)布訂閱機(jī)制
劉巍等[4]對(duì)國(guó)產(chǎn)化實(shí)時(shí)通信中間件DDS 在X86、PPC T4240 和國(guó)產(chǎn)化華睿2 號(hào)處理平臺(tái)上的性能進(jìn)行了針對(duì)性的優(yōu)化,其中X86 平臺(tái)平均性能為美國(guó)同類產(chǎn)品RTI DDS 的2 倍。
DDS 目前的收數(shù)接口和發(fā)數(shù)接口標(biāo)準(zhǔn)決定了其發(fā)數(shù)需要等數(shù)據(jù)發(fā)完或?qū)?shù)據(jù)拷貝到發(fā)數(shù)緩沖區(qū),收數(shù)需要將數(shù)據(jù)拷貝到用戶指定地址空間。在某些數(shù)據(jù)傳輸時(shí)延要求極為嚴(yán)苛的場(chǎng)景下,DDS 難以滿足實(shí)際需求。
面向嵌入式平臺(tái)的高實(shí)時(shí)通信中間件系統(tǒng)架構(gòu)主要包括底層適配層、通用層、用戶接口層,如圖2 所示。
圖2:通信中間件系統(tǒng)架構(gòu)
通信中間件系統(tǒng)架構(gòu)自底向上包括:
(1)底層適配層:該層主要對(duì)DSP、CPU 等不同硬件平臺(tái)上用到的SRIO、UDP 等通信協(xié)議進(jìn)行封裝。
(2)通用層:信息庫(kù)模塊作為服務(wù)器節(jié)點(diǎn),所有的發(fā)布訂閱信息都在信息庫(kù)模塊中完成握手匹配;通用發(fā)布、訂閱注冊(cè)模塊則是支持應(yīng)用往信息庫(kù)發(fā)送注冊(cè)信息。
(3)用戶接口層:該層參考DDS 規(guī)范接口,提供通用的基于發(fā)布訂閱機(jī)制收發(fā)數(shù)的接口。
本文工作的設(shè)計(jì)亮點(diǎn)在于為用戶的收發(fā)提供了兩對(duì)接口,發(fā)數(shù)接口包括preWrite 和write,其中preWrite是從發(fā)數(shù)緩沖區(qū)先申請(qǐng)一塊空間,將未來(lái)要發(fā)的數(shù)據(jù)放在其中,處理過(guò)程的目的地址可直接使用該地址,減少了一次數(shù)據(jù)拷貝;write 接口則是等要發(fā)的數(shù)準(zhǔn)備好之后調(diào)用。收數(shù)接口包括read 和postRead,其中read 是獲取數(shù)據(jù)地址,當(dāng)用戶使用完之后,調(diào)用postRead 釋放數(shù)據(jù)所占用的地址空間,減少了一次數(shù)據(jù)從緩沖區(qū)拷貝到用戶地址空間的操作。
在CPU 或DSP 的單個(gè)節(jié)點(diǎn)內(nèi)部,兩個(gè)不同應(yīng)用之間利用通信中間件進(jìn)行數(shù)據(jù)傳輸時(shí),底層可采用共享內(nèi)存的方式,其收發(fā)數(shù)流程如圖3 和圖4 所示。
圖3:共享內(nèi)存發(fā)數(shù)流程
圖4:共享內(nèi)存收數(shù)流程
對(duì)于共享內(nèi)存通信,每個(gè)CPU/DSP 節(jié)點(diǎn)內(nèi)部有一塊數(shù)據(jù)緩沖區(qū)DataBuf 用于存放應(yīng)用間待收發(fā)的數(shù)據(jù);每個(gè)主題對(duì)應(yīng)一個(gè)地址緩沖區(qū)AddrFifo,發(fā)端把數(shù)據(jù)準(zhǔn)備好后,將數(shù)據(jù)首地址和長(zhǎng)度寫入AddrFifo,收端則從AddrFifo 中獲取數(shù)據(jù)地址和長(zhǎng)度。
基于共享內(nèi)存的收發(fā)數(shù)過(guò)程中緩沖區(qū)狀態(tài)變化過(guò)程如圖5 所示。
(1)緩沖區(qū)狀態(tài)1 表示在調(diào)用memPreWrite 之前,數(shù)據(jù)緩沖區(qū)的空間未被占用;
(2) 緩沖區(qū)狀態(tài)2 是指在發(fā)數(shù)應(yīng)用調(diào)用memPreWrite 之后,數(shù)據(jù)緩沖區(qū)DataBuf 分配了一塊空間(陰影區(qū)域),表示該空間已分配,不能被其它應(yīng)用使用;
(3)緩沖區(qū)狀態(tài)3 是指發(fā)數(shù)應(yīng)用將數(shù)據(jù)已經(jīng)寫入DataBuf(灰色區(qū)域);
(4)緩沖區(qū)狀態(tài)4 是發(fā)數(shù)應(yīng)用在調(diào)用memWrite 后,將對(duì)應(yīng)的數(shù)據(jù)緩沖區(qū)首地址和長(zhǎng)度寫入主題對(duì)應(yīng)的地址緩沖區(qū)AddrFifo 中;
(5)緩沖區(qū)狀態(tài)5 是收數(shù)應(yīng)用調(diào)用memRead 接口讀取地址緩沖區(qū)AddrFifo,并按照其中的首地址和長(zhǎng)度去數(shù)據(jù)緩沖區(qū)DataBuf 中獲取數(shù)據(jù)并使用;
(6)緩沖區(qū)狀態(tài)6 是指收數(shù)應(yīng)用在使用完數(shù)據(jù)后調(diào)用memPostRead 釋放對(duì)DataBuf 灰色區(qū)域的占用。
通過(guò)上述緩沖區(qū)狀態(tài)變化過(guò)程分析,數(shù)據(jù)從在應(yīng)用A 中產(chǎn)生到應(yīng)用B 中使用,沒(méi)有經(jīng)歷過(guò)數(shù)據(jù)拷貝,真正做到了零拷貝數(shù)據(jù)傳輸。而傳統(tǒng)的數(shù)據(jù)收發(fā)接口,即便同樣是基于共享內(nèi)存,發(fā)數(shù)應(yīng)用至少要將數(shù)據(jù)拷貝到發(fā)數(shù)緩沖區(qū),然后收數(shù)應(yīng)用將數(shù)據(jù)拷貝到應(yīng)用申請(qǐng)的地址空間,至少多出兩次數(shù)據(jù)拷貝時(shí)間。
在兩個(gè)DSP節(jié)點(diǎn)之間,數(shù)據(jù)收發(fā)采用Rapid IO協(xié)議,節(jié)點(diǎn)間的收發(fā)數(shù)流程如下。
(1)收發(fā)端基于主題進(jìn)行開(kāi)窗等初始化操作,窗口大小可配置,窗口地址由通信中間件統(tǒng)一管理;初始化時(shí)發(fā)端啟動(dòng)發(fā)數(shù)任務(wù),收端啟動(dòng)收數(shù)任務(wù)。
(2)發(fā)端所在節(jié)點(diǎn)包含一個(gè)統(tǒng)一的數(shù)據(jù)緩沖區(qū)DataBuf_send 和地址緩沖區(qū)AddrFifo,如圖6 所示。
圖6:發(fā)數(shù)端的部件調(diào)用接口過(guò)程和發(fā)數(shù)任務(wù)流程
1.首先在數(shù)據(jù)緩沖區(qū)申請(qǐng)一段空間(srioPreWrite),存放將要發(fā)送的數(shù)據(jù),真實(shí)數(shù)據(jù)前會(huì)由中間件添加一個(gè)包頭,包括要發(fā)送的目的SRIO 號(hào);
2.待數(shù)據(jù)放入數(shù)據(jù)緩沖區(qū)后,將該段數(shù)據(jù)的首地址和長(zhǎng)度放入地址緩沖區(qū)AddrFifo 內(nèi)(srioWrite);
3.發(fā)數(shù)任務(wù)通過(guò)讀取地址緩沖區(qū)AddrFifo 中的地址列表逐個(gè)發(fā)數(shù),發(fā)數(shù)的參數(shù)除了數(shù)據(jù)首地址和長(zhǎng)度,還包括數(shù)據(jù)包頭中數(shù)據(jù)的目的SRIO;
4.發(fā)數(shù)完成后,會(huì)緊接著發(fā)送一個(gè)門鈴給收端。
(3)收端對(duì)應(yīng)每個(gè)發(fā)數(shù)節(jié)點(diǎn)有獨(dú)立的收數(shù)緩沖區(qū)DataBuf_recv_i,(收數(shù)緩沖區(qū)直接在收窗映射的空間內(nèi)創(chuàng)建,不再額外申請(qǐng))對(duì)應(yīng)每一個(gè)訂閱的主題各有一個(gè)地址緩沖區(qū)AddrFifo_j,如圖7 所示。
圖7:收數(shù)端收數(shù)過(guò)程
1.收端在收到門鈴之后,響應(yīng)門鈴服務(wù)函數(shù)將門鈴號(hào)和門鈴值存放在DoorBellFifo 中,收數(shù)任務(wù)監(jiān)測(cè)DoorBellFifo,通過(guò)門鈴來(lái)源SRIO 號(hào)判斷收到的數(shù)據(jù)在哪個(gè)收數(shù)緩沖區(qū);
2.讀取收到的數(shù)據(jù)包頭,獲取該數(shù)據(jù)對(duì)應(yīng)的主題信息,將該段數(shù)據(jù)的首地址和長(zhǎng)度存入相應(yīng)主題在收數(shù)節(jié)點(diǎn)上對(duì)應(yīng)的地址緩沖區(qū);
3.部件通過(guò)srioRead 獲取AddrFifo_j 中相應(yīng)數(shù)據(jù)的首地址和長(zhǎng)度;
4.數(shù)據(jù)使用完畢后,通過(guò)srioPostRead 釋放數(shù)據(jù)空間。
DSP 節(jié)點(diǎn)間基于Rapid IO 的通信時(shí),兩個(gè)節(jié)點(diǎn)上緩沖區(qū)的狀態(tài)變化過(guò)程如圖8 所示。
圖8:節(jié)點(diǎn)間通信時(shí)緩沖區(qū)狀態(tài)
在CPU 節(jié)點(diǎn)間通常采用UDP 網(wǎng)絡(luò)傳輸協(xié)議,整個(gè)通信過(guò)程與上文所屬DSP 節(jié)點(diǎn)間基于Rapid IO 的通信中間件設(shè)計(jì)原理基本一致,文中不再重復(fù)描述。
針對(duì)雷達(dá)信息處理低時(shí)延需要,本文提出了一種嵌入式平臺(tái)高實(shí)時(shí)通信中間件設(shè)計(jì),其主要具有2 個(gè)特點(diǎn):
(1)從接口形式上來(lái)說(shuō),將收數(shù)和發(fā)數(shù)接口分別從一個(gè)設(shè)計(jì)為一對(duì),確保要發(fā)送的數(shù)據(jù)直接在發(fā)數(shù)緩沖區(qū)中產(chǎn)生,接收的數(shù)據(jù)直接在接收緩沖區(qū)中使用,真正做到數(shù)據(jù)零拷貝、降低時(shí)延;
(2)從覆蓋的底層傳輸協(xié)議來(lái)說(shuō),支持節(jié)點(diǎn)內(nèi)的共享內(nèi)存和節(jié)點(diǎn)間的Rapid IO 傳輸,并且可以做到節(jié)點(diǎn)內(nèi)和節(jié)點(diǎn)間傳輸協(xié)議的自適應(yīng),節(jié)省傳輸開(kāi)銷。