顏 軍 龔永紅 許怡冰 蔣曉華 唐芳福 沈祖崮
珠海歐比特宇航科技股份有限公司,珠海 519080
隨著現(xiàn)代航空航天飛行器智能化和信息化水平的不斷提高,其飛行控制任務(wù)變得越來越復(fù)雜,處理的信息量及計(jì)算量劇增,對飛行控制任務(wù)的實(shí)時(shí)性、可靠性要求變得更加苛刻,對所采用的處理器要求也越來越高。SPARC架構(gòu)處理器于2000年左右被引入中國,在航天領(lǐng)域獲得成功應(yīng)用,至今仍是中國航天領(lǐng)域的主流處理器[1]。
歐比特公司自主研制的與LEON4核完全兼容的抗幅照S698PM宇航處理器于2013年推出芯片。該芯片是世界上第一款基于LEON4核的SOC芯片,芯片除了具有LEON4核的優(yōu)點(diǎn)外,還集成了豐富的片內(nèi)外設(shè)[2]。S698PM宇航芯片已經(jīng)成功應(yīng)用于多個型號項(xiàng)目。
圍繞著S698PM宇航芯片,歐比特聯(lián)合多方研制推出了一整套的軟件生態(tài)系統(tǒng),包括:操作系統(tǒng)BSP包、軟件集成開發(fā)環(huán)境和軟件調(diào)試工具等。
S698PM支持目前市場上主流的多種嵌入式操作系統(tǒng)(EOS),包括VxWorks和RTEMS等。歐比特公司專門為這些嵌入式操作系統(tǒng)移植開發(fā)了針對S698PM處理器的板級支持包(BSP)。
OBT VxWorks BSP是歐比特公司在VxWorks 6.7操作系統(tǒng)基礎(chǔ)上針對S698PM多核處理器開發(fā)的BSP包軟件。在SMP系統(tǒng)中,當(dāng)任務(wù)同時(shí)運(yùn)行時(shí),可能會產(chǎn)生鎖死的情況和負(fù)載不均衡問題[3],為了防止這兩種問題發(fā)生,在OBT VxWorks BSP中設(shè)計(jì)了多任務(wù)調(diào)度機(jī)制、中斷機(jī)制和互斥機(jī)制等軟件技術(shù)約束管理任務(wù),解決了SPARC并行多核架構(gòu)的軟件處理問題[2]。
2.1.1 中斷機(jī)制設(shè)計(jì)
OBT VxWorks BSP為S698PM 4個CPU分配中斷,通過CPU內(nèi)部的LOCAL APIC控制器處理中斷[4]。OBT VxWorks BSP以優(yōu)先級為準(zhǔn)則,對中斷進(jìn)行判定和排隊(duì),對中斷隊(duì)列中的中斷進(jìn)行分派。
在OBT VxWorks BSP中,每一個中斷都可以掛載在4個CPU上,但同時(shí)只允許一個CPU響應(yīng)中斷[5]。OBT VxWorks BSP對LOCAL APIC進(jìn)行編程,讓所有中斷都被一個CPU處理,默認(rèn)設(shè)置為CPU0。通過函數(shù)intCtrlISREnable()對全局變量VXB_INTCTLR_SPECIFIC_N進(jìn)行賦值(0、1、2和3),決定由哪個CPU來處理中斷。當(dāng)外部中斷發(fā)生時(shí),如果CPU0的中斷鎖打開,則CPU0處理中斷,并發(fā)送Message通知其它CPU,否則中斷會被發(fā)送到其它的CPU處理,其設(shè)計(jì)流程如圖1所示。
圖1 中斷設(shè)計(jì)流程
2.1.2 互斥機(jī)制設(shè)計(jì)
在OBT VxWorks BSP中提供了中斷自旋鎖和任務(wù)自旋鎖,分別控制任務(wù)和中斷對臨界段的訪問。當(dāng)任務(wù)獲得某個中斷自旋鎖時(shí),運(yùn)行該任務(wù)的CPU核會自動關(guān)中斷,保護(hù)該任務(wù)的臨界資源。中斷自旋鎖可以在任務(wù)和中斷中調(diào)用,任務(wù)自旋鎖只允許有任務(wù)自旋,運(yùn)行該任務(wù)的CPU核不允許其他任務(wù)的優(yōu)先搶占。
在中斷自旋鎖中,設(shè)計(jì)了自旋鎖的歸屬字段、在每一個核下的使用情況、運(yùn)行的中斷級別和任務(wù)控制塊。在初始化時(shí),這些參數(shù)設(shè)置為0,代表不被任何處理器使用。獲取中斷自旋鎖要先判斷是否已經(jīng)被其它任務(wù)或者中斷取得,如果沒有則獲取該鎖,同時(shí)改變該鎖的狀態(tài),將自旋鎖的歸屬字段設(shè)置為當(dāng)前CPU的ID號,表示自旋鎖正在被該CPU占用,將該CPU ID下的使用情況設(shè)置為USING。
在任務(wù)自旋鎖中,設(shè)計(jì)了擁有權(quán)的標(biāo)識、下一個可獲取該鎖的任務(wù)標(biāo)識和鎖的狀態(tài)。在獲取任務(wù)鎖時(shí)應(yīng)判斷該鎖是否為空閑狀態(tài),獲取后改變該鎖的狀態(tài),同時(shí)設(shè)置下一個獲取該鎖的任務(wù)ID,并設(shè)置鎖的狀態(tài)為忙碌,使用完成后應(yīng)釋放該鎖,設(shè)置鎖的狀態(tài)為空閑。
目前航天系統(tǒng)中常用的SPARC處理器VxWorks操作系統(tǒng)還是基于5.4內(nèi)核版本,VxWorks 5.4使用了幾十年,雖然可靠性經(jīng)過了充分驗(yàn)證,但隨著硬件的發(fā)展,已經(jīng)越來越顯示出弊端。與之對比,VxWorks6.7結(jié)合OBT VxWorks BSP的系統(tǒng)在以下幾個方面進(jìn)行了加強(qiáng)和優(yōu)化。
2.2.1 實(shí)時(shí)進(jìn)程處理對比
在運(yùn)行多任務(wù)時(shí),傳統(tǒng)SPARC只能按照優(yōu)先級順序進(jìn)行調(diào)度,當(dāng)有緊急需要處理的實(shí)時(shí)任務(wù)插入時(shí),操作系統(tǒng)只能將當(dāng)前運(yùn)行的任務(wù)掛起,去執(zhí)行實(shí)時(shí)任務(wù),雖然實(shí)時(shí)任務(wù)得到了執(zhí)行,但這是在犧牲當(dāng)前任務(wù)實(shí)時(shí)性的前提下實(shí)現(xiàn)的,這種機(jī)制無疑不是最佳的解決方式。
為了既能保證當(dāng)前任務(wù)的實(shí)時(shí)性,又能立即執(zhí)行實(shí)時(shí)任務(wù),在OBT VxWorks BSP中設(shè)計(jì)了實(shí)時(shí)任務(wù)保護(hù)控制模塊,存放在分區(qū)表中,該分區(qū)中控制模塊運(yùn)行的程序與內(nèi)核獨(dú)立。
當(dāng)有實(shí)時(shí)任務(wù)插入時(shí),將該任務(wù)放入到實(shí)時(shí)任務(wù)保護(hù)控制模塊中,由于分區(qū)控制模塊與內(nèi)核獨(dú)立,因此可以立即執(zhí)行該實(shí)時(shí)任務(wù),并且不會影響內(nèi)核原先的調(diào)度,與內(nèi)核運(yùn)行的任務(wù)沒有關(guān)系??梢钥闯?,OBT VxWorks BSP設(shè)計(jì)的實(shí)時(shí)任務(wù)保護(hù)控制模塊解決了傳統(tǒng)SPARC對實(shí)時(shí)任務(wù)處理的不足。
2.2.2 多任務(wù)處理對比
傳統(tǒng)SPARC不支持多任務(wù)同時(shí)運(yùn)行,其處理多任務(wù)的方式還是按照優(yōu)先級進(jìn)行順序執(zhí)行。當(dāng)處理一個較為復(fù)雜的算法任務(wù)時(shí),嚴(yán)格按照代碼的順序去執(zhí)行[6],這樣會導(dǎo)致處理的時(shí)間過長,效率低下。而在OBT VxWorks BSP中,可以將該算法按照需求進(jìn)行拆解,拆分成多個任務(wù)同時(shí)執(zhí)行,而且可以指定任務(wù)均勻的分布在4個CPU中運(yùn)行,各個CPU獨(dú)立運(yùn)行各自的任務(wù),不用等待,因此相比傳統(tǒng)SPARC BSP來言,大大減少了處理算法的時(shí)間,而且大大提升了執(zhí)行多任務(wù)的效率。
2.2.3 網(wǎng)絡(luò)協(xié)議棧對比
傳統(tǒng)SPARC中網(wǎng)絡(luò)協(xié)議功能較少,僅支持IPV4和FTP協(xié)議的基本內(nèi)容,當(dāng)用戶需要使用其它復(fù)雜的網(wǎng)絡(luò)協(xié)議時(shí),需要花費(fèi)時(shí)間進(jìn)行開發(fā)。
OBT VxWorks BSP在傳統(tǒng)SPARC網(wǎng)絡(luò)協(xié)議中增加了目前主流的IPV6協(xié)議,TCP協(xié)議和UDP等網(wǎng)絡(luò)傳輸協(xié)議,并且采用組件的方式對這些網(wǎng)絡(luò)協(xié)議功能進(jìn)行了封裝,用戶只需在Workbench圖形界面中進(jìn)行簡單的配置就能實(shí)現(xiàn)所需功能,與傳統(tǒng)SPARC開發(fā)相比節(jié)省了開發(fā)時(shí)間。
2.2.4 傳輸文件速率對比
傳統(tǒng)SPARC采用文件系統(tǒng)的方式實(shí)現(xiàn)文件傳輸,如TSFS、dosFS和TFFS。這3種方式均采用IO方式實(shí)現(xiàn)文件的傳輸,雖然能實(shí)現(xiàn)流量傳輸,但在傳輸大文件時(shí),其IO方式傳輸還是顯得速率低下,且這3種文件系統(tǒng)能保存的文件大小只有幾百K,因此在大文件傳輸時(shí),需要用戶將文件進(jìn)行拆分,按照單個文件的形式按順序傳輸,同時(shí)接收方需要對這些文件進(jìn)行重組,為了保證傳輸?shù)陌踩?,需要用戶指定?yán)格的協(xié)議來制約,增加用戶的開發(fā)時(shí)間。
OBT VxWorks BSP針對上述現(xiàn)象,在傳統(tǒng)SPARC中增加設(shè)計(jì)了NFS文件系統(tǒng),通過100M以太網(wǎng)方式實(shí)現(xiàn)文件的傳輸,提高了通訊的速度,且文件大小沒有限制,不用用戶進(jìn)行分包和組包工作,如圖2所示。
圖2 文件系統(tǒng)對比圖
從圖2可以看出,傳統(tǒng)SPARC VxWorks傳遞大文件時(shí)需要進(jìn)行多次傳遞工作,而OBT VxWorks BSP NFS文件系統(tǒng)只需一次就能完成文件傳輸,大大的縮減了傳輸文件的時(shí)間;且由于OBT VxWorks BSP NFS文件系統(tǒng)采用了TCP協(xié)議,因此其安全性能得到保證。
OBT VxWorks BSP不僅支持S698PM,也支持其他SPARC處理器,如:AT697、GR712等,借助OBT VxWorks BSP完全可以使VxWorks6.7成為航天用SPARC處理器主流操作系統(tǒng)。
S698PM芯片集成4個高性能處理器核心,提高了單芯片的處理能力;采用7級指令流水,提高了指令執(zhí)行效率[6];采用128-bit的AHB作為處理器核間的互聯(lián)總線,降低了處理器總線沖突,提高了處理器間的通訊效率;片內(nèi)集成了512KB的大容量二級緩存,提高了處理器核訪問存儲器的命中率和效率[7];片外支持DDR2高速存儲器,提高了存儲器控制器訪問外部存儲器的速度。這一系列的措施,使得S698PM芯片較其它同類型芯片在性能上有了大幅度的提升。
使用基準(zhǔn)測試程序Dhrystone和Whetstone分別對S698PM芯片的整型處理能力和浮點(diǎn)處理能力進(jìn)行測試。Dhrystone是測量處理器運(yùn)算能力最常見的基準(zhǔn)程序之一,常用于處理器整型運(yùn)算性能的測量。Dhtrystone基準(zhǔn)程序由主程序和3個函數(shù)、8個過程組成。各函數(shù)和過程分別用來測試字符串、記錄及整數(shù)運(yùn)算。Dhrystone的計(jì)量單位為DMIPS。Whetstone用于測浮點(diǎn)計(jì)算能力,計(jì)算單位是MFLOPS。S698PM在各個頻點(diǎn)的性能指標(biāo)數(shù)據(jù)如圖3。
圖3 S698PM芯片在不同主頻時(shí)的處理性能實(shí)測值
將S698PM芯片做橫向比較,匯總各類官方數(shù)據(jù),對比目前市場上主流高可靠嵌入式SPARC SOC芯片的處理能力及性能(為了便于比較,所有SOC芯片的綜合處理性能指標(biāo)統(tǒng)一換算為DMIPS/MHz,浮點(diǎn)處理性能指標(biāo)統(tǒng)一換算為MFLOPS/MHz),可得出如下幾種比較圖:
圖4 SPARC SOC芯片最高主頻比較圖
圖5 SPARC SOC芯片處理性能比較圖
可以看出:S698PM SOC芯片無論是最高頻率還是綜合處理性能、浮點(diǎn)處理性能等方面都很有優(yōu)勢。
FFT算法是頻域圖像處理中最重要的核心算法之一,是影響數(shù)字圖像處理軟件系統(tǒng)整體效率的關(guān)鍵,工程實(shí)用性強(qiáng)。FFT具有原位性特征,較適合進(jìn)行并行運(yùn)算處理。
傳統(tǒng)設(shè)計(jì)多采用AT697與VxWorks5.4操作系統(tǒng)實(shí)現(xiàn)FFT算法,速度較慢,難以滿足日益增長的高速數(shù)據(jù)處理要求。本設(shè)計(jì)采用S698PM處理器和VxWorks6.7操作系統(tǒng)實(shí)現(xiàn)FFT算法,通過多核并行,大大提高運(yùn)算效率。設(shè)計(jì)的難點(diǎn)是處理好FFT算法本身的并行化以及實(shí)現(xiàn)S698PM 4個處理器核的協(xié)調(diào)工作。
FFT的一般輸入形式是一組包含N個復(fù)數(shù)的數(shù)組。N一般是2的冪次級。有許多不同的方法來實(shí)現(xiàn)FFT,但最典型的是時(shí)間抽取法[8]。以8個數(shù)據(jù)輸入點(diǎn)的FFT變換為例,時(shí)間抽取的蝶形變換方法如圖6。
圖6 FFT時(shí)間抽取的蝶形變換圖
左邊的x[i]是FFT輸入,右邊的x[i]是FFT輸出,箭頭表示每個中間階段的輸入到輸出。
蝶形運(yùn)算的一般規(guī)律:原位運(yùn)算。觀察8點(diǎn)DIF-FFT運(yùn)算流程圖可以歸納出來,其每級每列計(jì)算都是由N/2個蝶形運(yùn)算構(gòu)成,由1次復(fù)數(shù)乘法和2次復(fù)數(shù)加減法組成。
某一列的任何2個節(jié)點(diǎn)k和j的節(jié)點(diǎn)變量進(jìn)行蝶形運(yùn)算后,得到結(jié)構(gòu)為下一列k,j兩節(jié)點(diǎn)的節(jié)點(diǎn)變量,與其他節(jié)點(diǎn)無關(guān),所以可以采用原位運(yùn)算。計(jì)算完一級后立刻把結(jié)果存進(jìn)原來的內(nèi)存單元,再進(jìn)行下一級的運(yùn)算。那么輸入到結(jié)果輸出其內(nèi)存單元不變,如N=1024,則整個FFT只需要1024個長整型單元即可。這樣就可以大量節(jié)省儲存單元,方便處理器低資源運(yùn)行。
分析圖6可以看出,如果是2個CPU核參與并行處理,可以完全并行完成到最后階段,不需要CPU之間的數(shù)據(jù)交換。在最后一個階段,每個CPU需要使用其他CPU產(chǎn)生的結(jié)果,因此需做同步處理,等待所有CPU都處理完成后再進(jìn)行。而如果是4 個CPU參與并行處理,并行處理可以進(jìn)行到倒數(shù)第二階段,之前都不需要進(jìn)行數(shù)據(jù)交換。而倒數(shù)第二階段和最后一個階段開始之前都需要進(jìn)行CPU同步,等待所有CPU處理完成后再進(jìn)行。
一般來說,階段數(shù)M與輸入點(diǎn)數(shù)N的關(guān)系為M=log2N。例如8192個輸入點(diǎn)的FFT運(yùn)算,總共有13個階段需要處理。前11階段,即大部分工作,可以完全獨(dú)立地在4個CPU上并行完成,每個CPU處理一塊2048個點(diǎn)的輸入。以上處理完后需要同步,再并行完成倒數(shù)第二階段運(yùn)算,之后再同步,并行完成最后一個階段的運(yùn)算。
系統(tǒng)上電時(shí),CPU0開始運(yùn)行,CPU1/CPU2/CPU3處于關(guān)閉模式,CPU0執(zhí)行其對應(yīng)的VxWorks任務(wù),在任務(wù)中使能其它3個CPU。其它的CPU被喚醒后,開始執(zhí)行屬于自己的VxWorks任務(wù),任務(wù)的主要功能是進(jìn)行FFT運(yùn)算處理,任務(wù)最開始是等待一個信號量A,這個信號量由CPU0給出。
當(dāng)CPU0在任務(wù)中建立了測試數(shù)據(jù),完成了數(shù)據(jù)隊(duì)列排序,初始化好共享內(nèi)存中的控制塊后,向其它CPU發(fā)送信號量A,并進(jìn)入運(yùn)算流程。其它CPU得到信號量A后開始并行處理當(dāng)前階段的FFT運(yùn)算,運(yùn)算完成后向CPU0發(fā)送信號量B,然后返回到之前等待信號量A的狀態(tài)。CPU0收到所有CPU發(fā)送過來的信號量B后,表示所有CPU完成了工作,結(jié)束本階段的運(yùn)算處理,進(jìn)入下一個運(yùn)算階段,下一階段的執(zhí)行過程與上述相同。最后階段完成后,F(xiàn)FT的運(yùn)算結(jié)果會保持在制定內(nèi)存中,CPU0負(fù)責(zé)打印輸出結(jié)果。
基于VxWorks操作系統(tǒng)的FFT程序編輯完后,使用SPARC編譯器進(jìn)行編譯。運(yùn)行DMON調(diào)試器,連接S698PM硬件平臺后下載程序并執(zhí)行,觀察到的程序運(yùn)行結(jié)果如圖7。
圖7 FFT算法程序在S698PM平臺上的執(zhí)行結(jié)果
以上的測試條件為:8192個輸入點(diǎn),100次FFT循環(huán)計(jì)算;S698PM處理器啟用了L2高速緩存,處理器主頻為400MHz,總線頻率200MHz。對比同等條件下在S698P4處理器平臺以及AT697平臺下的測試結(jié)果,最終測試數(shù)據(jù)比較如圖8所示。
圖8 FFT運(yùn)算運(yùn)行結(jié)果分析
實(shí)測表明:在設(shè)計(jì)合理的情況下,使用S698PM處理器4核進(jìn)行FFT運(yùn)算比使用單核運(yùn)算,運(yùn)算速度提高了3.26倍,對比AT697處理器平臺,運(yùn)算速度提高了約20倍。實(shí)驗(yàn)數(shù)據(jù)充分說明:S698PM處理器無論是峰值處理能力還是并行化運(yùn)算性能都比前代產(chǎn)品有了較大的提升。
綜上所述,S698PM是一款高可靠、高性能、高集成度的SPARC V8 SMP架構(gòu)多核SOC芯片,其設(shè)計(jì)合理,片上外設(shè)資源豐富,芯片可廣泛應(yīng)用于航空、航天領(lǐng)域,特別適用于需兼顧大量運(yùn)算和復(fù)雜控制的宇航電子系統(tǒng)。同時(shí),S698PM芯片的軟件支持到位,支持多種嵌入式操作系統(tǒng),專門設(shè)計(jì)的操作系統(tǒng)BSP包降低了用戶使用多核處理以及開發(fā)并行應(yīng)用程序的門檻,并且這些軟件系統(tǒng)都經(jīng)過了大量的應(yīng)用驗(yàn)證。