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