王明亮,王 永,常 亮,徐元旭,尤志堅
(1.中國科學院微小衛星創新研究院,上海 201203;2.上海微小衛星工程中心,上海 201203)
小衛星以其研制周期短、經費低、可多星發射等優點在國內外掀起了研制熱潮,軟件密集化是小衛星技術的重要特點之一。星務軟件作為小衛星集中管理功能的核心中樞,包括星務管理、定姿、姿控、定軌、軌控、遙測、遙控、能源、熱控、載荷管理等功能組件的大型復雜軟件,一般通過引入嵌入式實時操作系統進行多任務并行控制和管理。任務模塊間的耦合性高、數據接口復雜多樣和時間同步需求不統一等特點,導致其可靠性和在軌可維護性等難以通過地面測試得到完全保證。軟件開發工作也變得更加復雜,軟件版本更迭頻率也越來越快,以致在軌航天器的日常運維管理工作日益艱巨[1]。
傳統的硬件可重構是指通過特定的指令集配置,使得該計算機結構可變為針對特定算法的專用計算機結構[2]。針對衛星單機,硬件整體功能通過軟件定義重組基礎功能來改進和重構衛星,提高衛星多功能處理任務能力[3],同時,衛星在軌服務是未來主要發展趨勢之一,在軌軟件重構和硬件重構技術也是其主要核心技術[4-5]。
為提高衛星在軌處置未預計軟件異常的能力,星務軟件在軌重構技術應運而生。通過任務級軟件可配置,將模塊分為通用模塊和配置參數,實現了軟件模塊的可配置,完成了軟件系統的可配置和重構[6]。上載軟件在軌定義多功能、軟件可控多功能、參數可重構也是未來智能衛星發展的國家重大戰略需求[7]。另一方面,由于硬件設計的限制,星務計算機存儲空間一般非常有限,一次無法加載所有復雜的任務程序,通過在線重構技術,可以在衛星在軌后進行程序上注,使衛星能完成更多的功能[8]。
衛星在軌運行期間,所搭載的軟件組件、模塊如果能夠通過地面遙控上行信道注入的方式進行動態更新,以修復潛在缺陷、重構載荷任務等,或者通過最小安全模式軟件中的串口加載功能,可以將星載應用軟件以APP 的形式進行安裝與卸載[9],則可以提高航天器的可靠性、可維護性、恢復性等。例如,獵鷹9 第一級9 臺默林1C 發動機中的1 號發動機出現異常而被姿控系統提前關閉,這臺發動機位于“井”字形布局的一個角上,之后姿控系統通過重構控制,重新生成一個上升軌跡并在軌注入,并利用其他8臺發動機最終順利完成發射[10]。
文中通過分析當前國內星務軟件在軌重構技術,結合VxWorks 操作系統的模塊裝載功能,提出星務軟件快速加載重構技術,提高星務軟件在軌重構的可用性,增強衛星在軌可維護能力,通過在量子通信科學實驗衛星超期服役期間新增載荷任務的上注驗證測試,測試結果表明該方法可以在更大地址空間和更細粒度實現星務軟件在軌動態加載重構。
重配置技術的出現適應了現代衛星的發展需求,通過重配置手段,實現了對基礎嵌入式系統的設計[11]。該技術對于衛星在軌維護和修復特別有益。另一方面,由于衛星載荷的工作需求會導致公用平臺星載軟件功能進行定制式修改,破壞衛星平臺設備的一致性,需要將共性功能產品化并支持軟件重構[12]。目前國內衛星在軌軟件重構可歸納為模塊間接調用、整體替換、進程重構3 類。
這種模塊間接調用的方式,是當系統改變任務時,將相應用途的配置程序從計算機文件系統加載到FPGA 中,調用相應用途的計算機處理軟件,即完成整個系統的任務轉換[13]。在調用新軟件時,建立函數入口查找表、子程序地址表或模塊重定向表,將可能進行替換的函數入口地址、子程序或模塊的入口地址寫在表內,在訪問這些子程序或模塊時,需要查閱該表獲得地址,修改某子程序地址至新注入代碼的首地址,即實現了對該子程序的替換或重構。該方法需要在星務軟件設計時預先確定哪些模塊設計可重構,若設計較多的可替換模塊,可重構范圍較大,但頻繁的模塊間接調用會增加軟件系統自耗,將低函數執行效率,并增加軟件設計師的工作量,若設計較少的可替換模塊,則可重構范圍較小。因此該重構方法不適于解決衛星在軌未知異常。
星務軟件代碼通常固化在非易失性存儲器(NVM),如ROM 或Flash 存儲器,星務軟件啟動時,直接執行或拷貝ROM 中的代碼至RAM,然后再運行。NVM 另預留了新代碼存儲空間,遙控注入新的代碼主體,寫入NVM 新代碼存儲區,再通過地面指令或軟件自主啟動新代碼執行。采用全系統可重構衛星架構軟件設計,在不降低衛星性能、功能指標的同時,可有效減少衛星內部通用部件數量,降低衛星復雜程度。該方法雖簡潔易行,可重構的范圍可覆蓋整個星務軟件系統,但無論重構的變化大小,每次都需替換整體代碼,所需遙控上注數據量大,不利于在軌軟件快速重構以及時解決問題。
目前,國內星務軟件已普遍采用嵌入式實時操作系統,基于實時操作系統的星務軟件以進程為單位調度運行,因此形成了以進程為單位的重構顆粒,包括進程的增加、刪除或屏蔽、調整優先級及運行調度周期等,軟件在軌重構方式的多樣性和靈活性顯著提高,所需上注的數據量較整體替換方法有較大下降。進程重構較其他重構方法,軟件運行靈活性大大增加,增強了軟件重構解決在軌未知異常的能力。實際在軌應用中大多是部分軟件代碼需要變更,不需要進行整體替換。通過在空白區注入新的指令代碼,將舊代碼區的函數調用引向新代碼的方式,實現程序區的局部代碼更新[14]。利用嵌入式系統中已廣泛應用的模塊動態加載技術,將結構化軟件分為多個模塊。軟件重構以模塊為單位進行,合理設計模塊,可大大減小遙控上注數據量。
文中提出的星務軟件重構技術是基于VxWorks操作系統,將進程重構和模塊動態加載緊密結合,極大限度實現星務軟件在軌重構的能力,并減少重構規模。
傳統軟件編程是把程序分割成若干個獨立的模塊,然后逐塊編程和獨立編譯,形成獨立的待鏈接模塊,模塊在被鏈接前保持本身的獨立性。一個應用軟件是由多個獨立模塊通過鏈接形成的,鏈接方法有兩種:靜態鏈接和動態鏈接。
靜態鏈接是將各模塊解決了所有的外部引用之后,編譯生成一個可執行代碼,必須裝入指定內存并執行。程序中的代碼段和數據段的位置必須是鏈接時指定的,不能改變。
而動態鏈接是系統在運行過程中根據需要把外部某模塊的待加載文件鏈接到系統中,使之成為運行系統的一部分的過程。動態鏈接在執行過程中,允許軟件系統發生變化,某時刻可加入新的模塊、清除舊的或當期不需要運行的模塊,重新構成一個新的程序。動態加載機制是操作系統中廣泛采用的一種軟件加載方式,它強調將應用和軟件代碼庫分離,只有當需要時才加載指定代碼模塊,強調需要時再加載,不需要時可以卸載模塊或轉移至外部存儲區。
星務軟件系統動態加載需要掃描系統符號表,完成待加載模塊的代碼段和數據段進行重定向,并更新系統符號表,通常需要耗費較長時間。因此,直接的動態模塊加載比靜態鏈接運行方式,增加了軟件系統建立時間,對于實時性要求很高的星載嵌入式系統,必須考慮在軌軟件建立時間過程的衛星系統安全性。嵌入式系統動態可加載模塊的格式類型主要有A、OUT、ELF、COFF、OMF、OBJ 文件等,文中以A、OUT 文件格式為例說明動態加載。
目前,國內星務軟件可執行代碼較常見的是以靜態地址鏈接方式形成。靜態地址方式下實現軟件重構,需要人工去管理各進程模塊的地址,需要比對新舊代碼確定模塊是否需要更新。同時,軟件各模塊地址分配時,需要有冗余空間以應對可能的模塊擴張。靜態地址重構不利于下層或底層代碼的調整。若要修改底層代碼,需同時重構所有與該底層模塊有調用關系的其他模塊,會增加上傳數據量。
文中提出基于VxWorks 操作系統的星務軟件可配置動態加載重構技術,是進程重構方法的深入,將動態鏈接技術與星務軟件重構需求相結合,通過動態加載的方式構建星務軟件系統并運行,成功克服了模塊間接調用和整體替換方法的不足。該技術采用動態加載重構方法,克服了靜態鏈接方式不利于底層或下層代碼重構的不足。
星務軟件采樣基于RTOS 的動態加載重構技術后,將具有以下3 方面優點:
1)有利于軟件系統升級或重構。通過動態加載機制,實現以模塊為單元的軟件重構,由于模塊的獨立性,只需要上注和更新需要變更的模塊。解決靜態地址重構不利于底層或下層代碼變更的不足;
2)使星務軟件功能更具多樣性。軟件實現模塊級重構,軟件系統可存有多種任務備用模塊,如試驗算法模塊、新技術任務模塊等,通過組合加載不同的模塊,靈活實現在軌應用任務;
3)更便于軟件開發及配置管理。復雜星務軟件通常需要多人協同開發,分別負責不同的模塊研制。動態加載方式下,各個模塊配置輸出獨立,即便于各自調試,又便于軟件配置管理。
要實現軟件系統定制模塊的快速加載,首先必須建立相應的軟件開發環境。星務軟件在Tornado開發環境下,將工程設計為多項目工程,如圖1 所示。項目輸出包括一個VxWorks 鏡像文件和9 個模塊的待裝載文件(A.out格式文件)。

圖1 Tornado軟件工程多項目架構
將VxWorks 鏡像及各裝載文件存放在星載目標機的NVM 中,如圖2 所示。為提高軟件系統的可靠性,實際在NVM 中存放多份VxWorks 鏡像及各待裝載文件,每個鏡像或模塊都設置校驗。

圖2 星務軟件數據存儲規劃
為了實現快速加載,該設計的重構數據塊通過定制配置化的模塊加載表保存在NVM 的前部,配置化主要包括以下3 方面:
1)可配置自動加載模塊;
2)可配置自動進程創建;
3)可配置進程運行方式。
模塊裝載表中由多個模塊裝載單元組成,具體數據結構如下:

通過模塊裝載表實現模塊自主加載及進程運行參數設置。TaskStatus 用于區分模塊是否僅裝載,是否裝載后需要創建任務并運行。通過調整進程優先級、進程調度策略可靈活地實現軟件運行方式的重構。
星務軟件動態加載的啟動流程如圖3 所示。

圖3 星務軟件動態加載啟動流程
上電或復位后,在完成寄存器及內存初始化后,將VxWorks 鏡像(預存在NVM)拷貝并跳轉執行,在完成VxWorks 初始化后,程序進入用戶程序入口,即usrAppInit()。在usrAppInit()中,從NVM 讀取并遍歷模塊裝載表,將裝載單元bAutoLoad 為TRUE 的模塊加載至軟件系統,當TaskStatus 為TRUE 時,創建進程并設置參數。若模塊裝載過程出現異常,即無法建立應用軟件系統,則自主跳轉至ROM 中的安全模式代碼并執行,等待地面遙控修改模塊裝載表、新增或修改模塊文件,即重構應用軟件系統。
星務軟件系統建立后,可以隨時根據地面指令和注入數據實現在軌軟件重構。在軌軟件運行中的重構步驟如下:
1)接收地面注入數據(模塊信息),并按要求寫入NVM;
2)接收地面注入數據,更新模塊裝載表;
3)接收并執行重構指令,包括指定模塊裝載、指定模塊卸載、增加或刪除進程、修改進程優先級和調用周期等。
對于時序關聯性強或特定情況的任務重構,需在模塊裝載表更新后,進行操作系統初始化,重新讀取模塊裝載表,進行軟件系統重建。
VxWorks 作為嵌入式高可靠實時操作系統,在航空航天領域被廣泛應用,其具有可裁剪的模塊動態加載功能,用戶可通過直接添加VxWorks 的loader components 組件來獲得模塊加載器。
基于VxWorks 模塊動態加載功能的星務軟件重構方法,是將通用嵌入式系統動態加載可執行文件或目標文件的方法直接用于星務軟件系統。但星務軟件直接采用VxWorks模塊加載功能存在兩方面不足:
1)功能組件自身開銷較大。VxWorks 的模塊加載組件是基于文件系統IO 驅動,直接選用該組件將明顯增加VxWorks 的規模,不利于在資源昂貴的星載計算機應用;
2)不利于軟件調試。各模塊通過動態方式裝載至內存,因此,裝載后代碼和數據的位置用戶無法獲得,研制過程中,難以進行軟件調試和問題分析。
在VxWorks 加載模塊原代碼基礎上,進行如下4方面的改寫,以減少加載器自身資源的要求。
1)自定義模塊創建時文件名輸入規則,取消對模塊文件名的讀取過程,取消文件名與模塊名的關聯;
2)直接內存地址訪問模塊數據代替文件索引及讀寫操作,即脫離文件系統;
3)簡化模塊創建時的動態內存分配邏輯;
4)刪除C++模塊裝載過程中構建函數的映射和調用,析構函數的映射。
如果載荷功能節點所有的軟件版本都不能滿足使用要求,或者有新增任務需求時,則可以利用地面上注軟件及更新技術來實現[15-16]。在量子通信科學實驗衛星超期軌服役期間,衛星用戶方新增了部分載荷實驗任務,為此相匹配的進行了部分地面站計算代碼的函數級細粒度動態重構,在衛星入境的弧段,按照前一節的方法成功進行了地面站計算的代碼position.out 上注重構。在衛星后一軌入境后,通過指令遙測下傳相關上注代碼的校驗、幀頭等信息,通過遙測參數發現,星上軟件平滑切換使用上注的地面站計算模塊代碼,圓滿完成量子科學實驗衛星超期服役期間的新增載荷任務。
文中根據星務軟件的實際需求和發展趨勢,提出了基于快速動態加載的星務軟件重構技術,包括模塊快速加載、進程創建、可配置進程運行等,使在軌軟件重構更靈活,極大方便了在軌軟件的升級維護以及在軌延壽升級等,從而提升星務軟件在軌運行的可靠性和可維護性。