張 濤,李瑞軍,范延芳
(北京空間飛行器總體設計部,北京 100094)
近年來,隨著航天技術的快速發展,星載嵌入式軟件在型號中發揮著越來越重要的作用。空間站、深空探測等為代表的復雜航天器呈現出智能化、網絡化的特點,越來越多的功能將通過軟件實現,信息流、控制流交互復雜,任務、中斷、IO等時序要求及其嚴苛。面對軟件研制任務激增、研制周期縮短的挑戰和軟件高可靠性和安全性的需求,傳統的基于硬件的星載嵌入式軟件測試已逐漸不能適應新形勢的要求,存在以下問題:
1)硬件設備定制開發,致使型號研制成本高;軟件測試設備都是根據各個型號定制研發的,不同系列型號間難以復用;同時由于型號內許多人員都有需求,重點型號和領域有時還需要配備多套設備,致使型號研制的成本非常高。
2)星載嵌入式軟件測試依賴于硬件研制進度,無法實現軟硬件同步開發和早期驗證。航天器星載軟件測試嚴重受制于航天器單機設備和地面測試設備的研制,測試啟動較晚,導致許多接口和時序問題層層闖關,直到分系統級或者整星級測試的最后階段才暴露出來,對型號研制進度產生極大影響。
3)傳統的基于硬件的軟件測試環境難以對運行狀態進行控制和監視、故障注入困難,無法實現對各種飛行工況和異常工況的測試覆蓋。
全數字仿真平臺針對真實硬件設備生產設計周期長,成本昂貴、使用資源緊張、狀態監視和故障注入困難等缺陷,利用軟件仿真技術,對真實的星載計算機進行虛擬化建模,從而逼真的模擬硬件目標系統[1]。原來運行于星載計算機的嵌入式軟件,可以不加修改直接在虛擬平臺上運行,并且其運行的動態特性與真實目標機上一致。利用全數字仿真平臺,可以在不具備目標硬件的情況下,進行星載嵌入式軟件開發、調試、測試和驗證。
SPARC V8(scalable processor ARChitecture version 8)是采用精簡指令集的CPU指令集架構,其設計的指令集能提高執行的效率以及優化編譯器生成的代碼,從而使代碼執行起來更為高效、快速[2]。基于SPARC V8架構的處理器被廣泛應用于航天領域。運行于SPARC V8處理器的星載軟件在實時嵌入式操作系統的支持下,完成衛星遙測、遙控、總線通信、姿軌控和自主管理等功能。本文提出了一種基于SPARC V8的全數字仿真平臺設計和實現方法, 能夠在不具備硬件環境的情況下,對星載嵌入式軟件進行調試、測試和仿真驗證。
全數字仿真平臺架構如圖1所示。主要包括ECLIPSE集成開發環境、虛擬目標機、虛擬外設模型、設備管理器以及其他輔助工具和配置文件。

圖1 全數字仿真平臺架構
集成開發環境基于ECLIPSE平臺,結合CDT(C Developing Toolkit)插件、調試插件和模擬器插件,結合編譯器、調試器等工具,提供了模擬器配置、目標應用工程管理、目標應用源代碼編輯、可配置編譯和快捷調試、仿真器運行控制等功能。
底層的虛擬目標機與虛擬外設模型構成了功能趨近硬件的虛擬嵌入式硬件模型,提供了目標應用程序的仿真執行環境。虛擬目標機支持SPARC V8 CPU處理器的指令集仿真,同時對CPU寄存器、存儲器、定時器、中斷控制器和串口等內部結構進行仿真。虛擬外設模型包括通用外設和用戶自定義外設,通用外設一般包含1553B總線,659總線芯片,用戶自定義外設一般包括遙測、遙控等專用FPGA邏輯芯片。CPU模型還內嵌了GDB協議,與ECLIPSE的CDT插件調試模塊和目標架構的GDB工具組成完整的調試環境。
作為集成開發環境與底層模型的適配器,設備管理器收集IDE提供接口、自身提供接口以及虛擬CPU提供接口,向上對IDE提供模擬器控制接口,解析模擬器配置文件;向下可依據配置信息調用并管理相應虛擬設備,并為虛擬設備提供統一的模型接口。
虛擬目標機是全數字仿真平臺的核心,為目標程序測試和驗證提供虛擬的硬件平臺。虛擬目標機通常包括SPARC V8 CPU模擬器、存儲器仿真、片上外設如中斷控制器、定時器等模型仿真。
SPARC V8 CPU模擬器使用了動態二進制翻譯器翻譯目標指令到本地X86指令,并在指令執行時按照指令的功能操作相應的寄存器和觸發中斷或異常。
2.1.1 寄存器模擬
虛擬CPU內核內部維持了一個處理器狀態結構體變量(記為CPUSTAT),成員包括寄存器變量定義和其他輔助變量定義。在虛擬CPU內核初始化時保存變量CPUSTAT中各目標寄存器變量的偏移;在目標代碼執行開始時將變量CPUSTAT指針存入固定的本地寄存器(記為LRx)中,LRx不會再被用作它途;在需要使用目標寄存器(記為TR)時,以LRx寄存器值為基地址加上保存的目標寄存器的偏移,則獲取目標寄存器在本地內存中的地址,就可取得目標寄存器的值或向目標寄存器賦值。
2.1.2 指令翻譯與執行
虛擬CPU內核使用動態二進制翻譯技術將SPARC V8的指令翻譯成本地X86指令,包括目標代碼到中間代碼的前端翻譯和中間代碼到本地代碼的后端翻譯兩個翻譯過程,如圖2所示。

圖2 動態二進制翻譯執行
動態二進制翻譯以基本塊為翻譯和執行的基本單位,其中基本塊為一段一般以跳轉指令為結尾的一段目標代碼;采用邊翻譯邊執行的策略,只有在執行時翻譯代碼緩存中未發現待執行基本塊才進行翻譯和緩存;前端翻譯中還進行內存管理和異常處理等。
2.2.1 存儲器模擬
存儲器的模擬是將虛擬目標存儲器直接綁定到相同大小的本地內存上,虛擬目標機訪問存儲器實際是訪問綁定的本地內存區域。同時,作為采用大端模式的處理器,在訪問存儲器數據時需要進行字節序的調整。
2.2.2 中斷模擬
中斷和陷阱是兩種異常處理機制。陷阱是由與特定指令相關的硬件引起的異常,在引起異常產生的指令運行期間觸發;中斷是由處理器的外部事件產生并在指令執行期間發生。
對于陷阱的模擬是在相關指令翻譯時插入陷阱條件判斷邏輯,并在執行時依條件觸發陷阱,陷阱觸發后虛擬CPU內核進入異常處理邏輯;對于中斷的模擬是通過置標志位使基本塊退出執行,虛擬CPU內核進入異常處理邏輯。虛擬CPU內核進入異常處理邏輯后,依照硬件邏輯操作相關寄存器并根據特定的異常向量表完成程序的跳轉。
虛擬中斷控制器在初始化時以內存映射MMIO(MEMORY-MAPPED IO)方式映射寄存器到虛擬CPU內核地址空間的指定地址區域,在虛擬CPU內核訪問虛擬中斷控制器的寄存器時觸發相應的寄存器處理邏輯。同時,分配虛擬中斷輸入引腳和中斷輸出引腳,并注冊中斷信號輸入回調。虛擬中斷輸入引腳根據硬件中斷引腳連接分別接入虛擬片上外設中斷引腳或虛擬外部中斷引腳,虛擬中斷輸出引腳分別接到虛擬CPU內核的中斷引腳,如圖3所示。當中斷輸入信號到來時觸發注冊的中斷信號輸入回調函數,根據寄存器編程配置進行中斷信號選擇輸出到虛擬CPU內核。

圖3 中斷控制器結構示意圖
2.2.3 定時器模擬
定時器的寄存器模擬使用虛擬CPU內核中的MMIO映射機制實現。當虛擬CPU內核訪問到該虛擬定時器的寄存器地址區域時觸發MMIO的訪問回調,在回調函數中處理寄存器的訪問邏輯。
定時器的中斷模擬是在虛擬定時器創建時創建一個虛擬中斷引腳,并將其連接到虛擬中斷控制器相應引腳上。當虛擬定時器需要觸發中斷時,向虛擬中斷引腳設值則會觸發虛擬中斷控制器的中斷信號輸入回調函數。
定時器的計時功能模擬依靠虛擬CPU內核中的精確減計數器機制實現。虛擬CPU內核中維護了一個減計數器集合,創建或刪除虛擬定時器時會操作該集合增加或刪減。虛擬CPU內核中有獨立的線程循環檢查減計數器是否計數到0,到期后則觸發創建定時器時注冊的回調函數。
2.2.4 串口模擬
串口的寄存器模擬使用虛擬CPU內核中的MMIO映射機制實現。當虛擬CPU內核訪問到該虛擬串口的寄存器地址區域時觸發MMIO的訪問回調,在回調函數中處理寄存器的訪問邏輯。
串口的中斷模擬是在虛擬串口創建時創建一個虛擬中斷引腳,并將其連接到虛擬中斷控制器相應引腳上。當虛擬串口需要觸發中斷時,向虛擬中斷引腳設值則會觸發虛擬中斷控制器的中斷信號輸入回調函數。
串口的數據流可以定向到虛端口,也可基于虛擬CPU內核提供字符驅動選擇定向到本地虛擬串口、TCP端口或UDP端口。當數據流定向到虛端口時,可以在虛端口的連接端進行數據交互;定向到其他本地端口時,可以使用本地輔助工具進行數據交互。
本地端口作為數據流傳輸方式時,發送數據通過相應本地端口數據發送接口發送。當循環檢查線程檢測到本地端口有數據時,會向虛擬串口詢問是否接收數據,允許后將接收的數據返回給虛擬串口,虛擬串口操作相關寄存器并根據用戶編程配置決定是否向終端控制器投遞中斷信號。
對于虛擬CPU內核主動要求外設動作的通信,虛擬CPU內核訪問外設寄存器時觸發寄存器上的MMIO回調函數,在回調函數中實現外設的功能。
對于某些外設事件發生要通知虛擬CPU內核,虛擬CPU內核會主動循環檢查。虛擬CPU內核內部使用循環檢查線程來檢查虛擬定時器到期和虛擬串口數據到來等事件,檢測到這些事件后通知相關虛擬外設進行相應的處理,如寄存器改變和觸發中斷等操作。虛擬CPU內核通過查詢相關寄存器或響應中斷得知事件源并進行相應處理。
虛擬外設模型用來搭建虛擬目標機的外圍仿真環境,實現虛擬目標機與外設模型的數據交互。為了保證被測軟件的真實性,虛擬外設模型的邏輯功能必須與硬件邏輯功能保持一致:即虛擬外設模型接收到虛擬目標機的輸入輸出請求時,需要根據硬件邏輯改變自己的狀態。虛擬外設模型可為虛擬目標機提供輸入激勵,如模擬上行遙控注入,也可以接收虛擬目標機輸出數據,如接收下行遙測輸出。因此,虛擬外設模型建模是全數字仿真平臺開發的一個重要環節。
虛擬外設模型仿真接口作為虛擬目標機的擴展媒介,需要盡可能簡便直觀地將虛擬CPU內核與外設模型間的不同操作隔離。模型仿真采用單個函數以消息類型方式分隔操作,提高接口的擴展性、易使用性,也保證各接口的單一性。
虛擬外設模型導出函數接口如下:
MainProc(MESSAGE Msg, UINT32 uParam)
其中第一個參數Msg是消息類型,代表不同的操作,共有以下幾種消息類型:
1)SETPROPERTY消息用于設備管理器解析模擬器配置文件中的外設模型的屬性;
2)INIT消息用于設備管理器通知外設模型進行端口創建等初始化操作;
3)RESET消息用于設備管理器通知外設模型復位操作;
4)READ/WRITE消息用于設備管理器通知外設模型虛擬CPU內核正在進行uParam參數指定的IO讀/寫操作;
5)PINCONNECT消息用于設備管理器通知外設模型虛擬引腳有電平信號輸入;
6)VWRITE消息用于通知外設模型大量邏輯數據輸入;
7)CLOCK消息用于通知外設模型uParam指定的時鐘定時到期;
8)TERMINATE消息用于通知外設模型虛擬目標機即將終止,進行終止前的資源釋放等操作。
虛擬外設模型端口是全數字仿真系統中CPU內核與其他設備模型通信以及模型間通信的接口,包括IO端口、虛端口和PIN引腳。
3.2.1 IO端口設計
IO端口是虛擬外設模型與虛擬CPU內核間的通信媒介。IO端口的設計包括3個部分:
1)IO端口初始化。在模型初始化時,IO端口初始化完成端口ID、名稱和類型初始化。
2)IO端口配置。設備管理器會解析模擬器配置文件中IO端口配置,創建MMIO并在訪問回調函數中觸發READ、WRITE消息。IO端口配置默認寬度為4字節,可配置其他尺寸表示寄存器區域。
3)IO端口訪問。虛擬CPU內核在訪問IO端口所處地址區域時會觸發READ、WRITE消息,在消息回調中進行IO的邏輯處理。
3.2.2 虛端口設計
虛端口是設備模型間大量數據的通信媒介。虛端口的設計包括3個部分:
1)虛端口初始化。在模型初始化時,虛端口初始化完成端口ID、名稱和類型初始化。
2)虛端口連接配置。設備管理器會解析模擬器配置文件中虛端口連接配置,保存虛端口連接關系。虛端口支持一對多連接配置。
3)虛端口寫操作。在設備模型進行虛端口寫操作時,設備管理器會依據虛端口連接關系向所有連接端虛端口寫入數據。
3.2.3 PIN引腳連接設計
引腳是設備模型間電平信號的通信媒介。引腳的設計包括3個部分:
1)引腳初始化。在模型初始化時,引腳初始化完成ID、名稱和類型初始化。
2)引腳連接配置。設備管理器會解析模擬器配置文件中引腳連接配置,保存引腳連接關系。引腳支持一對多連接配置。
3)引腳寫操作。在設備模型進行引腳寫操作時,設備管理器會依據引腳連接關系向所有連接端引腳寫入電平信號。
當全數字仿真平臺啟動時,設備管理器會解析模擬器配置文件,根據解析的信息啟動相應的模擬器并執行指定的目標應用。設備管理器在模擬器啟動時的主要工作如下:
1)解析全數字仿真平臺構建所需的模擬設備,加載相應設備DLL。
2)解析模型內存、IO、虛端口、引腳配置,保存所有IO、虛端口和引腳連接關系。
3)以RESET消息復位CPU及各虛擬外設。
全數字仿真平臺啟動后,設備管理器在模擬器運行中的主要工作如下:
1)在虛擬CPU訪問IO端口時,設備管理器創建IO端口時的回調函數會觸發,在回調函數中向IO端口所屬設別發送READ/WRITE消息。
2)在虛擬CPU或外設模型拉動引腳時,設備管理器查找引腳連接關系向連接端設備引腳發送PINCONNECT消息。
3)在虛擬CPU或外設模型寫虛端口時,設備管理器查找虛端口連接關系向連接端虛端口發送VWRITE消息。
4)當虛擬外設模型創建的定時器到期時,設備管理器在定時器到期回調函數中以CLOCK消息通知所屬設備到期定時器ID。
為了盡可能保證虛擬目標機、虛擬外設間時序統一并與真實硬件時序保持一致,虛擬CPU內核時鐘使用指令統計周期作為基礎。虛擬CPU核在翻譯指令時一般以跳轉指令為結尾作為一個基本塊,在每個基本塊翻譯時將基本塊內所有指令的執行周期、取指周期和其他周期求和計算出基本塊的總時鐘周期并保存。在目標代碼執行時,對所有執行的基本塊進行時鐘周期求和,再結合CPU內核的主頻即得到所有執行的目標代碼耗時,即得到模擬時間。
虛擬CPU核內部的減計數器功能就是基于模擬時間進行計數的,減計數器Tick為1ns。在減計數器創建時,根據目標計數值和當前模擬時間設置到期計數值,并安裝計數到期回調函數。虛擬CPU核使用循環檢查方式檢查當前模擬時間是否達到減計數器到期計數值,達到后觸發到期回調函數進行到期邏輯處理。如果減計數器是單次計時則到期后就刪除,否則減計數器的計數值復位并重新開始計數。仿真平臺內部虛擬設備的定時功能均使用減計數器實現,這就保證了所有虛擬設備的時間是統一的。
本文設計與實現的全數字仿真平臺已在航天器多個型號的星載軟件測試中得到應用,該平臺可作為SPARC V8處理器的模擬運行平臺,支持RTEMS和VxWorks操作系統,同時提供良好的人機界面,便于用戶快速搭建虛擬目標機和虛擬外設環境,進行星載嵌入式軟件運行仿真、調試驗證等工作。
通過測試程序在硬件實物上運行結果與全數字仿真平臺上的運行結果,遙測、遙控、總線通信等功能均正確仿真,表1為某個進程相同斷點下目標機與全數字仿真環境寄存器和內存的值,兩者保持一致,全數字仿真平臺運行結果正確。
本文設計并實現了一個基于SPARC V8的星載嵌入式軟件全數字仿真平臺,該平臺與基于硬件的測試平臺相比具有可重用性強、可快速搭建、成本低廉、高可控性、調試和測試手段豐富、支持故障注入等優點。該全數字仿真平臺已在星載嵌入式軟件型號研制工作中得到了應用,可大大提高軟件的可靠性和安全性,從而保證型號軟件的質量,推動航天事業的發展。

表1 全數字仿真與目標機運行結果比對