許富龍,張 強(qiáng),李 鵬,羅 玲
(1.中國民用航空飛行學(xué)院 空中交通管理學(xué)院,四川 廣漢 618307;2.中國西南電子技術(shù)研究所,成都 610036)
軟件無線電(Software Defined Radio,SDR)[1]是一種新型的無線電體系結(jié)構(gòu),它通過硬件和軟件的結(jié)合使無線電系統(tǒng)或設(shè)備具有可重配置能力[2],使相同的硬件可以通過軟件定義來獲得不同的功能。硬件通用化、功能軟件化是SDR系統(tǒng)的主要特點(diǎn)。在開放、可擴(kuò)展、結(jié)構(gòu)精簡的硬件通用平臺(tái)上,如何實(shí)現(xiàn)標(biāo)準(zhǔn)化的波形軟件建模、開發(fā)和部署,縮短系統(tǒng)開發(fā)時(shí)間,是SDR系統(tǒng)研發(fā)中需要解決的關(guān)鍵問題之一。在此背景下,軟件通信架構(gòu)(Software Communication Architecture,SCA)應(yīng)運(yùn)而生。
SCA起源于2000年,作為一個(gè)開放的軟件架構(gòu)標(biāo)準(zhǔn),它規(guī)定一組與波形功能無關(guān)的通用接口和規(guī)則,使基于此開發(fā)的波形應(yīng)用軟件具有良好的可移植性、可重用性和互操作性。2015年,SCA4.1版本發(fā)布,該版本對舊版進(jìn)行了大量變革,例如支持功能裁剪等。
盡管SCA圍繞SDR普適性的目標(biāo)不斷發(fā)展,但其通用的定位導(dǎo)致其接口功能臃腫,運(yùn)行效率較低[3-4]。在注重效益的SDR工業(yè)領(lǐng)域,尤其是機(jī)載SDR領(lǐng)域,基于SCA規(guī)范的研發(fā)常常遭遇困難。為此,本文將根據(jù)機(jī)載SDR的實(shí)際特點(diǎn),分析機(jī)載領(lǐng)域?qū)CA架構(gòu)的實(shí)際需求,并從功能裁剪和加載流程優(yōu)化兩方面提出SCA核心框架的優(yōu)化技術(shù),解決SCA架構(gòu)在機(jī)載SDR中的應(yīng)用問題。
圖1是典型的機(jī)載SDR硬件平臺(tái)[5],由通用射頻收發(fā)模塊和信號信息處理模塊通過數(shù)字交換網(wǎng)絡(luò)互連而成。通用射頻收發(fā)模塊用于射頻信號的上下變頻、濾波和射頻信號與數(shù)字信號的相互轉(zhuǎn)換。信號信息處理模塊完成數(shù)字信號處理和信息協(xié)議處理[5-6],其處理實(shí)際由模塊上的波形軟件完成。
圖1 機(jī)載SDR系統(tǒng)典型硬件結(jié)構(gòu)
信號信息處理模塊主要包括通用處理器(General Purpose Processors,GPP)、數(shù)字信號處理(Digital Signal Processing,DSP)、現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)等多種類型的處理器和Flash器件。當(dāng)系統(tǒng)運(yùn)行時(shí),各處理器從文件系統(tǒng)中加載所需的波形應(yīng)用軟件,執(zhí)行相應(yīng)的信號和信息處理程序,實(shí)現(xiàn)無線電功能。
機(jī)載SDR系統(tǒng)采用圖2所示的SCA軟件結(jié)構(gòu)。其中,底層驅(qū)動(dòng)之上、波形應(yīng)用之下的軟件統(tǒng)稱為運(yùn)行環(huán)境(Operating Environment,OE)。OE為波形應(yīng)用軟件提供完善的運(yùn)行平臺(tái)環(huán)境,并負(fù)責(zé)軟件平臺(tái)管理和組件執(zhí)行。OE主要包括嵌入式操作系統(tǒng)、傳輸機(jī)制、核心框架、平臺(tái)設(shè)備組件和服務(wù)組件。
圖2 SCA軟件結(jié)構(gòu)
SCA核心框架是OE的核心管理單元。SCA核心框架軟件實(shí)現(xiàn)SCA規(guī)范要求的API接口,管理平臺(tái)軟硬件資源,并負(fù)責(zé)波形軟件在系統(tǒng)中的加載、創(chuàng)建、執(zhí)行、配置和銷毀。SCA核心框架包含一套標(biāo)準(zhǔn)接口定義,使按照該接口開發(fā)的波形組件可以直接被核心框架調(diào)用和管理。因此,SCA核心框架使波形應(yīng)用與平臺(tái)的集成變得簡單,增強(qiáng)了波形軟件的可移植性。
雖然SCA能提升SDR系統(tǒng)的軟件開發(fā)和集成效率,但其接口冗余、資源浪費(fèi)、性能較低等缺點(diǎn)難以滿足機(jī)載需求。
實(shí)際上,機(jī)載SDR系統(tǒng)的體積、功耗等要求制約了硬件系統(tǒng)的資源規(guī)模[7];同時(shí),為了滿足DO-178C標(biāo)準(zhǔn)[8],SCA核心框架必須具備輕量、高效的特點(diǎn)。因此,必須對臃腫冗余的核心框架進(jìn)行優(yōu)化改進(jìn)。
功能單元裁剪既符合SCA 4.1規(guī)范優(yōu)化思路,也與機(jī)載軟件精簡緊湊的要求相一致。
SCA規(guī)范包含波形應(yīng)用的安裝和卸載能力。波形必須被“安裝”到系統(tǒng)中,才能獲得該波形應(yīng)用的工廠對象,當(dāng)不再需要一個(gè)波形時(shí),可通過“卸載”將其移除。
機(jī)載SDR系統(tǒng)不需要波形安裝和卸載能力。雖然安裝行為會(huì)對波形的軟件裝配描述文件(Software Assembly Descriptor,SAD)及其依賴的關(guān)聯(lián)文件進(jìn)行校驗(yàn),但該能力裁剪后仍然可以通過優(yōu)化保證安全,簡化運(yùn)行流程,有利于減小軟件規(guī)模提高和運(yùn)行效率。
為支持設(shè)備熱插拔,SCA規(guī)范提供了系統(tǒng)組件(設(shè)備組件和服務(wù)組件)的運(yùn)行時(shí)動(dòng)態(tài)注冊/注銷能力。機(jī)載SDR系統(tǒng)在運(yùn)行時(shí)不會(huì)插拔硬件模塊,所以不需要此能力。雖然在研發(fā)階段,該能力支持在不重啟系統(tǒng)的條件下多次加卸載系統(tǒng)組件,為測試工作提供便利,但加卸載系統(tǒng)組件的行為常常是由軟件運(yùn)行錯(cuò)誤引起的,此時(shí)為排查軟件錯(cuò)誤,重啟是更為常用的方法。此外,裁剪此能力一定程度上簡化了核心框架的復(fù)雜性,所以兼具瘦身和可靠性提升的優(yōu)點(diǎn)。
SCA系統(tǒng)中存在兩種組件:系統(tǒng)組件和波形組件。系統(tǒng)組件通常在啟動(dòng)階段由設(shè)備管理器根據(jù)設(shè)備配置描述文件(Device Configuration Descriptor,DCD)依次加載,而波形組件則在功能創(chuàng)建時(shí)由應(yīng)用工廠根據(jù)其SAD描述文件進(jìn)行加載。雖然兩種組件的加載時(shí)機(jī)不同、實(shí)施加載行為的主體不同,但其加載過程實(shí)質(zhì)上是類似的,都可以采用本文的加載流程優(yōu)化方法。為便于描述,后面主要針對波形組件來闡述加載流程優(yōu)化設(shè)計(jì)。
波形創(chuàng)建的步驟包括組件加載、組件執(zhí)行、端口連接和波形配置。其中,組件加載因?yàn)樾枰嵋茢?shù)據(jù)而較為耗時(shí)。在分布式環(huán)境下,組件的加載需要先從文件系統(tǒng)中讀取數(shù)據(jù),再通過總線傳輸?shù)侥康奶幚砥鳌R虼?,波形組件的加載速度主要取決于文件系統(tǒng)性能、總線傳輸速率。顯然,當(dāng)系統(tǒng)設(shè)計(jì)完成時(shí),這兩個(gè)參數(shù)就已經(jīng)確定。
可以從更高層面來分析波形加載時(shí)間問題。通常,一個(gè)波形應(yīng)用包括多個(gè)組件,而這些組件一般部署在不同處理器上。因此,一個(gè)波形應(yīng)用的“總”加載時(shí)間,還取決于各組件是串行加載還是并行加載。
3.1.1 SCA規(guī)范對波形加載的限制
SCA規(guī)范定義LoadableInterface接口用于組件加載,并要求可加載設(shè)備(LoadableDevice)實(shí)現(xiàn)該接口。該接口的load函數(shù)定義如下:
void load(in FileSystem fs,in string fileName,in LoadType loadKind);
raises(InvalidState,InvalidLoadKind,InvalidFileName,LoadFail)。
其中,參數(shù)fs指定被加載文件所在的文件系統(tǒng),filename是被加載文件名,loadKind指定加載類型。
當(dāng)創(chuàng)建一個(gè)波形應(yīng)用時(shí),首先為其每一個(gè)組件分配合適的處理器,而每一個(gè)處理器對應(yīng)一個(gè)可加載設(shè)備組件。隨后,SCA核心框架調(diào)用相應(yīng)的可加載設(shè)備組件的load函數(shù),完成組件加載。因?yàn)閘oad是同步函數(shù),所以核心框架的波形創(chuàng)建進(jìn)程在調(diào)用load時(shí)會(huì)被阻塞,直到組件加載結(jié)束后才從load返回。因此,SCA規(guī)范的組件加載實(shí)際是串行執(zhí)行的。例如波形Wave1有三個(gè)組件Comp1~3,分別要部署在處理器A、B和C,核心框架的加載行為類似于圖3(a)的偽代碼,其時(shí)間特性如圖3(b)所示。
圖3 SCA規(guī)范的波形加載示意圖
波形加載的總時(shí)長約為各組件加載時(shí)長之和,即
(1)
式中:ti是第i個(gè)組件的加載耗時(shí),n是組件數(shù)量,t′是分布式環(huán)境下的命令傳輸耗時(shí)??梢?,波形加載耗時(shí)較長,限制了系統(tǒng)性能。
3.1.2 SDR硬件架構(gòu)對波形加載的影響
出于對成本、性能等方面的考慮,不同的SDR系統(tǒng)在硬件設(shè)計(jì)上差異較大。SCA規(guī)范不對SDR的硬件做過多約束,使得硬件架構(gòu)設(shè)計(jì)具有很大的靈活性。
圖4列舉了兩種SDR硬件架構(gòu)。圖4(a)有三個(gè)文件系統(tǒng),采用交換總線與處理器相連;圖4(b)為控制成本,通過共享總線將一個(gè)文件系統(tǒng)(File System,FS)與處理器相連。這里仍以前面的波形加載為例,討論兩種硬件架構(gòu)對加載的影響。
圖4 影響加載的兩種硬件架構(gòu)
對于圖4(a)的硬件結(jié)構(gòu),多文件系統(tǒng)提升了文件服務(wù)能力。如果三個(gè)波形組件分別存儲(chǔ)在三個(gè)FS,并行加載不會(huì)使單個(gè)FS的負(fù)荷增大。同時(shí),交換總線也使點(diǎn)到點(diǎn)的帶寬不會(huì)因?yàn)橥瑫r(shí)傳輸而下降。因此,并行加載的性能如圖5所示,此時(shí)加載總時(shí)間約為單個(gè)組件加載時(shí)間中的最大值:
圖5 波形組件并行加載的時(shí)間特性
(2)
對于圖4(b)的硬件結(jié)構(gòu),單文件系統(tǒng)和共享總線下的并行加載不能顯著提升時(shí)間性能,甚至可能因形成瓶頸而使性能惡化。一方面,單文件系統(tǒng)在提供多個(gè)大文件的并行讀操作時(shí),工作負(fù)荷增大,調(diào)度開銷增加,其性能相對于串行讀取可能更低;另一方面,總線鏈路共享使多個(gè)數(shù)據(jù)流的同時(shí)傳輸相互影響。此時(shí)采用串行加載更為合適。
3.1.3 優(yōu)化原則
通過上述分析可知,“改串為并”,即采用并行方式加載波形組件是優(yōu)化加載時(shí)間性能的一個(gè)有效方法,但前提是硬件系統(tǒng)能夠?yàn)椴⑿屑虞d提供支持。對不適合并行加載的情形,例如上述共享式硬件架構(gòu)、從單文件系統(tǒng)中加載多個(gè)組件、組件間存在依賴關(guān)系導(dǎo)致無法并行加載等,仍適宜采用串行加載。實(shí)際上,很多SDR系統(tǒng)往往同時(shí)存在適合并行加載和適合串行加載的情形。因此,“串并共存”,即根據(jù)實(shí)際系統(tǒng)的具體情況來靈活配置和指定波形的加載方式,才是最符合實(shí)際需要的,這正是本文加載流程優(yōu)化設(shè)計(jì)的基本原則。該原則能夠根據(jù)實(shí)際系統(tǒng)的特點(diǎn),充分發(fā)揮硬件系統(tǒng)的并行加載潛力,既提升了時(shí)間性能,同時(shí)也能很好地兼容SCA規(guī)范。
3.2.1 接口設(shè)計(jì)
SCA規(guī)范的load函數(shù)是同步函數(shù)。為支持并行加載,本文設(shè)計(jì)了如圖6所示的異步加載接口。
圖6 異步加載接口及調(diào)用關(guān)系
(1)增加asynLoad函數(shù)
在SCA規(guī)范的標(biāo)準(zhǔn)接口LoadableInterface中增加asynLoad函數(shù)。該函數(shù)由loadableDevice組件實(shí)現(xiàn),供核心框架調(diào)用。
void asynLoad(in FileSystem fs,in string fileName,in LoadType loadKind,in loadResultCallbackObj resultCallbackObj);
raises(InvalidState,InvalidLoadKind,InvalidFileName)。
asynLoad函數(shù)是異步(非阻塞)函數(shù),它在啟動(dòng)波形加載過程后立即返回,不等待波形加載行為結(jié)束。因此,該函數(shù)執(zhí)行時(shí)間極短,不會(huì)使調(diào)用的進(jìn)程睡眠。波形創(chuàng)建進(jìn)程可以連續(xù)調(diào)用多個(gè)LoadableDevice的asynLoad函數(shù),使多個(gè)組件并行加載。
相比load函數(shù),asynload多了一個(gè)參數(shù)resultCallbackObj,該參數(shù)是一個(gè)loadResultCallbackObj類型的對象引用(指針),供loadableDevice組件在波形組件加載結(jié)束時(shí)通過回調(diào)將加載結(jié)果返回。該參數(shù)的細(xì)節(jié)見下一小節(jié)。
(2)新增LoadResultCallbackInterface接口
異步函數(shù)asynLoad無法向調(diào)用者返回加載結(jié)果,必須采用回調(diào)方式讓LoadableDevice在加載結(jié)束時(shí)上報(bào)加載結(jié)果。為此,增加LoadResultCallbackInterface接口,該接口只有一個(gè)resultCallback函數(shù)。
void resultCallback(in string fileName,in LoadResultType loadResult)。
其中,參數(shù)fileName指明被加載的波形組件,loadResult指出加載結(jié)果,LoadableDevice組件在完成加載后調(diào)用該函數(shù)將結(jié)果告知波形創(chuàng)建進(jìn)程。
在核心框架內(nèi)部,LoadResultCallbackObj對象應(yīng)實(shí)現(xiàn)LoadResultCallbackInterface接口。應(yīng)用工廠組件根據(jù)需要?jiǎng)?chuàng)建多個(gè)LoadResultCallbackObj對象。一個(gè)LoadResultCallbackObj對象對應(yīng)一個(gè)LoadableDevice組件。該對象將作為asynload函數(shù)的最后一個(gè)參數(shù)傳遞給LoadableDevice組件。
3.2.2 建模設(shè)計(jì)
為支持靈活的并/串行加載,需要設(shè)計(jì)一種標(biāo)準(zhǔn)的建模方法。SAD描述文件用于描述一個(gè)波形應(yīng)用的組件列表、裝配方法和內(nèi)部連接等特性。因此,本文選擇在SAD存儲(chǔ)組件的加載配置信息。該配置信息只包含一個(gè)加載批次(LoadBatch)屬性,具體設(shè)計(jì)如下:
(1)LoadBatch屬性是1~255的整型值,用于表示一個(gè)組件被加載的批次。
(2)LoadBatch屬性的具體位置是在SAD partitioning:componentplacement:componentinstantiation:componentproperties。每一個(gè)波形組件(實(shí)例)都對應(yīng)一個(gè)componentproperties元素,用于存儲(chǔ)該組件(實(shí)例)在創(chuàng)建及初始配置過程中所需使用的屬性值。因此,每一個(gè)組件(實(shí)例)都對應(yīng)一個(gè)LoadBatch屬性。
當(dāng)創(chuàng)建一個(gè)波形應(yīng)用時(shí),核心框架讀取其SAD文件獲知每一個(gè)組件的LoadBatch。如果未設(shè)置LoadBatch,核心框架將采用SCA規(guī)范的標(biāo)準(zhǔn)加載流程,從而實(shí)現(xiàn)對SCA規(guī)范的兼容。
3.2.3 算法設(shè)計(jì)
對一個(gè)波形應(yīng)用的多組件加載,采用“多批次的并行加載”設(shè)計(jì):同一批次內(nèi)采用并行加載,而不同批次之間是串行加載。組件的加載次序由其LoadBatch決定:先加載LoadBatch為1的組件,再加載LoadBatch為2的組件……直到所有組件都被加載。若多個(gè)組件的LoadBatch同為i,則它們將在第i批次中并行加載。
一個(gè)波形應(yīng)用的加載流程算法偽代碼如下:
1 fori=1;i<=255;i++ do
2 將批次號(LoadBatch)為i的所有組件,構(gòu)成集合Ф;//Ф內(nèi)的組件將并行加載
3 if(Ф不為空) then
4 forn=1;n<=|Ф|;n++ do //|Ф|代表Ф中組件個(gè)數(shù),Фn指Ф集合中第n個(gè)組件
5 獲取組件Фn的部署設(shè)備loadDev,回調(diào)對象cbObj,文件系統(tǒng)fs,文件名fn;
6 loadDev->asynload(fs,fn,EXECUTABLE,cbObj);//asynload調(diào)用后立即返回
7 end for
8
9 while(1) do
10 waitForLoadResult();//進(jìn)程將睡眠,直到收到Ф中某組件的加載結(jié)果后才喚醒
11 if(Ф中所有組件的加載結(jié)果已收齊)
12 break;//跳出while循環(huán),本批次組件加載完畢;
13 end if
14 end while
15
16 if(此波形的所有組件都已執(zhí)行加載動(dòng)作)
17 break;//跳出for循環(huán),此波形加載結(jié)束!
18 end if
19 end if
20 end for
4~7行的for語句循環(huán)調(diào)用asynLoad函數(shù),使第i批次的所有n個(gè)組件并行加載。9~14行的while語句用于等待第i批次n個(gè)組件的加載結(jié)果。每當(dāng)執(zhí)行到10行時(shí),波形創(chuàng)建進(jìn)程將睡眠等待,直到LoadDevice組件調(diào)用resultCallback函數(shù)上報(bào)加載結(jié)果時(shí),該進(jìn)程才被喚醒,此時(shí)采用11行if語句檢查n個(gè)組件的加載結(jié)果是否已收齊:若是,本批次加載結(jié)束;否則將回到10行繼續(xù)等待其他組件的加載結(jié)果。當(dāng)程序執(zhí)行到16行時(shí),本批次的加載已完成,此時(shí)若該波形的所有組件都已加載,則流程結(jié)束;否則將啟動(dòng)下一批次加載。
上述算法可以靈活地使波形的多個(gè)組件以任意期望的順序和串/并方式被加載,滿足任意系統(tǒng)對波形加載流程的優(yōu)化需要。
實(shí)驗(yàn)采用信號處理測試平臺(tái)。該平臺(tái)集成通用信號處理模塊,包含PPC、DSP和FPGA等高性能處理單元。為便于測試,編寫了相關(guān)測試設(shè)備組件和測試波形組件。
結(jié)果表明,采用本文優(yōu)化技術(shù)的核心框架能夠正常啟動(dòng)和運(yùn)行,當(dāng)設(shè)置了各個(gè)組件LoadBatch值時(shí),核心框架能夠讀取LoadBatch值并按模型意圖正確地實(shí)施組件加載。
實(shí)驗(yàn)結(jié)果表明,采用本文優(yōu)化技術(shù),核心框架的啟動(dòng)時(shí)間有所縮短。表1是波形加載時(shí)間的優(yōu)化結(jié)果,可以看出,并行加載可有效縮短波形加載時(shí)間。組件數(shù)量為2的數(shù)據(jù)表明,各組件尺寸的差異越小,并行加載的時(shí)間優(yōu)化效果越好。此外,當(dāng)組件數(shù)量為4時(shí),優(yōu)化效果有所下降,這是因?yàn)?個(gè)組件被分成了兩個(gè)批次進(jìn)行加載。
表1 波形加載時(shí)間優(yōu)化結(jié)果
上述結(jié)果表明,本文的優(yōu)化技術(shù)可有效降低核心架構(gòu)的自身開銷,提升架構(gòu)性能。
本文分析了SCA架構(gòu)在機(jī)載SDR系統(tǒng)中的不足,并從功能裁剪和加載流程優(yōu)化兩方面提出了核心框架優(yōu)化方法。實(shí)驗(yàn)結(jié)果表明,該方法不僅使架構(gòu)更精簡,而且能充分地發(fā)揮硬件系統(tǒng)的并行加載潛力,有效提升機(jī)載系統(tǒng)中SCA架構(gòu)的可用性,對面向機(jī)載SDR系統(tǒng)的SCA核心框架優(yōu)化具有一定指導(dǎo)意義。