蘇宇,孔璐,張弢,王金波,周珊
(中國科學院空間應用工程與技術中心,北京100094)
隨著載人航天工程步入交會對接階段,航天器復雜度越來越高,有效載荷的種類越來越多,且具有接口多、技術指標高、數據速率高、數據類型多的特點。同時在整個飛行任務中,軟件扮演的角色越來越重。隨著DSP以及FPGA的大量使用,個別載荷模塊可能同時包含1553B總線接口、CAN總線接口、RS422總線接口、低電壓差分信號(Low-Voltage Differential Signaling,LVDS)接口等,軟件規模龐大,這都在客觀上加大了整個飛行任務的風險。因此在做載人航天高可靠軟件測試時,單個仿真測試前端由于受硬件資源的限制無法全部實現對以上接口的仿真,而常見的商業化分布式仿真平臺往往因對外接口單調、應用軟件操作界面較為復雜[1]、價格昂貴、體積龐大等因素難以融入到現有的測試環境中。
綜上所述,文中在對分布式仿真測試技術以及半實物仿真測試技術簡單分析的基礎上,由配置項級的航天嵌入式軟件第三方評測中的具體測試需求出發,以上述部分典型通信接口為例,設計并實現了分布式半實物仿真測試系統前端,再通過測試監控終端、測試服務器以及被測設備等設備組成分布式半實物仿真測試系統。
分布式仿真技術通常用網絡連接各個仿真系統,以此來完成各系統間信息的交互,擴大仿真的規模[2]。分布式仿真技術的出現完美的解決了不同仿真平臺之間信息的交互,被廣泛應用于各類系統的設計和測試中,將網絡模擬技術的應用提升了一個層次。分布式系統沒有標準的統一時間或時間基準,但是分布式系統對時鐘同步有更高的要求[3]。
常用的網絡時鐘同步技術有網絡時鐘同步協議NTP(Network Time Protocol)以及 IEEE1588 精準時鐘同步協議。NTP同步技術雖然開放、安全,但是同步精度不夠高,在局域網內的同步精度為1毫秒[4];2002 年出現的 IEEE1588(Precision Time Protocol,PTP)[5]是一種精密時鐘同步協議[6]。PTP協議可以在不增加硬件成本的條件下[7],為網絡上亞微秒級的同步精度的設備提供一個標準方法。IEEE1588精準時鐘同步協議的實現方式有純硬件方式和純軟件方式。前者采用硬件實現的時,在MAC層獲取并發送時間戳,能夠達到納秒級的同步精度[8];后者采用PTPd(開源IEEE1588協議代碼)實現,在應用層獲取時間戳,同步精度為微秒級,但前者的開發難度較大。
IEEE1588精準時鐘同步協議采用主、從的方式在網絡內進行時間同步。IEEE 1588定義了4種時鐘報文類型:同步報文、同步跟隨報文、延遲請求報文和延遲請求響應報文[9]。
半實物仿真(Semi-physical Simulation)又稱硬件在回路仿真(HITL:Hardware-In-the-Loop Simulation)[10],它由仿真技術發展到一定階段的產物。這種半實物仿真系統的行為特點為對規律比較清楚的部分建立數學模型,并在計算機上實現[11],如伺服電機系統或傳感器等;對比較復雜的部分或被測設備采用實物取代數學模型,以此來獲得更真實的測試或仿真結果。由于在仿真回路中接入了實物,因此硬件在仿真系統中必須是實時運行[12]。實時性在這里主要體現為采用實時化的嵌入式Linux對測試前端測試任務實時調度。
標準Linux內核實時化的方法有打Xenomai實時補丁、RTLinux實時補丁或RT-Preempt補?。↙inux官方推出)等方式。Xenomai是Linux內核的強實時擴展框架,它能無縫地集成到Linux環境中[13],能夠提供微秒級實時精度[14];RTLinux也是一種雙內核的且能為Linux內核提供硬實時性能的解決方案,該方案在被Windriver收購后停止發展。前兩種方法對Linux內核源碼的修改量大,開發難度大,且難以保證系統的穩定性[15];再加上實際工程應用中,實時內核中的進程無法直接訪問標準Linux內核提供的服務且實時任務數量不多,大部分工作由非實時內核完成;實時搶占補?。≧T-Preempt)是由Ingo Molnar和Thomas Gleixner更新維護,和其他微內核中通過增加實時搶占方法不同[16],RT-Preempt對標準Linux內核進行修改,使其滿足軟實時性能,可以應用于一些對實時性能要求不是很高的場合。
綜上所述,分布式系統時鐘的同步能力和實時性是分布式半實物仿真測試系統的兩個重要指標。
本文以LVDS高速數據的接收、轉發以及SPI指令幀的收發處理前端為例,設計并實現半實物仿真測試前端。為了使設計更具通用性,本設計采用具有ARM+FPGA通用架構的核心板輔以對外接口的底板組成。底板由電源、調試串口、以太網以及SD卡等組成的通用接口和由SPI、LVDS等組成的專用接口構成。測試前端的硬件結構框圖如圖1所示。

圖1 系統硬件結構框圖
分布式半實物仿真測試前端的微處理器作為前端的控制核心,采用的是三星公司的S3C6410(ARM11),該款處理器最高主頻可達667 MHz,內部資源豐富,并支持多種外部設備;作為前端中時序和數據處理的核心,FPGA芯片采用的是Xilinx公司的Virtex5系列的XC5VLX110T芯片,與ARM處理器之間采用三態總線相連。
在USB3.0標準中,最大傳輸速度達到了5.0 Gbps,幾乎是傳統USB2.0傳輸速度的10倍。在本文中,USB3.0控制器采用的是CYPRESS公司的FX3系列CYUSB3014-BZX款芯片,該芯片集成了200MHZ的ARM9控制器,512 kB字節的RAM以及USB3.0的物理層,具有可編程的100 MHz的GPIF II接口。由于該款芯片具有一個可進行配置的通用可編程接口GPIF II,因此本設計中采用CYUSB3014與FPGA芯片進行直連。
在本設計中,RS232芯片采用的是MAX202E,是一款通用的RS232協議芯片;NAND Flash芯片采用一片三星公司容量大小為1 GB的Flash芯片,型號為K9G8G08U0A;SRAM采用2片三星公司每片容量為128 MB,型號為K4X51163PC的芯片。
分布式半實物仿真測試系統由測試監控終端、測試服務器、分布式半實物仿真測試前端、被測設備(軟件)等組成。
在這里,監控終端用于測試指令序列建模、參數配置、發送、測試結果數據的觀測及判讀等;測試服務器的作用是存儲測試序列以及測試原始結果數據,本文采用的是大型關系型數據庫——IBM DB2,該數據庫具有穩定,高效,操作簡單等特點;分布式半實物仿真前端用于仿真被測設備的外部交聯設備,實現測試任務的調度、測試指令序列以及測試反饋數據的處理
在本設計中,要求前端能夠實時處理測試監控終端發送的測試指令序列,還要求能夠實時接收并顯示數據量不是很大的測試結果序列,同時對于數據量較大、速率較快的LVDS下行數據包,應能實時將其通過FPGA芯片經由USB3.0接口存入測試監控終端或測試服務器的硬盤中,供測試人員分析。因此在分布式半實物仿真測試前端的ARM上移植經過改造的嵌入式Linux操作系統,根據具體的測試需求,建立相應優先級的任務序列,嵌入式操作系統只需根據優先級對測試任務進行調度處理。
在Linux內核官網下載內核源碼及與內核版本相匹配的RT-Preempt補丁,并給標準Linux內核打上RT-Preempt補丁,并在配置內核時啟用CONFIG_PREEMPT_RT內核選項、啟用“Thread Softirqs”和“Thread Hardirqs”內核選項(如果有),同時禁用所有電源管理選項如ACPI或APM。保存內核配置、編譯內核并生成內核映像文件。
RT-Preempt補丁針對標準Linux內核的改變主要有:
1)把中斷處理器變為可被搶占的內核線程;
2)細化內核時鐘的顆粒度;
3)將影響內核實時性的內核自旋鎖用rtmutexes實現;
4)為內核里的自旋鎖和信號量實現優先級繼承。
由于默認狀態下,該款嵌入式Linux與外設通信的位寬為8 bits,為了提高系統的通信能力,將UBoot中Board/Samsung/smdk6410路徑下smdk6410.c文件中函數DM9000_pre_init()中的宏SROM_BC4_REG和SROM_BC5_REG的值修改為0x22032200,編譯并生成uboot.bin文件,這樣嵌入式Linux與外設通信的位寬由BYTE變為了WORD,通信效率提升了一倍。
將編譯好的uboot.bin文件、內核映像文件以及文件系統YAFFS2存放在已經處理好的SD卡中,通過SD將嵌入式Linux燒寫到分布式測試前端中。
文中采用純軟件的方式——PTPd實現的PTP協議來完成測試前端之間的時鐘同步。PTPd程序由C語言開發,在用戶空間獲取并發送時間戳,主要由IEEE1588協議引擎、最佳主時鐘算法、時鐘伺服系統、數據包處理、網絡服務、時間戳模塊、啟動初始化、定時器以及其他模塊組成。
在同一個分布式系統內選取一個測試前端作為分布式測試系統的主時鐘,則其他前端均視為從時鐘。在PC機上采用交叉編譯器編譯PTPd1.1.0代碼,生產可執行目標文件,下載至各個分布式測試前端板中再通過應用程序按照先后順序啟動系統內的主、從時鐘同步程序。在本設計中,分布式仿真測試前端板的時間為嵌入式Linux的上電開機時間,即為2000年1月1日零點零分。主從時鐘的晶振都27 MHz。
所謂設備驅動程序就是控制與管理設備數據收發的軟件,是應用程序與硬件設備溝通的橋梁。驅動程序屏蔽了硬件的細節,把設備映射為一個特殊的設備文件,用戶程序可以像對其他文件一樣對此設備文件進行操作。Linux內核中已經集成了常見芯片的驅動程序,如CAN總線驅動、RS485驅動以及以太網驅動等。但在本設計中,FPGA芯片作為外設掛在系統總線上,但嵌入式Linux內核中并未包含其驅動程序,因此需要開發針對FPGA的驅動。
在這里,將FPGA作為文件進行處理,通過open()和close()系統調用函數完成對設備的打開和關閉處理;通過__init fdev_init(void)函數為設備進行注冊設備號、開辟內存堆棧空間;通過__exit fdev_exit(void)函數實現注銷設備以及回收內存堆??臻g;通過read()、write()、ioctl()等常規的文件操作對目標設備進行操作。
驅動程序可以直接編譯進Linux內核代碼中,在Linux啟動時加載;也可以采用內核模塊的方式,待系統啟動后動態加載到內核中。在本設計中采用驅動模塊動態加載的方式,便于修改和調試。
根據具體的測試需求,可以將測試任務分為直接任務、定時任務以及同步任務,直接任務即測試前端收到測試指令后直接執行;定時任務即同一個測試前端收到多個按照一定時間順序執行的測試指令序列;同步任務即不同測試前端分別收到一個或多個按照一定時間順序執行的測試指令序列。本文中用戶的應用程序典型框架如圖2所示。

圖2 系統軟件結構框圖
系統上電后,首先對測試任務進行建模,繼而通過測試監控終端配置測試指令序列參數并發送測試指令序列,測試前端系統解析該指令并轉發至被測設備;接著通過監顯終端實時觀測測試前端系統轉發的測試指令序列的執行情況以及測試結果的正確性。
SPI通信功能的實現如圖3所示。其中,控制器寫時序模塊實現與ARM處理器之間的寫時序,并將寫入的數據緩存至配置信息接收模塊的RAM中;配置信息接收模塊讀取RAM區中的配置信息,并將配置信息發送至SPI發送時序模塊和SPI接收時序模塊;SPI發送時序模塊將并行數據包轉換為串行數據,并按“發送方式”、“時間間隔”、“發送次數”、“通信協議類型”等配置信息發送至通信設備;SPI接收時序模塊按配置的通信協議接收通信設備的串行數據,并將其轉換為并行數據后發送至接收數據處理模塊;接收數據處理模塊將接收到的數據緩存至內部RAM區,每包數據接收完成后,發送中斷信號ram_int至ARM處理器;控制器讀時序模塊實現與ARM處理器之間的讀時序,將接收數據處理模塊的RAM中的數據回傳至控制器。

圖3 SPI通信功能實現框圖
高速異步LVDS數據通信功能的實現如圖4所示。對于LVDS數據發送功能,由控制器接口處理模塊、配置信息接收模塊、數據生成模塊、8b/10b編碼模塊和并串轉換模塊組成。其中,控制器接口處理模塊實現與ARM處理器之間的寫時序,并將寫入的數據緩存至配置信息接收模塊的RAM中;配置信息接收模塊讀取RAM區中的配置信息,并將配置信息發送到數據生成模塊和并串轉換模塊;數據生成模塊根據數據配置信息的內容產生符合業務協議的數據幀;8b/10b編碼模塊將數據生成模塊送來的數據進行8b/10b轉換,本模塊調用標準IP核來實現8b/10b編碼;并串轉換模塊依次將編碼完成的10bit數據進行并串轉換,然后生成LVDS差分信號輸出。
對于異步LVDS數據接收功能,主要由數據恢復模塊、8b/10b解碼模塊和USB3.0接收模塊組成。其中,數據恢復模塊將接收到的LVDS差分數據轉換為單端,然后使用過采樣的方法進行數據恢復,生成10 bit數據。使用與LVDS數據同頻率的時鐘經過DCM后產生4個相位的時鐘,分別為clk0、clk90、clk180和clk270;分別使用上述4個時鐘對LVDS數據進行采樣,同時進行采樣結果分析,以確定最佳的采樣點,最終確定采樣值;8b/10b解碼模塊接收數據恢復完成的10 bit數據并解碼為8 bit數據,輸出給USB3.0接收模塊中,最終傳輸到PC機上保存成數據文件。

圖4 高速異步LVDS數據收發功能實現圖
按照本設計的原理與步驟,依次設計其他仿真測試前端,并利用本設計、測試監控終端、測試服務器、被測設備以及其他測試前端組建一套分布式半實物仿真測試系統,以此驗證分布式前端間的時鐘同步功能以及本設計前端功能的正確性。
利用上述構建的分布式半實物仿真測試系統,并選取其中一個前端作為主時鐘,其他前端作為從時鐘。PTPd的時鐘伺服系統在同步過程開始后周期性計算本地從時鐘與主時鐘之間的時間差,并據此周期性的根據計算的時間差修正本地時鐘。秒級的時間差在同步過程開始后迅速歸零,納秒級時間差在同步過程穩定后在正負10微秒之間動態波動。PTPd同步結果穩定后局部放大如圖5所示。

圖5 穩定后局部放大圖
為了驗證本設計功能的正確性,利用Xilinx官方提供的FPGA開發工具ISE(集成軟件環境)下的ChipScope工具對所設計的分布式半實物仿真測試系統前端部分進行功能的正確性驗證。根據實際測試需求,對實現的SPI總線接口的收發功能以及LVDS高速下行數據的接收功能進行測試。測試結果如圖6和7所示。
經過一系列的測試,本設計的測試前端能夠遵循SPI總線協議,完成對目標軟件的測試數據收發功能;同時也能夠遵循LVDS的傳輸協議,完成對目標軟件LVDS高速下行數據的采集和接收功能。本設計作為分布式半實物仿真測試系統的一部分,達到了設計初衷。
文中從航天嵌入式軟件的特點以及在測試中遇到的實際問題出發,研發了這套分布式半實物仿真測試前端系統。經過一系列的測試以及工程實踐的檢驗,本設計作為分布式半實物仿真測試系統的一部分,圓滿完成了某型號航天器十余個配置項級嵌入式軟件的評測工作,也為分布式半實物仿真技術在軟件測試領域開辟了一條新道路。

圖6 SPI總線接口功能時序圖

圖7 LVDS接口功能時序圖
[1]王彬,張濤.基于ARM-Linux的1553B仿真測試前端系統[J].電子設計工程,2013(20):147-150.
[2]蔣元兵.基于分布式與半實物仿真技術的網絡模擬系統設計與實現[D].成都:電子科技大學,2012.
[3]孫祥祥.分布式系統時鐘同步協議的研究與實現[D].杭州:杭州電子科技大學,2013.
[4]蘇宇,胡珩,張濤,等.基于PTPd的精準時鐘同步技術研究的精準時鐘同步技術研究[J].計算機技術與發展,2016(1):175-180.
[5]陳旿,孫建華,于振興,等.基于IEEE1588的無線傳感器網絡時鐘同步方法[J].系統工程與電子技術,2014(3):565-570.
[6]劉巍,熊浩清,石光,等.IEEE1588時鐘同步系統應用分析與現場測試[J].電力自動化設備,2012(2):127-130.
[7]易勝藍.嵌入式Linux下IEEE1588時間同步的實現[J].電訊技術,2012(5):800-803.
[8]宋升金,許永輝,姜守達.基于PTPd改進的高精密時鐘同步實現[J].計算機工程與應用,2013,49(2):72-75.
[9]韓穎,牟龍華,周偉.IEEE1588協議在合并單元中的應用與實現[J].電力系統及其自動化學報,2012(3):16-21.
[10]王威.半實物仿真測試系統中軟件可靠性測試[D].成都:電子科技大學,2014.
[11]張金山.基于OPC與半實物仿真技術的DCS測試系統的設計與應用[D].天津:天津理工大學,2013.
[12]YANG Jie,WANG Bo-yu ,HUANG Yu,et al.Design of Distributed Real-Time Simulation and Test System Based onVMIC Network and xPC[C]//Proceedings of the 32rd Chinese Control Conference,2014(7):26-28.
[13]陳進朝,杜承烈,黃俊江.Xenomai平臺下基于以太網的實時通信方案[J].計算機工程,2014(10):86-91.
[14]蘇宇,張濤,孫黎.基于Xenomai的實時Linux系統的研究[J].計算機技術與發展,2013(10):1-5.
[15]黃芳.基于S3C2440和RTAI的實時平臺的設計與實現[J].組合機床與自動化加工技術,2014(2):83-86.
[16]張曉龍,郭瑞鋒,陶耀東,等.Linux實時搶占補丁研究及實時性能測試[J].計算機工程,2014(10):304-307.