摘要:傳統的嵌入式系統軟件測試方法對被測試系統有一定的干涉效應,影響了測試結果的精確性。采用NIT(non-interference test,非干涉測試)方法可以將這種影響消除,從而得到精確的測試結果。與傳統的測試方法不同,該方法的特點在于對目標系統完全是非干涉的,也就是不需要在目標軟件中駐留任何僅用于測試的可執行代碼。因為NIT是對目標系統硬件和軟件定制性很強的測試方法,而嵌入式系統的硬件、軟件組合是非常靈活而復雜的,所以將NIT應用于實際的測試工程必須解決如何適應不同體系結構目標機器的問題。具體來說,如何適應異質的硬件,如何面對不同目標系統都能在數據采集的同時高效率地分流過濾以便減小數據分析的壓力,如何在數據分析階段適應不同的高級編程語言的測試?針對這些問題進行了相關分析。
關鍵詞:嵌入式系統;軟件測試; 白盒測試;確認測試; 體系結構
中圖分類號:TP311.5文獻標志碼:A
文章編號:1001-3695(2007)12-0080-03
1NIT方法的局限性
文獻[1]提出了對被測試目標系統無干涉效應的測試方法NIT。這是一種軟硬件結合的測試方法,通過硬件連接到目標系統,采集被測試系統硬件中相關部分的狀態信息,獲得分析必需的原始采集數據。
圖1為NIT的體系結構。其基本特征是:主動采集被測試系統運行狀態數據并根據測試需求進行必要的分析但不影響目標系統的運行。通過獲取目標系統運行時全部或必要的狀態信息,結合被測試目標軟件的靜態特征,就可以了解目標軟件的實際執行情況。所以,NIT是一種軟硬件結合的白盒測試方法。實際上,NIT方法最大的應用價值在于可以對被測試系統在系統集成測試階段提供最終的確認測試。
因為NIT是對目標系統硬件和軟件定制性很強的測試方法,而嵌入式系統的硬件、軟件組合是非常靈活而復雜的,所以將NIT應用于實際的測試工程必須解決如何適應不同體系結構目標機器的問題。
2NIT適應不同目標機器
NIT實現的前提是能夠以物理連接方式從被測試系統采集到其運行狀態,而測試結果的質量直接取決于采集數據的準確性和完備性。為了能夠準確采集到被測試系統的狀態數據,需要建立NIT的硬件體系結構(圖2)。
NIT的硬件系統應包括采集探頭、數據采集和緩沖設備、數據過濾設備、數據提交設備。采集探頭用于系統與被測試系統的物理連接,直接連接到目標系統的總線上,可以采用集成的夾具與目標系統的處理器或存儲器搭接;作為補充,可以采用離散的探針搭接方式采集離散信號。
數據采集設備用于完成目標系統狀態信息的采集工作,采用可編程邏輯實現。根據被測系統的時序特征,啟動采集邏輯,讀取被采集系統的總線數據。以8086 CPU為例,在大模式工作方式下可以通過處理器的S0、S1、S2等管腳的狀態判斷CPU完整指令周期的轉移,采集CPU總線的讀寫操作[2]。由于FPGA存儲容量小,對于復雜邏輯的處理能力有限,硬件沒有必要對采集數據進行全面的分析,而將這一工作完全交由軟件完成。此外,如果需要采集的數據量比較大,或者在采集中存在數據量劇增的情形,應設置足夠容量的緩沖區。
數據提交設備用于將采集過濾后的數據提交給宿主計算機。如果數據交換速度較高或數據量較大,可以采用PCI或DMA設備來實現;或者為了便于構成分布式多機采集系統,可以采用以太網或者支持熱插拔和串行連接的USB及1394設備來實現;如果數據交換可以事后進行,不要求實時性,也不需要構成采集網絡,可以采用更簡單的串口提交等方式來進行。這些方法在NIT用于不同的測試場合時,均有相應的應用和嘗試。
數據采集的硬件系統與被測系統連接在一起,可以完整地得到被測系統的外部數據訪問信息,實時地進行數據采集。對于具有突發性、數據傳輸量很大的被測系統,NIT在完整、準確地得到系統運行信息方面,具有很好的可行性。同時在進行數據過濾、上傳處理中,通過數據塊編號,避免數據錯誤丟失。因此,采用合適指標的采集設備,硬件數據采集系統能夠保證采樣數據的完整性、準確性。
3數據的過濾處理
在實際應用中,一些實時嵌入式軟件的運行代碼密度很高,對被測試系統運行狀態進行完全的采集將產生數量巨大的采集數據。這給數據的分析處理帶來了實際困難。因為不能保證分析的實時性,并且會因為來不及處理數據導致數據丟失。這個問題是應用NIT方法的一個必須解決的問題,解決思路是對數據進行必要的過濾。可以根據文獻[3~6]的方法估算需要剔除的無關數據的比例,以減輕數據處理負擔。
最簡單實用的過濾是地址對照表過濾。CPU系統指令執行,與指令的地址相關,因此可以在CPU讀取存儲器指令時得到地址信息。對于地址信息的分析可以判斷該指令是有效預取指令還是無效預取指令[1]。對于無效預取指令,由于硬件無法通過程序的上下文判斷,僅能由軟件進行處理。對于無跳轉指令代碼段即基本塊的執行,軟件對程序進行分析后,將代碼段中的入口、出口地址作為關鍵的數據信息,采集上傳。對于代碼段中間的地址信息,由于代碼段的連續性,即使過濾掉也不會影響軟件的正確分析。一種會出現地址跳轉的情況是當中斷發生時,程序轉移至中斷處理程序。對于發生中斷時采集的數據,目前的解決辦法是完全采集而不應進行過濾。
這種過濾方法比較簡單,不關心指令的相關性,而是通過由軟件分析得出的固定過濾條件進行處理。在指令集復雜的情況下,分析指令的相關性更加困難。限于目前HDL語言對復雜過程描述的可綜合性較差 ,對于指令執行的邏輯相關性分析,不便于采用可編程邏輯實現。
利用FPGA便于靈活定制的特點,可以根據被測軟件制訂靈活的地址過濾對照表,進行上述的數據過濾。根據前面的分析,軟件的程序分析僅僅需要程序段的開始和結束地址,即可推斷出程序的運行情況,得到代碼的運行軌跡。根據這一原則,由靜態分析軟件將被測試程序的靜態分析結果轉換為地址過濾對照表,在FPGA內通過采集、過濾、上傳的流水處理,實現部分數據的過濾。這一方法在沒有對測試數據產生副作用的前提下,簡化了軟件分析。這種工作方式體現了軟硬件結合是非干涉測試方法的重要特征。硬件依靠軟件完成地址對照表的生成,軟件得到硬件過濾后的數據,將一部分分析工作轉移到硬件完成。硬件雖然沒有提供進一步的數據分析能力,但通過這一過濾方式,減少了數據傳輸量;更為重要的是,提高了軟件分析的效率和靈活性。
此外,用可編程邏輯來分析被測試軟件的邏輯相關性也是可行的。結合文獻[3,4]的提示,一個可能的思路是采用軟件功能狀態轉移的方式來進行。這種方法目前正在探索中,如果加以實現,將可以提供比較高級的數據過濾。其最終的應用目標應該是完成主要的NIT分析工作而不再主要依賴于軟件的事后分析,以便在NIT框架下提供最優的實時性。
4NIT適應高級編程語言的測試
根據NIT的框架特征[1],從不同目標系統采集得到的原始數據的結構基本相同,均由地址數據、指令數據、采集時間戳以及其他關心的狀態信息(如中斷請求)構成。這些數據僅由被測試系統的體系結構惟一決定,可以用于獨立解釋目標系統的真實運行過程,而無須參考目標軟件是由何種高級語言編寫而成,生成目標代碼時采用的編譯器是什么版本。
用于嵌入式系統軟件開發的語言主要是C、C++等高級語言,以及與目標系統體系結構密切相關的各種匯編語言。由于C、C++語言是體系結構無關的語言,只要解決被測試目標軟件源程序與匯編語言之間的映射關系,即可給出上述目標語言非干涉測試方法解決方案。
嵌入式系統軟件的開發語言種類和版本非常多,而目標軟件的測試人員必須結合被測試軟件的源程序給出各種測試數據結果,并綜合出被測試軟件性能指標和質量指標。所以必須建立各種版本編程語言編寫的被測試軟件的源程序與原始采集數據之間確定的映射關系(圖3)。
給出如下定義用于一致性描述:
MI(map interface)——目標系統源程序與目標碼映射接口。
源程序名字空間——源程序中如下對象的集合:a)指令字符串及對應行號;b)變量名;c)函數名及對應行號;d)標號及對應行號。
NA(name versus address)——對源程序名字空間與對應目標碼的地址建立一一對應的映射關系,并構成〈名字, 地址〉偶對集合。
DA(download address)——用于指導數據采集硬件進行采集的地址集合。
TA(time versus address)——反映目標系統實際運行軌跡的〈時間,地址〉有序偶對集合。
TN(time versus name)——源程序形式反映目標系統實際運行軌跡的〈時間,名字〉有序偶對集合。
由采集得到的原始數據可以分析出機器指令的執行序列TA。由于匯編指令與機器指令的一一映射關系(注:反向的一一映射不成立),結合NA已知,可以得到TN,即TA×NA=TN。又根據如圖3所示的映射關系,可以得到基于高級語言的測試結果。當然,如果源程序就是匯編語言,則測試結果在前一步已經得到。
以上討論說明,只要建立各種高級語言與匯編語言的測試映射關系,即可完成各種高級語言的非干涉測試問題。具體來說,NIT在實踐中必須有一個常見的高級語言與特定體系結構目標系統匯編語言之間的映射接口軟件模塊,用于完成匯編級別測試結果與高級語言測試結果的映射。
值得注意的是,如果源程序的表現形式不同,即上述NA不同,盡管TA相同,則TN也會不同,或者說這些統計結果的數據也會不同。比如C語言的語句覆蓋率會不同于匯編語言。以覆蓋率分析為例,測試結果通常包括提供以下的覆蓋率測量,即分支(判定)覆蓋率、語句覆蓋率、數據值覆蓋率、布爾操作(條件)覆蓋率。以圖3中的例子來說,假設語句C1、C2、C3構成的片段中,C2沒有執行,則該片段的代碼覆蓋率為66%。但從匯編語言的角度考慮,覆蓋率為12/15×100%=80%。這種差別在C語言級別看不出來,則相應的軟件優化也不能進行。所以對高級語言編寫的軟件進行測試時,同時提供匯編語言級別的測試結果可以使測試人員對被測試軟件有更全面的分析。
5一個實際的測試案例
在實驗中,被測試目標系統為基于8086 CPU的嵌入式系統,采集對象為CPU總線。采用DIP40的夾具與CPU連接,采集和過濾子系統采用的FPGA為Altera ACEX 1K100QC208,地址對照表為1 MB SRAM,數據提交子系統采用PCI設備。
一個CPU總線周期采集的數據組成一個單獨的數據包,大小為64 bit,包括時間戳、序列號、CPU數據總線、地址總線和控制總線上的數據。地址對照表提供了針對CPU 1 MB尋址空間的過濾,且可以根據串口控制FPGA邏輯,選擇對照表中不同的過濾方式。
在對目標系統的測試中,由于目標處理器8086具有6 Byte的預取隊列[6],試驗中發現采集數據中包含大量無效預取指令對應的數據。在采集邏輯中設置了根據地址進行過濾的模塊。在多個試驗中對無效預取的剔除率達到99.9%以上;減少數據采集量30%~50%,提高了數據處理效率。
6結束語
NIT方法軟硬件結合的特征,使得它在面對各種嵌入式系統測試時面臨硬件和軟件的適應性問題。本文討論了NIT在一般的嵌入式軟件測試中如何適應異質的硬件、異質的軟件以及數據過濾的問題,并給出了不失一般性的解決方法,使得NIT可以在這些方法的指導下給出預期的測試結果。這意味著NIT可以廣泛應用于一般的嵌入式系統軟件測試,必將在嵌入式系統軟件測試領域有更多的應用。
參考文獻:
[1]張炯,金惠華,尚利宏,等.一種嵌入式系統軟件的非干涉測試方法[J].北京航空航天大學學報,2004,30(7):666-669.
[2] HUMMEL R L. 80x86處理器和80x87協處理器大全[M].朱莉,張龍,譯.北京:電子工業出版社,1994.
[3] WOLF F, ERNST R. Data flow based cache prediction using local simulation[C]//Proc of IEEE International High-Level Validation and Test Workshop. Berkeley:[s.n.],2000:155-160.
[4] FERDINAND C, WILHELM R. On predicting data cache behavior for real-time systems[C]//Proc of ACM SIGPLAN Workshop on Languages,Compilers and Tools for Embedded Systems.London:Springer-Verlag,1998:16-30.
[5] LI Y T, MALIK S,WOLFE A. Performance estimation of embedded software with instruction cache modeling[J].ACM Transactions on Design Automation of Electronic Systems,1999, 4(3):257-279.
[6]IMLIG N, TSUTSUI A. Performance estimation of embedded software with pipeline and cache hazard modeling[C]//Proc of International Symposium on High Performance Computing. Landon:Springer-Verlag,1997:131-142.
[7]孫函芳,徐愛卿.MCS-51/196系列單片機原理及應用[M].修訂版.北京:北京航空航天大學出版社,2003.
[8]RAJSUMAN R. SoC設計與測試[M].于敦山,譯.北京:航空航天大學出版社,2003.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”