嵌入式系統是“控制、監視或者輔助裝置、機器和設備運行的裝置”,是軟件和硬件的綜合體。嵌入式軟件既是電子系統的核心,也是硬件系統的有效補充。需要具備防錯、判錯、糾錯、容錯的功能。嵌入式系統安全性的失效可能會導致災難性的后果,即使是非安全性系統,由于大批量生產也會導致嚴重的經濟損失。這就要求對嵌入式系統,包括嵌入式軟件進行嚴格的測試、確認和驗證。
早期的嵌入式計算機大都是針對具體任務而設計的專用計算機。這種專機專用的設計方法在應用中逐漸暴露出許多弊端。首先,設計成本很高;其次,設計中有很多低水平重復性勞動;第三,要配備專用的維護人員,增加了費用等。而嵌入式系統的通用化設計則可以彌補這些不足。
國外對嵌入式軟件測試的研究始于70年代,軟件測試方法主要是針對單個系統的。在此后的20年,許多研究機構針對嵌入式軟件的實時性、嵌入性和反應性等問題進行了大量的研究,許多支持嵌入式軟件測試的工具也應運而生。很多計算機公司把嵌入式計算機設計成商用貨架產品,取得相當的成功。90年代中后期,國內開始對嵌入式軟件測試技術和測試工具進行研究,多數產品只應用在某一領域,通用化程度有待進一步提高,目前大型的軟件工程都使用國外的軟件測試平臺。
實時軟件的正確性由功能、行為和時間特性決定。如何對軟件的時間特性進行驗證成為嵌入式軟件可靠性的核心問題之一。對軟件的時間測試可分為靜態時間分析和動態實時檢測兩種方法。
靜態時間分析就是不執行被測程序,而通過分析程序結構來預估程序、子程序執行時間的方法,它不知道子程序實際運行時的分支走向和循環次數等不確定性因素,因此不能得到程序的實際執行時間。但靜態分析可以確定程序在最壞情況下的執行時間,即程序最大執行時間是否滿足時間約束。由于實時系統需要在任何情況下都在指定期限前完成任務,計算程序的最大執行時間具有非常重要的意義。
動態實時檢測就是通過執行程序來測試程序的時間特性。在線仿真器ICE、指令仿真器和插樁工具是三種最常用的方法。
實時性使得嵌入式軟件的測試用例編寫不僅要測試軟件的功能和行為特性,還要測試其時間特性,這給傳統的測試用例生成方法帶來了新問題。
嵌入式軟件的開發環境和運行環境的不一致,也給嵌入式軟件可靠性的測試帶來了不少麻煩。一方面,測試工具運行在宿主機上,測試所需要的信息在目標機上產生,并通過一定的物理/邏輯連接傳輸到宿主機上,由測試工具接受。因此,嵌入式軟件測試的一個重要問題是建立宿主機與目標機之間的物理/邏輯連接,解決數據信息的傳輸問題。
另一方面,即使在宿主機環境下測試再充分,也不能說明在目標機環境下該軟件運行不出問題。因而,嵌入式軟件還面臨著目標環境的測試。這不僅增加了測試的代價,而且還帶來了嵌入式軟件測試策略問題,即哪些測試分配在宿主環境進行,哪些測試分配到目標環境下運行。
反應性系統在任何時刻都要對可能出現的時間作出適當反應。由于“激勵-響應”在反應式系統中占主要地位,因此這類系統包含大量復雜的控制行為。
并發性是反應式系統最重要也是最基本的特征,任何反應式程序中均包含若干并發進程。所以,反應式不能簡單的將它定義為輸入和輸出數據的函數,而需要表示為一個輸入和輸出序列的二元組。
嵌入式系統最大的特點是以控制為主,軟硬件結合較多,功能性操作較多,模塊互相調用較多,外部工作環境復雜,容易受到干擾或干擾別的設備,且執行錯誤的后果不僅僅是數據錯誤而且有可能導致系統崩潰等不可估量的災難。在設計過程中需注意軟硬件接口之間的冗余和預防性設計,可采用看門狗電路、狀態保存等恢復技術;軟件鎖設計、程序陷阱設計等抗干擾技術以及備份技術有效的進行系統容錯設計。
軟件可靠性測試是在軟件生存周期的系統測試階段提高軟件可靠性水平的有效途徑。各種測試方法、測試技術都能發現導致軟件失效的缺陷,排除這些缺陷后,一般來講一定會實現軟件可靠性的增長,但是排除這些缺陷對可靠性的提高的作用卻是不一樣的。其中,軟件可靠性測試能最有效地發現對可靠性影響大的缺陷,因此可以有效地提高軟件的可靠性水平。
預處理。在程序源代碼被編譯之前,由預處理器對程序源代碼進行的處理。這個過程并不對程序的源代碼進行解析,但它把源代碼分割或處理成為特定的符號用來支持宏調用。如果測試的源代碼是匯編的,要將短跳轉改成長跳轉。
詞法語法分析。詞法分析負責將源程序中的若干字符劃分為若干記號,語法分析負責從若干記號中完成程序結構分析,識別出函數體、語句、表達式、關鍵字、程序分支等。
插樁技術。一般對程序進行動態測試時,使用程序插樁來進行覆蓋測試,使被測試程序在保持原有邏輯完整性基礎上在程序中插入一些探針函數即插樁語句,它是一個子過程調用,調用的子過程能在運行到插樁點時記錄下有關的運行情況。基于這些運行情況的分析,可以獲得程序執行過程中變量值的變化情況,也可以用來檢測程序的分支覆蓋和語句覆蓋等覆蓋信息。
被測試程序首先經過預處理,主要是進行宏替換和將短跳轉改為遠跳轉。然后進行語法詞法分析,對整個程序進行掃描后,生成相互有關聯的鏈表,確定插樁函數的位置,在一些關鍵的字段和函數中插入樁,然后編譯生成含有插樁函數的目標文件。在動態測試的集成環境中,用戶選擇需要測試類型是分支覆蓋還是語句覆蓋,相應的生成一個記錄了該測試類型中所有函數的位置或者ID號的插樁文件,并自動生成相應的測試用例。根據插樁選擇記錄文件激活相應的插樁函數。系統運行后,將得到的信息返回給測試機,將測試結果記錄到事先確定的緩沖區或文件中。測試人員就能根據測試結果與期望值相比較來判定覆蓋情況是否滿足要求了。若不能滿足要求,就利用工具進行覆蓋情況分析,找出未覆蓋目標,根據控制流圖,找出到達此目標的路徑,依據此路徑上各分支節點要到達此目標應滿足的條件,設計新的測試用例,以增加覆蓋率,最后將結果以GUI的形式顯示。
全面提高嵌入式軟件的質量、可靠性、安全性,需要提高嵌入式軟件開發人員的素質。開發策略、程序設計、測試手段、安全分析、代碼審核都要規范,避免開發工作的隨意性、盲目性。
[1]李伯成.嵌入式系統可靠性設計[M].北京:電子工業出版社,2006.
[2]武曄卿.嵌入式系統可靠性設計技術及案例解析[M].北京:北京航空航天大學出版社,2012.