通常嵌入式系統(tǒng)對可靠性的要求比較高。嵌入式系統(tǒng)安全性的失效可能會導致災難性的后果,即使是非安全性系統(tǒng),由于大批量生產也會導致嚴重的經濟損失。這就要求對嵌入式系統(tǒng),包括嵌入式軟件進行嚴格的測試、確認和驗證。隨著越來越多的領域使用軟件和微處理器控制各種嵌入式設備,對日益復雜的嵌入式軟件進行快速有效的測試愈加顯得重要。
就像修車需要工具一樣,好的程序員應該能夠熟練運用各種軟件工具。不同的工具,有不同的使用范圍,有不同的功能。使用這些工具,你可以看到你的系統(tǒng)在干些什么,它又占用什么資源,它到底和哪些外界的東西打交道。讓你郁悶好幾天的問題可能通過某個工具就能輕松搞定,可惜你就是不知道。
那么為什么那么多的人總是在折騰個半死之后才想到要用測試工具呢?原因很多,主要有兩個:
一個是害怕;
另一個是惰性;
害怕是因為加入測試工具或測試模塊到代碼需要技巧同時有可能引入新的錯誤,所以他們總喜歡寄希望于通過不斷地修改重編譯代碼來消除bug,結果卻無濟于事。
懶惰是因為他們習慣了使用printf之類的簡單測試手段。
下面來介紹一些嵌入式常用的測試工具
(1)、源碼級調試器[Source-levelDebugger]
這種調試器一般提供單步或多步調試、斷點設置、內存檢測、變量查看等功能,是嵌入式調試最根本有效的調試方法。比如VxWorksTornadoII提供的gdb就屬于這一種。
(2)、簡單實用的打印顯示工具[printf]
printf或其它類似的打印顯示工具估計是最靈活最簡單的調試工具。打印代碼執(zhí)行過程中的各種變量可以讓你知道代碼執(zhí)行的情況。但是,printf對正常的代碼執(zhí)行干擾比較大(一般printf占用CPU比較長的時間),需要慎重使用,設置打印開關來控制打印。
(3)、ICE或JTAG調試器[In-circuitEmulator]
ICE是用來仿真CPU核心的設備,它可以在不干擾運算器的正常運行情況下,實時的檢測CPU的內部工作情況。像桌面調試軟件所提供的:復雜的條件斷點、先進的實時跟蹤、性能分析和端口分析這些功能,它也都能提供。ICE一般都有一個比較特殊的CPU,稱為外合(bond-out)CPU.這是一種被打開了封裝的CPU,并且通過特殊的連接,可以訪問到CPU的內部信號,而這些信號,在CPU被封裝時,是沒法“看到”的。當和工作站上強大的調試軟件聯合使用時,ICE就能提供你所能找到的最全面的調試功能。但ICE同樣有一些缺點:昂貴;不能全速工作;同樣,并不是所有的CPU都可以作為外合CPU的,從另一個角度說,這些外合CPU也不大可能及時的被新出的CPU所更換。JTAG(JointTestActionGroup)雖然它最初開發(fā)出來是為了監(jiān)測IC和電路連接,但是這種串行接口擴展了用途,包括對調試的支持。
(4)、ROM監(jiān)視器[ROMMonitor]
ROM監(jiān)控器是一小程序,駐留在嵌入系統(tǒng)ROM中,通過串行的或網絡的連接和運行在工作站上的調試軟件通信。這是一種便宜的方式,當然也是比較低端的技術。它除了要求一個通信端口和少量的內存空間外,不需要其它任何專門的硬件。
提供了如下功能:下載代碼、運行控制、斷點、單步步進、以及觀察、修改寄存器和內存。因為ROM監(jiān)控器是操作軟件的一部分,只有當你的應用程序運行時,它才會工作。如果你想檢查CPU和應用程序的狀態(tài),你就必須停下應用程序,再次進入ROM監(jiān)控器。
(5)、Data監(jiān)視器[DataMonitor]
這種監(jiān)視器在不停止CPU運行的情況下不僅可以顯示指定變量內容,還可以收集并以圖形形式顯示各個變量的變化過程。
(6)、OS監(jiān)視器[OperatingSystemMonitor]
操作系統(tǒng)監(jiān)視器可以顯示諸如任務切換、信號量收發(fā)、中斷等事件。一方面,這些監(jiān)視器能夠為你呈現事件之間的關系和時間聯系;另一方面,還可以提供對信號量優(yōu)先級反轉、死鎖和中斷延時等問題的診斷。
(7)、性能分析工具[Profiler]
可以用來測試CPU到底耗在哪里。profiler工具可以讓你知道系統(tǒng)的瓶頸在哪里、CPU的使用率以及需要優(yōu)化的地方。
(8)、內存測試工具[MemoryTeseter]
可以找到內存使用的問題所在,比如內存泄露、內存碎片、內存崩潰等問題。如果發(fā)現系統(tǒng)出現一些不可預知的或間歇性的問題,就應該使用內存測試工具測測看。
(8)、運行跟蹤器[ExecutionTracer]
可以顯示CPU執(zhí)行了哪些函數、誰在調用、參數是什么、何時調用等情況。這種工具主要用于測試代碼邏輯,可以在大量的事件中發(fā)現異常。
(9)、覆蓋工具[CoverageTester]
主要顯示CPU具體執(zhí)行了哪些代碼,并讓你知道那些代碼分支沒有被執(zhí)行到哪里。這樣有助于提高代碼質量并消除無用代碼。
(10)、GUI測試工具[GUITester]
很多嵌入式應用帶有某種形式的圖形用戶界面進行交互,有些系統(tǒng)性能測試是根據用戶輸入響應時間進行的。GUI測試工具可以作為腳本工具有開發(fā)環(huán)境中運行測試用例,其功能包括對操作的記錄和回放、抓取屏幕顯示供以后分析和比較、設置和管理測試過程(Rational公司的robot和Mercury的Loadrunner工具是杰出的代表)。
很多嵌入式設備沒有GUI,但常??梢詫η度胧皆O備進行插裝來運行GUI測試腳本,雖然這種方式可能要求對被測代碼進行更改,但是節(jié)省了功能測試和回歸測試的時間。
(11)、自制工具[Home-madetester]
在嵌入式應用中,有時候為了特定的目的,需要自行編寫一些工具來達到某種測試目的。本人曾經編寫的視頻流錄顯工具在測試視頻會議數據流向和變化上幫了大忙,幫公司找到了幾個隱藏很深的bug。