周鵬舉,倪 明,施華君,楊三嶺
(中國電子科技集團(tuán)公司第三十二研究所,上海 201800)
自第一顆人造衛(wèi)星進(jìn)入太空以來,航天技術(shù)取得了迅猛的發(fā)展,現(xiàn)已廣泛應(yīng)用于國民生活的方方面面.我國經(jīng)過40多年的艱苦努力,在航天方面取得了一系列重大成就.隨著計算機模塊運算能力的提升和任務(wù)的增多,計算機模塊應(yīng)用程序呈現(xiàn)出多樣化和復(fù)雜化的發(fā)展趨勢.快速迭代的軟件需求,要求設(shè)計一種計算機模塊引導(dǎo)軟件(以下簡稱引導(dǎo)軟件),使其能夠?qū)?yīng)用程序進(jìn)行重構(gòu)和引導(dǎo)等,并且為適應(yīng)復(fù)雜的空間環(huán)境,需要采用一定措施保證其高可靠性.
本文針對上述問題,設(shè)計與實現(xiàn)了一種基于SPARC架構(gòu)的高可靠引導(dǎo)軟件.該引導(dǎo)軟件的主要功能如下:
1)自檢功能,確保引導(dǎo)軟件本身正確.
2)硬件檢測功能,確保硬件狀態(tài)正確.
3)三冗余架構(gòu)、反彈墻、EDAC保護(hù)等多種高可靠性措施,確保軟件的正確運行.
4)重構(gòu)功能,便于不同應(yīng)用程序的在線固化,縮短研發(fā)周期.
5)多種引導(dǎo)方式,便于對應(yīng)用程序的調(diào)試.
本實驗所用的計算機模塊原理框圖如圖1所示,CPU使用基于SPARC架構(gòu)的AT697F,主要包含RAM、PROM、EEPROM三種存儲芯片,RAM是計算機模塊的內(nèi)存區(qū)域,引導(dǎo)軟件燒寫于PROM1(實驗過程中由EEPROM代替)中,自動引導(dǎo)的應(yīng)用程序(以下簡稱應(yīng)用程序)燒寫于PROM2(實驗過程中由EEPROM代替)中,可重構(gòu)的應(yīng)用程序(以下簡稱重構(gòu)程序)固化于EEPROM中.
圖1 計算機模塊原理框圖
計算機模塊通過RS232與外界通信.計算機模塊與計算機的通信示意圖如圖2所示,計算機使用調(diào)試環(huán)境VDS通過仿真器LEON將引導(dǎo)軟件下載到計算機模塊中,計算機中的地面服務(wù)程序(界面見圖10)通過RS232串口與計算機模塊進(jìn)行通信.
圖2 計算機與計算機模塊通信圖
該實驗采用的CPU是Atmel公司的AT697F.AT697F基于SPARC V8架構(gòu)設(shè)計,采用RISC精簡指令集,具有8個寄存器堆窗口、5級流水線,使用容錯設(shè)計技術(shù),具有軟件可控的省電工作模式,是一種高性能低功耗的32位嵌入式處理器.
AT697F主頻最高可達(dá)100MHz,定點運算性能86MIPS,浮點運算性能23MFLOPS.正常工作溫度范圍廣,抗輻射能力強.該CPU的各項指標(biāo)能夠滿足衛(wèi)星在軌運行期間的各項性能要求.
AT697F具有32根地址總線,可尋址4 GB的地址空間.該計算機模塊采用統(tǒng)一編址方式,地址空間分配如表1所示.
表1 計算機模塊地址空間
本引導(dǎo)軟件的設(shè)計方案如圖3所示,主要分為6個模塊.
圖3 引導(dǎo)軟件設(shè)計方案
系統(tǒng)初始化模塊用于系統(tǒng)初始化和引導(dǎo)程序的搬移和跳轉(zhuǎn).系統(tǒng)初始化主要包括CPU、外圍器件,陷阱/中斷、堆棧等的初始化.引導(dǎo)程序的搬移和跳轉(zhuǎn)用于引導(dǎo)程序自身的轉(zhuǎn)移.
系統(tǒng)初始化完成后,引導(dǎo)軟件等待4 s,若4 s內(nèi)未收到地面接管指令則進(jìn)入飛行模式模塊,否則進(jìn)入測試模式模塊.飛行模式模塊是系統(tǒng)的自動管理模塊,它根據(jù)引導(dǎo)標(biāo)志自動完成應(yīng)用程序或重構(gòu)程序的引導(dǎo);測試模式模塊根據(jù)地面指令執(zhí)行相應(yīng)操作,如重構(gòu)程序上注、固化等,并最終引導(dǎo)一個應(yīng)用程序的啟動.
數(shù)據(jù)回送模塊用于引導(dǎo)程序運行過程中狀態(tài)的回送,如重構(gòu)程序校驗和的回送等.
錯誤檢測與恢復(fù)主要包括RAM正確性檢測、程序比特位正確性檢測、系統(tǒng)運行正確性檢測和重構(gòu)程序三冗余架構(gòu)設(shè)計等,若檢測到錯誤,則嘗試進(jìn)行恢復(fù).
本文主要對系統(tǒng)初始化、飛行模式、測試模式和錯誤檢測與恢復(fù)4個模塊進(jìn)行論述.
該引導(dǎo)軟件主要由trap.s、setup.s、xxmain.c等3個文件組成,trap.s主要用于設(shè)置陷阱表和中斷臨界區(qū),setup.s主要包含初始化和錯誤檢測與恢復(fù)兩個模塊,xxmain.c完成引導(dǎo)軟件的引導(dǎo)測試功能,即完成飛行模式、測試模式和程序啟動三個模塊.
系統(tǒng)初始化主要包括硬件初始化和引導(dǎo)程序的搬移和跳轉(zhuǎn).
AT697F共有8個全局通用寄存器和8個寄存器窗口,每個寄存器窗口對應(yīng)一組通用寄存器.初始化時對上述通用寄存器全部清0,對控制寄存器進(jìn)行配置,主要配置當(dāng)前寄存器窗口、無效窗口、cache、內(nèi)存等.
中斷是現(xiàn)代處理器的重要組成部分,本引導(dǎo)軟件在系統(tǒng)初始化時完成對中斷的配置.中斷服務(wù)函數(shù)在xxmain.c中完成,臨界區(qū)的進(jìn)入/退出和中斷向量表在trap.s中,中斷配置在setup.s中完成.
AT697F的中斷控制在多個寄存器中完成.主要是設(shè)置中斷屏蔽級別PSR.pil為0,設(shè)置異常基址標(biāo)志寄存器TBR為中斷向量表的入口地址,其它與中斷相關(guān)的寄存器如中斷級別/屏蔽寄存器等都設(shè)為0.當(dāng)程序跳轉(zhuǎn)至主函數(shù)前置PSR.ET為1,打開中斷.
因AT697F共有8個寄存器窗口,故需為每個窗口設(shè)置一個堆棧,該引導(dǎo)軟件的堆棧棧底位于SRAM的 0x400f0000 處,代碼為:
PROVIDE (__stack = 0x400f0000);
每個窗口對應(yīng)一段??臻g,棧指針%sp向下增長.
引導(dǎo)程序固化于PROM中,運行時將自身搬移到RAM中,自檢正確后跳轉(zhuǎn)至引導(dǎo)軟件的main主函數(shù).
因太空復(fù)雜的環(huán)境對程序的正確運行構(gòu)成極大威脅,本引導(dǎo)軟件為保證程序的正確運行采取如下高可靠性措施,在文件setup.s中主要完成RAM正確性檢測,EDAC保護(hù),反彈墻保護(hù),看門狗保護(hù)等;在文件xxmain.c中主要完成三冗余架構(gòu)設(shè)計.其中RAM正確性檢測屬于硬件正確性檢測,EDAC保護(hù)屬于比特位正確性檢測與恢復(fù),反彈墻保護(hù)、看門狗保護(hù)屬于系統(tǒng)運行正確性檢測,三冗余架構(gòu)屬于錯誤檢測與錯誤恢復(fù),將在3.4.2節(jié)論述.
1)RAM錯誤檢測
RAM的起始地址是0x40000000,錯誤檢測的方法是在RAM的地址空間中,依次向每個字中寫入0x0并讀出,檢測讀出的數(shù)據(jù)是否出現(xiàn)錯誤,若出現(xiàn)錯誤則將錯誤計數(shù)加1.當(dāng)上述檢測完成后,分別將0x0替換為0x55555555、0xaaaaaaaa和0xffffffff重復(fù)上述檢測.最后將錯誤計數(shù)值存入地址0x40000000處.當(dāng)引導(dǎo)軟件進(jìn)入main函數(shù)后將錯誤計數(shù)值返回給地面服務(wù)程序.檢測SRAM的代碼如圖4所示,進(jìn)入_checkram 前%g1~%g4為0,%g2進(jìn)行錯誤計數(shù),%5為RAM的大小,%g6為RAM的起始地址.
2)引導(dǎo)軟件自檢
引導(dǎo)軟件無錯誤是其正確執(zhí)行其它功能的前提,當(dāng)RAM自檢正確后,引導(dǎo)軟件將被轉(zhuǎn)移到起始地址為SADDR的RAM中,計算其校驗和,若校驗和正確則認(rèn)為引導(dǎo)軟件沒有錯誤.
3)反彈墻保護(hù)
反彈墻的目的在于保證程序非法運行時,能夠跳轉(zhuǎn)到指定的異常處理函數(shù).本軟件添加反彈墻的方法是在未使用的區(qū)域填入“nop”和跳轉(zhuǎn)到0地址的指令,這些區(qū)域包括ROM、EEPROM、RAM中未使用的所有區(qū)域.若程序運行中跳入非法地址,則軟件復(fù)位.
4)EDAC保護(hù)
EDAC(error detection and correction)采用海明碼,能夠糾正一位錯,檢測兩位及多位錯誤,對于受保護(hù)的RAM區(qū)域,任何一條指令的讀取或數(shù)據(jù)的讀寫都將經(jīng)過EDAC檢測,對于一位可糾正錯,錯誤將在CPU內(nèi)部糾正,對于兩位不可糾正錯,將產(chǎn)生instruction_access_exception或data_access_exception陷阱.
本引導(dǎo)軟件主要對RAM進(jìn)行EDAC保護(hù).軟件初始化時,開啟全RAM區(qū)域EDAC保護(hù),軟件運行過程中,為了防止比特位的錯誤累積,定期對RAM中的所有數(shù)據(jù)進(jìn)行讀寫,若出現(xiàn)多位錯誤則進(jìn)入中斷服務(wù)函數(shù),中斷服務(wù)函數(shù)將錯誤發(fā)回給地面,引導(dǎo)軟件自動復(fù)位.
5)看門狗
看門狗是防止程序跑飛的有效手段,在該引導(dǎo)軟件中,引導(dǎo)軟件必須定期喂狗,否則引導(dǎo)軟件將復(fù)位.
圖4 SRAM檢測
系統(tǒng)自動進(jìn)入飛行模式后,對引導(dǎo)標(biāo)志進(jìn)行檢測,若導(dǎo)標(biāo)志不是引導(dǎo)EEPROM中的重構(gòu)程序,則引導(dǎo)程序?qū)ROM中的應(yīng)用程序復(fù)制到起始地址為SADDR的RAM中,然后啟動應(yīng)用程序的運行;若引導(dǎo)標(biāo)識是引導(dǎo)EEPROM中的重構(gòu)程序,則引導(dǎo)程序則按照3.4.2節(jié)中重構(gòu)程序引導(dǎo)的方式啟動重構(gòu)程序的運行.飛行模式的流程圖如圖5所示.
圖5 飛行模式流程圖
地面指令通過地面服務(wù)程序以幀的形式下發(fā)到計算機模塊,該計算機模塊中的幀分為指令幀、數(shù)據(jù)幀和應(yīng)答幀.指令幀用于計算機模塊的控制與測試,數(shù)據(jù)幀用于重構(gòu)程序的上注,應(yīng)答幀用于計算機模塊狀態(tài)的回送.數(shù)據(jù)的發(fā)送往往伴隨著封裝成幀和幀的重組.在計算機模塊上對幀的處理主要是幀重組和幀解析.
1)幀重組
幀重組在串口UART的中斷服務(wù)函數(shù)中進(jìn)行.當(dāng)收到一個字節(jié)的數(shù)據(jù)時產(chǎn)生UART中斷,經(jīng)中斷切換進(jìn)入中斷服務(wù)函數(shù).因數(shù)據(jù)的發(fā)送具有連續(xù)性,進(jìn)入串口中斷服務(wù)函數(shù)后連續(xù)判斷UART狀態(tài)寄存器的dr位是否為1,若此位為1,則表示在UART的接收保持寄存器中已經(jīng)有可讀的新數(shù)據(jù),串口服務(wù)程序讀取UART數(shù)據(jù)寄存器中的一字節(jié)數(shù)據(jù),并根據(jù)幀協(xié)議將接收到的數(shù)據(jù)組裝成幀.
2)幀解析
幀的解析在函數(shù)cmdAnalysis中進(jìn)行.該函數(shù)對于一個幀的解析流程如圖6所示.若收到的幀是數(shù)據(jù)幀,則使用io_copy函數(shù)將數(shù)據(jù)(不包含幀頭、幀尾,幀長度等與幀有關(guān)的數(shù)據(jù))轉(zhuǎn)移到首地址為FRM_BUF_ADDR的RAM中,數(shù)據(jù)復(fù)制完成后,計算校驗和,并將其回送至地面服務(wù)程序;若收到的幀是指令幀,則根據(jù)指令碼選擇相應(yīng)的操作,如地面接管、軟件上注、重構(gòu)程序固化、RAM引導(dǎo)等.
圖6 幀解析流程
該引導(dǎo)軟件的一個重要功能是重構(gòu)程序的在線固化功能.本引導(dǎo)軟件將重構(gòu)程序分三份固化于EEPROM中,并分別計算校驗和,將校驗和發(fā)送回地面服務(wù)程序.
根據(jù)3.4.1節(jié)對數(shù)據(jù)幀的論述,當(dāng)重構(gòu)程序存放于RAM中,且地面收到正確的校驗和后,地面服務(wù)程序可以發(fā)送重構(gòu)程序固化指令,開始重構(gòu)程序的固化.重構(gòu)程序的固化使用FPGA托管方式進(jìn)行.重構(gòu)程序共固化三份,首地址分別是RADDR1、RADDR2、RADDR3,固化完成后分別計算校驗和,并將校驗和返回給地面服務(wù)程序,若應(yīng)答幀返回的三個校驗和與重構(gòu)程序的校驗和相同,則重構(gòu)程序固化成功,此時地面服務(wù)程序可以向計算機模塊發(fā)送重構(gòu)程序引導(dǎo)指令.
計算機模塊收到重構(gòu)程序引導(dǎo)指令后,分別將這三份程序按字節(jié)取出,進(jìn)行三取二操作,將所得的結(jié)果移動到RAM中起始地址SADDR處.當(dāng)程序搬運完畢,計算RAM中該程序的校驗和,若校驗和正確,則啟動重構(gòu)程序的運行,否則啟動原應(yīng)用程序.重構(gòu)程序啟動的核心代碼如圖7所示.
本實驗中計算機模塊固定在板卡基座上,實物如圖8所示,圖8左邊是計算機模塊的正視圖,右邊是計算機模塊的俯視圖.在試驗中使用EEPROM代替PROM,地面服務(wù)程序的界面如圖10所示.
在tornado中建立VxWorks應(yīng)用程序,并添加printf打印函數(shù),設(shè)置引導(dǎo)標(biāo)識,重啟計算機模塊,則可以在串口調(diào)試助手中看到如圖9的結(jié)果.
圖7 重構(gòu)程序引導(dǎo)
圖8 計算機模塊實物圖
圖9 引導(dǎo)程序自動啟動應(yīng)用程序
圖9上圖為自動引導(dǎo)PROM中的應(yīng)用程序,下圖為自動引導(dǎo)EEPROM中的重構(gòu)程序.從圖中可以看出VxWorks已經(jīng)成功運行,并成功打印出相應(yīng)信息,證明應(yīng)用程序已經(jīng)成功運行.
計算機模塊重啟后發(fā)送地面接管指令,接管成功后,引導(dǎo)軟件進(jìn)入測試模式,圖10顯示了地面服務(wù)程序發(fā)送的一系列地面指令.從中可以看到程序啟動后自檢正確,SRAM無錯誤.當(dāng)發(fā)送地面接管指令后成功接管引導(dǎo)軟件,引導(dǎo)程序成功進(jìn)入測試模式,這時選取重構(gòu)程序,發(fā)送軟件上注指令,執(zhí)行重構(gòu)程序固化和引導(dǎo),從圖中可以看出重構(gòu)程序在計算機、RAM和EEPROM中的校驗和完全一樣,都為0x37b0,表明引導(dǎo)程序已經(jīng)成功將重構(gòu)程序固化完成.
圖10 引導(dǎo)程序進(jìn)入測試模式
當(dāng)?shù)孛姘l(fā)送重構(gòu)程序引導(dǎo)指令后,引導(dǎo)程序引導(dǎo)重構(gòu)程序的執(zhí)行.所得的結(jié)果如圖11所示.
圖11 重構(gòu)程序引導(dǎo)
在引導(dǎo)軟件的main函數(shù)中添加:
asm(“b 0x40001000”)
運行引導(dǎo)軟件,得到的結(jié)果如圖12所示.
從圖12中可以看出程序在不停的重啟,說明反彈墻能夠正確的運行.
通過VDS將RADDR1,RADDR2+0xf,RADDR3+0xff處的值改為0xFF,設(shè)置引導(dǎo)標(biāo)識為重構(gòu)程序引導(dǎo),啟動引導(dǎo)軟件,可以得到如圖11所示的結(jié)果,證明三冗余架構(gòu)具有一定的容錯能力,能夠保證應(yīng)用軟件的正常運行.
圖12 反彈墻測試
在重構(gòu)程序放置在SADDR后、校驗和檢測前,使用VDS更改SADDR處的值,運行軟件,此時會檢測到校驗和錯誤,轉(zhuǎn)而引導(dǎo)位于PROM中的應(yīng)用程序,串口調(diào)試助手此時返回的結(jié)果如圖9上圖所示.
本文介紹了基于SPARC架構(gòu)的的計算機模塊引導(dǎo)軟件,詳細(xì)論述了該引導(dǎo)軟件的架構(gòu)設(shè)計和主要功能,并論述了為保證其高可靠性采取的技術(shù),最后將該引導(dǎo)軟件在計算機模塊上測試,實驗證明,該引導(dǎo)軟件的各項功能正確,能夠?qū)⑵鋺?yīng)用到實際的項目中.該軟件也有不完善之處,需要改進(jìn),比如為保證高可靠性,數(shù)據(jù)的傳送速度較慢,可以通過測試,在保證高可靠的前提下提高數(shù)據(jù)傳輸速度.
1 徐福祥,林寶華.衛(wèi)星工程概論.2版.北京:中國宇航出版社,2004.
2 AT697F_doc7703.pdf. http://www.atmel.com/Images/doc 7703.pdf.
3 陳國林.星上帶容錯功能的計算機引導(dǎo)系統(tǒng)的研究和實現(xiàn)[碩士學(xué)位論文].北京:中國科學(xué)院研究生院(計算技術(shù)研究所),2005.
4 孫樂益.嵌入式系統(tǒng)的冗余設(shè)計研究.數(shù)字技術(shù)與應(yīng)用,2011,(10):123–124.
5 賴鑫.高可靠8051設(shè)計與實現(xiàn)及可靠性評估[碩士學(xué)位論文].長沙:國防科學(xué)技術(shù)大學(xué),2008.
6 柳振華.三模冗余容錯計算機的設(shè)計與實現(xiàn)[碩士學(xué)位論文].西安:西安電子科技大學(xué),2010.
7 時晨,于倫政.基于SPARC結(jié)構(gòu)的RISC系統(tǒng)設(shè)計技術(shù).微電子學(xué)與計算機,2002,19(11):52–54.[doi:10.3969/j.issn.1000-7180.2002.11.017]
8 周雪贊,張宏.基于Vxworks操作系統(tǒng)的BSP開發(fā).工業(yè)控制計算機,2004,17(2):33–34.
9 徐惠民.基于VxWorks的嵌入式系統(tǒng)及實驗.北京:北京郵電大學(xué)出版社,2006.