徐 帥,林寶軍,劉迎春,趙 帥
(1.中國科學(xué)院空天信息創(chuàng)新研究院,北京 100094;2.中國科學(xué)院大學(xué),北京 100094;3.中國科學(xué)院微小衛(wèi)星創(chuàng)新研究院,上海201203;4.上??萍即髮W(xué)信息科學(xué)與技術(shù)學(xué)院,上海 201203)
2018年,北斗三號導(dǎo)航衛(wèi)星系統(tǒng)完成19顆衛(wèi)星發(fā)射、組網(wǎng)基本系統(tǒng)的建成,可以向全球提供服務(wù)[1]。至2020年底,北斗導(dǎo)航系統(tǒng)將全面建成,30顆衛(wèi)星在軌組網(wǎng)運(yùn)行,向全球提供定時(shí)、測速、授時(shí)的導(dǎo)航功能。北斗三號衛(wèi)星配備了Ka頻段星間鏈路,1顆衛(wèi)星可與多顆衛(wèi)星建鏈[2],未來可能還會搭載通信速率更快的激光星間鏈路,使得星間通信速率從幾百Kb/s提升至1 Gb/s。隨著星間鏈路的廣泛應(yīng)用,大量的遙控、遙測、導(dǎo)航和測量等數(shù)據(jù)由星間鏈路傳輸至每一顆衛(wèi)星的星載計(jì)算機(jī)內(nèi)進(jìn)行處理,衛(wèi)星網(wǎng)絡(luò)也需要傳輸和處理網(wǎng)絡(luò)管理信息,這些都對星上計(jì)算機(jī)系統(tǒng)的性能提出了更高要求。文獻(xiàn)[3]中提出了基于星間鏈路的集中式自主導(dǎo)航算法,配合星間鏈路的高速率數(shù)據(jù)傳輸,在同等周期下,星載計(jì)算機(jī)需要處理和存儲更多的數(shù)據(jù),配備更快的通信接口。這些都對現(xiàn)有CPU的頻率、存儲、數(shù)據(jù)接口提出了挑戰(zhàn),軟件方面也需要設(shè)計(jì)復(fù)雜算法,搭建高速數(shù)據(jù)存儲交互的基礎(chǔ)環(huán)境。
2018年中國科協(xié)年會中楊長風(fēng)總設(shè)計(jì)師提出了北斗導(dǎo)航系統(tǒng)未來瞄準(zhǔn)PNT(Positioning Navigation Timing)體系[4],實(shí)現(xiàn)更高精度的導(dǎo)航,信息更多元化,空天地一體化??梢灶A(yù)見,北斗衛(wèi)星的星載計(jì)算機(jī)處理能力仍將不斷提升。
國產(chǎn)星載計(jì)算機(jī)的發(fā)展比國外起步晚,最早多采用運(yùn)行能力只有幾MIPS的處理器,目前中國科學(xué)院研制的北斗衛(wèi)星在軌星載計(jì)算機(jī),采用一種基于核心部件全部自主可控的高運(yùn)算性能和高數(shù)據(jù)傳輸性能的方案,即以龍芯中科公司生產(chǎn)的龍芯1E高性能宇航級處理器芯片為主構(gòu)建硬件環(huán)境,采用32位龍芯2號處理器,2 MB Flash和128 MB SDRAM存儲架構(gòu),以1553B總線為通信接口。
星載操作系統(tǒng)經(jīng)過了由簡單順序執(zhí)行的無系統(tǒng)模式到功能強(qiáng)大的實(shí)時(shí)操作系統(tǒng)VxWorks的發(fā)展過程,其優(yōu)越的實(shí)時(shí)性和可裁剪內(nèi)核等優(yōu)勢使其在星載操作系統(tǒng)中成為標(biāo)桿。目前,星載操作系統(tǒng)多運(yùn)行在較低頻率和小存儲空間的星載計(jì)算機(jī)中[5],在設(shè)備驅(qū)動(dòng)方面,外設(shè)驅(qū)動(dòng)采用由應(yīng)用程序直接調(diào)用的管理方式,需要設(shè)計(jì)更多面向高頻高速多接口的星載計(jì)算機(jī)操作系統(tǒng)管理方案。
為適應(yīng)類似新需求,星載計(jì)算機(jī)將采用升級的新型龍芯1E高性能處理器芯片,通信峰值速率提升100倍,處理峰值速度提升2倍[6]。在軟件方面,對星上軟件和操作系統(tǒng)VxWorks 6.8進(jìn)行移植,同時(shí)為配合衛(wèi)星網(wǎng)絡(luò)通信需求,并保證其可靠性、獨(dú)立性,將外設(shè)驅(qū)動(dòng)修改為由內(nèi)核管理,為多線程多任務(wù)運(yùn)行創(chuàng)建軟件基礎(chǔ)。
本文將對VxWorks 6.8進(jìn)行板級支持包BSP(Board Support Package)開發(fā)[7]、移植操作系統(tǒng)到新型1E芯片,在設(shè)備驅(qū)動(dòng)開發(fā)中采用新型VxBus型架構(gòu)[8],并配置操作系統(tǒng)組件。
新型龍芯1E芯片具有頻率更高、處理速度更快等優(yōu)點(diǎn),處理器核采用64位雙發(fā)射龍芯2號GS232,峰值頻率由以前的100 MHz提升到200 MHz,定點(diǎn)峰值性能從200 MIPS提升到400 MIPS,較上一代芯片處理速度有成倍的提升;SDRAM空間提升至256 MB;通信接口方面除傳統(tǒng)的1553B外,還配備了SpaceWire高速通信接口,峰值速度從1 Mb/s提升到200 Mb/s。SpaceWire和DMA相結(jié)合,可實(shí)現(xiàn)遠(yuǎn)程訪問內(nèi)存的功能。
軟件需采用一個(gè)較好的解決方案實(shí)現(xiàn)相應(yīng)的移植開發(fā):
(1)軟件開發(fā)環(huán)境、編譯方法。
星上軟件目前開發(fā)環(huán)境為代碼閱讀器+命令行編譯。該方式有以下缺點(diǎn):對復(fù)雜工程管理不足,對應(yīng)用程序開發(fā)和調(diào)試不友好,對VxWorks內(nèi)核和驅(qū)動(dòng)等組件添加、刪除不方便等。并且未來星載計(jì)算機(jī)發(fā)展到多核CPU后,該編譯方式不能支持VxWorks對稱多處理器SMP(Symmetrical Multi-Processing)編譯。對于VxWorks 6.8的編譯,風(fēng)河公司推出WorkBench編譯器作為開發(fā)工具,該編譯器界面友好,方便對BSP[8]、內(nèi)核、驅(qū)動(dòng)、應(yīng)用程序?qū)崿F(xiàn)相互獨(dú)立開發(fā),適合管理復(fù)雜的星載軟件工程。在系統(tǒng)組件方面可以實(shí)現(xiàn)一鍵添加和刪除,大大提升了開發(fā)效率。
(2)驅(qū)動(dòng)程序管理方式。
星載計(jì)算機(jī)驅(qū)動(dòng)程序管理方式分為3類:應(yīng)用程序直接管理、通過內(nèi)核調(diào)用驅(qū)動(dòng)、通過系統(tǒng)擴(kuò)展模塊調(diào)用驅(qū)動(dòng)程序(例如網(wǎng)絡(luò))。文獻(xiàn)[9]中指出由應(yīng)用程序直接管理代碼效率高,實(shí)時(shí)性較高,但面向多核多線程運(yùn)算時(shí)這種驅(qū)動(dòng)模式可能會造成緩存數(shù)據(jù)沖突,產(chǎn)生死鎖等問題。本文采用風(fēng)河公司推出的VxBus型驅(qū)動(dòng)架構(gòu)管理驅(qū)動(dòng)程序,該架構(gòu)對設(shè)備管理結(jié)構(gòu)更清晰,開發(fā)更簡便,可在WorkBench編譯器中配置,在層次上VxBus型驅(qū)動(dòng)和內(nèi)核、應(yīng)用程序獨(dú)立,為其他層次提供統(tǒng)一接口,具有更好的可靠性、可移植性等優(yōu)點(diǎn),為應(yīng)用層開發(fā)提供便利。
(3)對新型1E芯片硬件環(huán)境適配。
本文硬件平臺選用新型芯片,在操作系統(tǒng)移植過程中,對硬件環(huán)境做相應(yīng)的適配:配合更大數(shù)據(jù)存儲和計(jì)算需求,內(nèi)存管理增加VxWorks 任務(wù)棧、中斷??臻g等VxWorks系統(tǒng)管理空間,并采用VxBus型驅(qū)動(dòng)管理中斷驅(qū)動(dòng),在系統(tǒng)啟動(dòng)時(shí)對相應(yīng)組件和中斷向量表進(jìn)行配置。為支持自主導(dǎo)航算法中大量浮點(diǎn)等復(fù)雜計(jì)算和C++編譯環(huán)境,在VxWorks啟動(dòng)階段配置協(xié)處理器開啟浮點(diǎn)計(jì)算,在操作系統(tǒng)初始化階段添加C++組件。
板級支持包BSP,顧名思義,它是應(yīng)用于操作系統(tǒng)和硬件資源之間的相關(guān)軟件集合。其主要功能是配置硬件,為操作系統(tǒng)屏蔽硬件,使得上層軟件開發(fā)不需配置底層,并且在此基礎(chǔ)上,BSP要完成操作系統(tǒng)的引導(dǎo)和啟動(dòng),外設(shè)驅(qū)動(dòng)和內(nèi)核初始化等任務(wù),使得操作系統(tǒng)可以運(yùn)行在不同的硬件環(huán)境中。從層次上分,BSP也屬于操作系統(tǒng)的一部分,如圖1所示。
Figure 1 VxWorks operating system structure圖1 VxWorks操作系統(tǒng)結(jié)構(gòu)圖
考慮到本文開發(fā)的BSP應(yīng)用在星載系統(tǒng)中,在保證安全有效存儲操作系統(tǒng)鏡像前提下,對開發(fā)做出以下前提聲明:
如圖2所示,BootLoad存放在NandFlash中,通過BootLoad下載并引導(dǎo)操作系統(tǒng),引導(dǎo)過程中,將操作系統(tǒng)拷貝到RAM_LOW_ADRS的位置運(yùn)行。引導(dǎo)結(jié)束后,將執(zhí)行權(quán)交給VxWorks操作系統(tǒng),開始進(jìn)行系統(tǒng)初始化[10]。
Figure 2 Storage structure of VxWorks圖2 VxWorks存儲結(jié)構(gòu)
圖3所示為從函數(shù)級描述操作系統(tǒng)啟動(dòng)過程,BootLoad將程序指針跳轉(zhuǎn)到RAM_LOW_ADRS后執(zhí)行sysInit(),對CPU進(jìn)行基礎(chǔ)初始化,進(jìn)而在usrInit()中通過接口sysHwInit()和KernelInit()對硬件設(shè)備和操作系統(tǒng)內(nèi)核進(jìn)行初始化,之后運(yùn)行usrRoot()完成內(nèi)核組件創(chuàng)建并跳到應(yīng)用層,執(zhí)行應(yīng)用程序[11]。
Figure 3 VxWorks startup process圖3 VxWorks啟動(dòng)流程
本文采用風(fēng)河公司推出的VxWorks 6.8操作系統(tǒng),編譯環(huán)境采用適用于復(fù)雜項(xiàng)目管理、具有良好調(diào)試功能的WorkBench 3.2,滿足星載系統(tǒng)軟件開發(fā)需求。在系統(tǒng)啟動(dòng)階段,啟動(dòng)新型龍芯1E芯片的協(xié)處理器1,以增強(qiáng)浮點(diǎn)運(yùn)算能力,并添加C++、VxBus等系統(tǒng)組件,為復(fù)雜算法搭建軟件基礎(chǔ)。采用VxBus型驅(qū)動(dòng)架構(gòu)管理串口等外部設(shè)備。在中斷管理方面,利用VxBus型架構(gòu)分層管理中斷驅(qū)動(dòng)。將內(nèi)存分配為VxWorks管理和靜態(tài)管理2部分,并增加VxWorks管理區(qū)域,充分利用新型1E龍芯芯片的存儲空間。
在VxWorks BSP開發(fā)中,從文件角度需要編寫以下組件:
(1)Config.h。
Config.h是缺省配置文件,在操作系統(tǒng)啟動(dòng)和初始化過程中,將會根據(jù)Config.h的參數(shù)來對操作系統(tǒng)進(jìn)行配置。開發(fā)人員在該文件中對BSP基本配置選項(xiàng)進(jìn)行設(shè)置,例如系統(tǒng)時(shí)鐘頻率、內(nèi)存起始地址、Cache模式等,通過#define、#undef的宏命令來對BSP的組件進(jìn)行添加和裁剪。必須的組件配置需要寫入該文件中,其他的可選組件可以在WorkBench開發(fā)中進(jìn)行添加。
在Config.h中更改RAM_LOW_ADRS鏡像起始地址,通過設(shè)置LOCAL_MEM_SIZE規(guī)定VxWorks操作系統(tǒng)管理內(nèi)存區(qū)域大小,并添加對VxBus型驅(qū)動(dòng)架構(gòu)的支持,添加編寫的驅(qū)動(dòng)模塊,例如串口、中斷、時(shí)鐘。配置操作系統(tǒng)對浮點(diǎn)操作和C、C++的支持。
(2)Makefile。
Makefile是BSP的編譯文件,在該文件中指定編譯VxWorks鏡像時(shí)所要使用的編譯器和函數(shù)庫。另外需要指定根啟動(dòng)設(shè)備ROM大小和地址、增加的目標(biāo)模塊、編譯應(yīng)用層軟件所需要的源碼文件。
(3)sysAlib.s。
在sysAlib.s中改寫sysInit(),該程序?yàn)閂xWorks啟動(dòng)的入口程序,其主要功能是初始化協(xié)處理器,建立環(huán)境啟動(dòng)usrInit()。下面以偽代碼形式介紹本文方案:
sysInit(){
使能協(xié)處理器0,1;
清空中斷;
清空協(xié)處理器0的CAUSE、WIRED寄存器;
啟動(dòng)向量入口地址控制,置協(xié)處理器0 ERL為1;
清空TLB,建立堆棧;
建立全局偏移量表指針;
初始化處理器時(shí)鐘計(jì)數(shù)器、計(jì)時(shí)器中斷控制器;
將usrInit()入棧并執(zhí)行;
}
(4)sysLib.c。
該文件主要提供目標(biāo)板硬件資源的初始化接口。通過編寫sysHwInit()、sysHwInit2()函數(shù),實(shí)現(xiàn)對目標(biāo)板的硬件初始化。操作系統(tǒng)對VxBus驅(qū)動(dòng)的支持也是在這2個(gè)函數(shù)中完成。在sysHwInit()對VxBus架構(gòu)進(jìn)行第1次初始化,調(diào)用hardWareInterFaceInit()接口,初始化硬件設(shè)備表的數(shù)據(jù)結(jié)構(gòu),對VxBus型設(shè)備掛接的虛擬總線PLB進(jìn)行初始化,注冊VxBus型設(shè)備。在sysHwInit2()中,調(diào)用vxbDevInit()進(jìn)行設(shè)備第2次初始化,包括設(shè)置設(shè)備的寄存器和內(nèi)存緩存區(qū)等,并向應(yīng)用層提供接口。最后在vxbDevConnect()中完成中斷掛接,至此硬件設(shè)備驅(qū)動(dòng)初始化完成。
(5)hwconf.c。
VxWorks在該文件中定義hcfDeviceList[]列表來描述VxBus驅(qū)動(dòng)架構(gòu)的所有硬件設(shè)備。hcfDeviceList[]列表是由一個(gè)個(gè)設(shè)備結(jié)構(gòu)體構(gòu)成的,所有與硬件相關(guān)的設(shè)置都在設(shè)備結(jié)構(gòu)體中完成,進(jìn)而在注冊設(shè)備驅(qū)動(dòng)時(shí)被寫入驅(qū)動(dòng)程序中。在設(shè)備結(jié)構(gòu)體中需要定義設(shè)備寄存器基地址、中斷號、設(shè)備引腳號等。本文中ns16550串口、MIPS中斷、R4K時(shí)鐘在hwconf.c中注冊。
本文中硬件環(huán)境是MIPS架構(gòu)的龍芯1E芯片,對于中斷采用VxBus驅(qū)動(dòng)的方式管理。在硬件結(jié)構(gòu)上,MIPS的芯片采取分層次管理。第1層為MIPS中斷控制,共有8個(gè)類型,第2層為龍芯1E中斷控制,共有32個(gè)中斷[12],本文中涉及時(shí)鐘中斷和串口中斷。在編寫軟件時(shí),本文采用分層次的方式管理中斷。
第1層MIPS中斷控制,可利用自帶的VxBus型中斷控制驅(qū)動(dòng)。在hwconf.c中添加所需要控制的中斷設(shè)備引腳說明,將引腳2設(shè)置為龍芯1E中斷,將引腳7設(shè)置為時(shí)鐘中斷。第2層的中斷為板級中斷,將引腳11、12設(shè)置為串口0、1中斷并更新向量表。然后在hwconf.c中添加龍芯1E的中斷:
Const Struct intrCtlrInputsmipsLSIntCtlrInputs[]{
{11,”ns16550”,0,0},
{12,”ns16550”,1,0}
}
const struct hcfResourcemipsLSResources[]={
{“regBase”,HCF_RES_INT,(void *)TRUE},
{“input”,HCF_RES_ADDR,((void *)mipsLSIntCtlrInputs[0])},
{“inputTableSize”,HCF_RES_INT,{(void *)
NELEMENTS(mipsLSIntCtlrInputs)}}
}
#definecpuNumNELEMENTS(mipsLSResources)
在設(shè)備列表中添加中斷設(shè)備:
{“mipsLSIntCtlr”,0,VXB_BUSID_PLB,0,cpu0Num,mipsLSResources}
從硬件角度看,在32位MIPS存儲器架構(gòu)中,對程序空間地址映射分為4大區(qū)域:kuseg,kseg0~kseg2。本文將地址空間的kseg0和kseg1直接映射到物理地址空間的最低0.5 GB??紤]到星載軟件對實(shí)時(shí)性和安全性的要求,將內(nèi)存分為靜態(tài)管理和動(dòng)態(tài)管理2部分。本文將操作系統(tǒng)映射到kseg0區(qū)域,將200 MB分配給操作系統(tǒng)作為動(dòng)態(tài)內(nèi)存使用,即:0x80000000~0x8C800000用于系統(tǒng)運(yùn)行、局部變量存儲等。剩下的地址空間作為靜態(tài)內(nèi)存使用,重啟不刷新,用于存儲遙測數(shù)據(jù)等。
圖4為用于動(dòng)態(tài)存儲的內(nèi)存空間分配圖。在本文中,低端內(nèi)存區(qū)域存放中斷向量表、bootline、exception message等信息。RAM_LOW_ADRS=0x801000000,VxWorks區(qū)域存放操作系統(tǒng)映像的代碼段、數(shù)據(jù)段和BSS(Block Started Symbol)段。WDB(Wind deBug)內(nèi)存池在前期開發(fā)時(shí)使用,主要用于動(dòng)態(tài)下載目標(biāo)模塊、傳遞參數(shù)等。VxWorks可用內(nèi)存區(qū)域主要用于動(dòng)態(tài)內(nèi)存分配(malloc等)、任務(wù)和中斷堆棧等。
Figure 4 Dynamic memory allocation圖4 動(dòng)態(tài)內(nèi)存分配圖
靜態(tài)存儲起始地址為0x8C800000,至SDRAM結(jié)束。在操作系統(tǒng)運(yùn)行時(shí),可由應(yīng)用程序直接向這段區(qū)域?qū)懭霐?shù)據(jù),省去了系統(tǒng)調(diào)度等過程,提供了很好的實(shí)時(shí)性和可靠性。具體的分配策略可根據(jù)應(yīng)用層程序的需要進(jìn)行分配,以達(dá)到最好的內(nèi)存利用狀態(tài)。
時(shí)鐘管理關(guān)系著操作系統(tǒng)任務(wù)調(diào)度、超時(shí)處理、時(shí)鐘計(jì)時(shí)、時(shí)鐘中斷等。本文中新型龍芯芯片通過配置PLL分倍頻參數(shù)將系統(tǒng)時(shí)鐘設(shè)置為180 MHz,其高頻PLL結(jié)構(gòu)圖如圖5所示,輸入的時(shí)鐘Fin經(jīng)過輸入分頻后得到Fref時(shí)鐘,該時(shí)鐘送到倍頻器,得到Fvco,然后在輸出前除以1個(gè)分頻系數(shù),得到 PLL 輸出時(shí)鐘Fout。轉(zhuǎn)換方式如式(1)和式(5)所示:
Fout=Fin/ref*ldf/odf
(1)
Figure 5 Clock PLL structure圖5 高頻PLL結(jié)構(gòu)圖
在操作系統(tǒng)中采用VxWorks所提供的MIPS R4K的VxBus型驅(qū)動(dòng)管理時(shí)鐘。在Config.h中包含#define DRV_TIMER_MISR4K驅(qū)動(dòng)組件并將系統(tǒng)時(shí)鐘設(shè)置為180 MHz。在hwconf.h中設(shè)置時(shí)鐘參數(shù):最小時(shí)鐘、最大時(shí)鐘、CPU頻率等。關(guān)鍵代碼如下所示:
Const Struct hcfResourcer4KTimerDevResources[]{
{“regBase”,HCF_RES_INT,(void *)0},
{“minClkRate”,HCF_RES_INT,(void *)SYS_CLK_RATE_MIN},
{“maxClkRate”,HCF_RES_INT,(void *)SYS_CLK_RATE_MIN},
{“cpuClkRate”,HCF_RES_INT,(void *)180000000},
};
#definer4TimerDevNumNELEMENTS(r4KTimerDevResources)
在設(shè)備列表中添加時(shí)鐘設(shè)備:
{“r4KTimerDev”,0,VXB_BUSID_PLB,0,r4TimerDevNum,r4KTimerDevResources}
VxWorks系統(tǒng)提供了VxBus型驅(qū)動(dòng)來管理I/O設(shè)備,本文以常用的ns16550串口為基礎(chǔ),編寫驅(qū)動(dòng)軟件。
編寫VXBNS165550.h文件,定義串口寄存器地址、中斷類型等變量并構(gòu)建結(jié)構(gòu)體NS16550VXB_CHAN,把串口抽象成1個(gè)組件,以方便對設(shè)備的操作設(shè)置和管理。
在hwconf.c中,對串口設(shè)備進(jìn)行基礎(chǔ)的初始化定義,并把串口設(shè)備添加到VxBus設(shè)備表中,定義串口寄存器基地址、波特率、時(shí)鐘頻率、寄存器間隔空間,關(guān)鍵代碼如下所示:
Struct hcfResourceNS16550Dev0Resources[]={
{“regBase”,HCF_RES_INT,0xbf004080},
{“baudRate”,HCF_RES_INT,152100},
{“clkFreq”,HCF_RES_INT,(void *)BAUD_CLK_FREQ},
{“regInterval”,HCF_RES_INT,(void *)UART_DELTA},
};
#defineNS16550Dev0NumNELEMENTS(NS16550Dev0Resources)
Const StructhcfDevice_hcfDeviceList[]={
{“NS16550”,0,VXB_BUSID_PLB,0,NS16550Dev0Num,NS16550Dev0Resources}}
創(chuàng)建VXBNS16550.c驅(qū)動(dòng)源碼文件,實(shí)現(xiàn)串口設(shè)備的初始化、中斷以及各種操作,如圖6所示。
Figure 6 Method of serial port driver圖6 串口驅(qū)動(dòng)方法圖
串口NSvxbRegister()、NSvxbInstInit()2個(gè)函數(shù)在內(nèi)核初始化過程中完成。NSvxbRegister()創(chuàng)建串口設(shè)備,并將串口設(shè)備掛接到虛擬總線PLB。
NSvxbInstInit()初始化NS16550VXB_CHAN數(shù)據(jù)結(jié)構(gòu),將串口的波特率、通道號、時(shí)鐘頻率、串口基地址、寄存器間隔空間參數(shù)從hwconf.h中加載到驅(qū)動(dòng)中,并聲明以下2個(gè)方法:
LOCALdevice_method_tNS16550VXB_methods[] =
{
DEVMETHOD(sioChanGet,NS16550SioChanGet);
DEVMETHOD(sioChanConnect,NS16550SioChan-Connect)};
NS16550SioChanGet()方法為上層提供通過通道號找到串口設(shè)備的接口,NS16550SioChanConnect()用于串口中斷的掛接和使能。
NSvxbDevInit()實(shí)現(xiàn)2部分初始化,第1部分配置UART通道,包括LCR線路控制寄存器,配置端口8字節(jié),1個(gè)停止位無校驗(yàn),波特率115 200,設(shè)置Modem控制寄存器為回環(huán)模式中連到RI輸入。第2部分聲明串口操作方法,包括NSvxbIoctl()、NSvxbTxstartup()、NSvxbCallbackInstall()。
NSvxbIoctl()為串口控制函數(shù),包括設(shè)定串口波特率、停止位奇偶校驗(yàn)、打開串口、Modem控制寄存器。NSvxbTxstartup()使能發(fā)送的中斷。NSvxbCallbackInstall()完成中斷后接受和發(fā)送的函數(shù)連接安裝。
在sysHwInit2中調(diào)用vxbDevConnect()連接和使能串口中斷,將串口中斷處理程序NSvxInt()掛接到中斷向量中。在本文中串口工作模式為中斷觸發(fā),在中斷處理程序中使用NSIntWr()和NSIntRd()對串口循環(huán)緩存區(qū)進(jìn)行讀寫操作。至此,串口初始化完成,設(shè)備以相應(yīng)的結(jié)構(gòu)體掛接到VxBus設(shè)備樹中,并開啟中斷。
如圖7所示,操作系統(tǒng)通過中間層TTY管理串口設(shè)備:虛擬設(shè)備TTY作為I/O設(shè)備向I/O系統(tǒng)注冊。在usrRoot()中將TTY設(shè)備加入IO系統(tǒng):
ttyDevCreate(tyName,sysSerialChanGet(channelNo),512,512);
consoleFd=open(tyName,O_RDWR,0);
Figure 7 I/O device management圖7 I/O設(shè)備管理
在ttyDevCreate函數(shù)中,iosDrvinstall()和iosDevAdd()將串口以TTY設(shè)備添加進(jìn)系統(tǒng)驅(qū)動(dòng)表和系統(tǒng)設(shè)備表中。用open()申請consoleFd為設(shè)備文件描述符。至此,串口設(shè)備被掛接到I/O系統(tǒng)中,驅(qū)動(dòng)開發(fā)完成。
本文采用新型龍芯1E系列開發(fā)板作為驗(yàn)證和測試的目標(biāo)機(jī),采用研華工控機(jī)作為宿主機(jī)。龍芯1E串口0和工控機(jī)相連,將串口信息發(fā)送到工控機(jī)中。操作程序鏡像通過串口1從工控機(jī)下載到開發(fā)板中。
測試分為3部分:第1部分,通過系統(tǒng)運(yùn)行,在VxWorks shell中輸入VxBusShow檢驗(yàn)VxBus驅(qū)動(dòng)啟動(dòng)是否成功。第2部分,在應(yīng)用層編寫串口收發(fā)測試程序,通過串口收發(fā)數(shù)據(jù)各1 500次驗(yàn)證VxBus型串口驅(qū)動(dòng)在實(shí)際應(yīng)用中的可靠性。第3部分,分別在新型龍芯1E芯片和在軌星載計(jì)算機(jī)上創(chuàng)建相同應(yīng)用程序,檢驗(yàn)在復(fù)雜運(yùn)算過程中,BSP的表現(xiàn)情況和BSP性能對比。
Figure 8 Diagram of drive device hook up圖8 驅(qū)動(dòng)設(shè)備掛接圖
Figure 9 Operation diagram of serial port receiving data圖9 串口接收數(shù)據(jù)運(yùn)行圖
(1)在WorkBench開發(fā)環(huán)境中創(chuàng)建1個(gè)VxWorks Image型工程,選擇編輯本文實(shí)現(xiàn)的BSP。編譯鏡像生成可執(zhí)行文件VxWorks。通過串口將鏡像下載到開發(fā)板中運(yùn)行。在shell中輸入VxBusShow顯示當(dāng)前系統(tǒng)的驅(qū)動(dòng)和設(shè)備,可看到當(dāng)前VxBus串口驅(qū)動(dòng)、中斷驅(qū)動(dòng)、時(shí)鐘驅(qū)動(dòng)成功注冊。如圖8所示。
(2)創(chuàng)建VxWorks Image型工程,在usrAppInit()中創(chuàng)建任務(wù):①通過串口接收數(shù)據(jù)1 500次,并將數(shù)據(jù)進(jìn)行比對,輸出接收總次數(shù)、接收數(shù)據(jù)成功次數(shù)、接收數(shù)據(jù)錯(cuò)誤次數(shù)。②通過串口發(fā)送數(shù)據(jù)到宿主機(jī)1 500次,宿主機(jī)接收后在SSCOM串口中輸出。圖9為串口接收數(shù)據(jù)運(yùn)行結(jié)果圖。
由圖9結(jié)果得出,分別接收和發(fā)送1 500次數(shù)據(jù),均未出現(xiàn)誤碼等情況,實(shí)踐證明VxBus型驅(qū)動(dòng)具有很好的可靠性。
(3)創(chuàng)建VxWorks Image型工程,在usrAppInit()中創(chuàng)建1個(gè)任務(wù):
voidusrAppInit(void){
logMsg(“----usrAppInit,---- ”,0,0,0,0,0,0);
taskSpawn(“test”,100,0x01000000,2000000,(FUNCTPTR)main,0,0,0,0,0,0,0,0,0,0);
}
Figure 10 Results of the program running on the on-board computer圖10 在軌星載計(jì)算機(jī)中程序運(yùn)行結(jié)果圖
Figure 11 Results of the program running on the new Godson 1E圖11 新型龍芯1E中程序運(yùn)行結(jié)果圖
并將任務(wù)分別運(yùn)行在移植成功的新型龍芯1E芯片和在軌星載計(jì)算機(jī)中,將2款計(jì)算機(jī)設(shè)置為相同CPU頻率,通過運(yùn)行時(shí)間對比驗(yàn)證其性能提升。該任務(wù)為武漢大學(xué)編寫的導(dǎo)航衛(wèi)星自主定軌的模擬程序,用C++語言編寫,并用到大量的浮點(diǎn)運(yùn)算,包括協(xié)方差計(jì)算,讀取存儲12*12的矩陣,算法復(fù)雜度高,可以很好地檢測BSP的運(yùn)行狀態(tài)和進(jìn)行性能對比。如圖10所示為模擬程序在目前在軌星載衛(wèi)星系統(tǒng)中運(yùn)行截圖,如圖11所示為模擬程序在新型龍芯1E中運(yùn)行截圖。
由運(yùn)行結(jié)果可知操作系統(tǒng)已啟動(dòng)且運(yùn)行狀態(tài)良好。運(yùn)行1次模擬程序在軌星載計(jì)算機(jī)系統(tǒng)的時(shí)間為38 s,在新型1E芯片中的時(shí)間為21 s。以運(yùn)行時(shí)間為衡量標(biāo)準(zhǔn),移植后程序運(yùn)行速度提升了81%,性能提升明顯,可以滿足執(zhí)行復(fù)雜應(yīng)用的需求。
本文在新型龍芯1E開發(fā)平臺上,針對硬件升級所提出的需求,完整開發(fā)了VxWorks操作系統(tǒng)的BSP包,包括內(nèi)存分配、中斷管理、時(shí)鐘管理、串口VxBus型驅(qū)動(dòng)設(shè)計(jì),并基于工程實(shí)踐的星載計(jì)算機(jī),設(shè)計(jì)了可靠合理的測試方案,測試結(jié)果說明操作系統(tǒng)移植成功,計(jì)算性能得到了提升,具備承擔(dān)未來多樣化星載軟件任務(wù)的可行性,同時(shí)為未來SpaceWire高速通信接口應(yīng)用開發(fā)奠定了技術(shù)基礎(chǔ)。