CodeTEST嵌入式軟件在線(xiàn)測試與分析工具在嵌入式系統開(kāi)發(fā)中的應用
隨著(zhù)嵌入式技術(shù)的發(fā)展,嵌入式應用的不斷增長(cháng)以及嵌入式系統復雜性不斷提高,要求嵌入式軟件的規模和復雜性也不斷提高,嵌入式軟件的質(zhì)量和開(kāi)發(fā)周期對產(chǎn)品的最終質(zhì)量和上市時(shí)間起到?jīng)Q定性的影響,嵌入式軟件的開(kāi)發(fā)、分析與測試成為了研究的熱點(diǎn)。針對這一變化,本文提出了一種為嵌入式軟件的開(kāi)發(fā)、分析與測試特別設計的一種測試方法。
嵌入式軟件分析與測試的重要性
隨著(zhù)計算機硬件技術(shù)的進(jìn)步和元件質(zhì)量逐步提高,元件的集成量也大大增加,從而使嵌入式設備的硬件性能得到了極大的提高;與此同時(shí),通過(guò)采用成熟的商用操作系統,使系統運行在一個(gè)高性能的、可靠的軟件平臺上,為實(shí)現各種大型的復雜的應用打下了良好的基礎。面對系統復雜性的增加,自然需要功能強大、性能穩定的應用軟件與之相適應。所以,在嵌入系統開(kāi)發(fā)中軟件的代碼量也越來(lái)越大,電子類(lèi)產(chǎn)品的代碼量以每?jì)赡昃头环乃俣仍鲩L(cháng)。同時(shí),系統又要求應用也要精簡(jiǎn)高效、穩定可靠,使軟件的開(kāi)發(fā)在整個(gè)系統開(kāi)發(fā)中所占的時(shí)間也越來(lái)越長(cháng),軟件的質(zhì)量對產(chǎn)品的最終質(zhì)量起到了決定性的作用。但是事實(shí)上由于軟件的開(kāi)發(fā)缺乏科學(xué)的管理手段,開(kāi)發(fā)的軟件得不到很好的測試與分析,所編寫(xiě)的程序沒(méi)有得到有效的測試就交付給用戶(hù)使用。那些沒(méi)有運行過(guò)的代碼帶著(zhù)潛在的危險交付到客戶(hù)手中,經(jīng)常會(huì )給用戶(hù)帶來(lái)巨大的經(jīng)濟損失、為產(chǎn)品供應商帶來(lái)信譽(yù)上的損失,在一些特殊的領(lǐng)域甚至會(huì )危及人的生命安全。
綜上所述,隨著(zhù)嵌入式系統的發(fā)展,我們迫切需要一種工具能夠在軟件開(kāi)發(fā)的單板階段、集成階段、系統階段等各階段對嵌入式系統的軟件進(jìn)行實(shí)時(shí)在線(xiàn)的測試與分析,以保證系統的性能和可靠性。
市面上流行的測試工具大致分為純軟件的測試工具和純硬件的測試工具(如邏輯分析儀和仿真器等),下面我們從原理上分析使用傳統的測試工具對嵌入式軟件進(jìn)行分析和測試的優(yōu)缺點(diǎn)。
純軟件的測試工具
純軟件的測試工具采用的是軟件打點(diǎn)技術(shù),在被測代碼中插入一些函數,用這些函數來(lái)完成數據的生成,并上送數據到目標系統的共享內存中。同時(shí)在目標系統中運行一個(gè)預處理任務(wù),完成這些數據的預處理,將處理后的數據通過(guò)目標機的網(wǎng)口或串口上送到主機平臺。這一切都需借助于用戶(hù)的目標處理器完成。 通過(guò)以上過(guò)程,測試者得以知道程序當前的運行狀態(tài)。 從上述分析可知,純軟件的測試工具的測試原理有兩個(gè)必然存在的特點(diǎn)——插樁函數和預處理任務(wù)。
由于插入插樁函數和預處理任務(wù)的存在,使系統的代碼增大,更嚴重的是這些代碼會(huì )對系統的運行效率有很大的影響(超過(guò)50%)。函數本身要有它的實(shí)現過(guò)程,它要完成數據的生成和暫存,而且這些函數在它的實(shí)現過(guò)程中還可能被其他優(yōu)先級更高的中斷程序所中斷,預處理任務(wù)需要占用目標系統CPU處理時(shí)間、共享內存和通信通道完成數據的處理、數據的上送。由于這些弊端的存在,當采用純軟件測試工具對目標系統進(jìn)行測試時(shí),用戶(hù)目標系統是在一種不真實(shí)的環(huán)境下運行的,我們所捕獲的數據也是不夠精確。
所以采用純軟件的測試工具缺乏性能分析,它不能對用戶(hù)目標系統中的函數和任務(wù)運行的時(shí)間指標進(jìn)行精確的分析。
當做覆蓋率分析的時(shí)候,因為要大量打點(diǎn),而打點(diǎn)多于200時(shí)就會(huì )影響系統的運行,所以只能做單元覆蓋率分析且單元的程序量不能太大。
它不能對內存的動(dòng)態(tài)分配進(jìn)行動(dòng)態(tài)的觀(guān)察。
純硬件的測試工具
純硬件工具通常用于系統的硬件設計與測試工作。當它用于軟件的分析測試時(shí),卻無(wú)法滿(mǎn)足用戶(hù)的基本要求。
以邏輯分析儀為例,邏輯分析儀是通過(guò)監控系統在運行時(shí)總線(xiàn)上的指令周期,并以一定的頻率捕獲這些信號,通過(guò)對捕獲的信號進(jìn)行分析來(lái)判斷程序當前運行的狀況。由于它使用的是采樣的方式,難免會(huì )遺失一些重要的信號;同時(shí),分析的范圍也及其有限。以性能分析為例,當使用某種邏輯分析儀進(jìn)行性能分析時(shí),我們只能以抽樣的方式,同時(shí)對80個(gè)函數做性能分析,得到一個(gè)不精確的結果;而若使用CodeTEST,我們可以同時(shí)對128000個(gè)函數做性能分析,得到一個(gè)精確的結果。
當對程序做覆蓋率分析時(shí),因為硬件工具是從系統總線(xiàn)捕獲數據的,如當CACHE打開(kāi)我們會(huì )采用指令預取技術(shù),從外存中讀一段代碼到一級CACHE中,這時(shí)邏輯分析儀在總線(xiàn)上監視到這些代碼被讀取的信號,就會(huì )報告這些代碼已經(jīng)被執行了,但實(shí)際上被送到CACHE中的代碼可能根本沒(méi)有被命中。為了避免這種誤差必須把CACHE關(guān)閉掉,而CACHE關(guān)掉就不是系統真實(shí)的運行環(huán)境了,有時(shí)甚至會(huì )由于CACHE關(guān)閉而導致系統無(wú)法正常運行。
而仿真器通常采用內存標記技術(shù),它所關(guān)心的也是處理器從外存的代碼段讀取數據的情況。所以也無(wú)法在CACHE打開(kāi)的方式下工作。而它的性能分析也是以仿真器的時(shí)間系統以抽樣的方式進(jìn)行的,也無(wú)法時(shí)實(shí)對系統進(jìn)行真實(shí)的分析。所以我們所得出的結果也是不精確的。
純硬件工具根本不能對內存分配進(jìn)行分析和檢查的能力。
CodeTEST對軟件分析測試功能的實(shí)現原理
AMC公司吸取了純軟件測試工具和純硬件測試工具的優(yōu)點(diǎn),并對它們進(jìn)行改善和提升后推出了CodeTEST。
由上圖我們可以看出,程序員編寫(xiě)的源代碼首先會(huì )通過(guò)CodeTEST的編譯驅動(dòng)器調用原編譯器對進(jìn)行預編譯,然后CodeTEST的插樁器(源代碼分析程序)對預編譯好的源代碼進(jìn)行自動(dòng)的插樁,即在需要插樁的關(guān)鍵位置寫(xiě)入一條賦值語(yǔ)句(如:amc_ctrt=0x74100009),并把插入的標記送入一個(gè)數據庫文件中生成一個(gè)符號數據庫暫存起來(lái),以備為以后分析時(shí)調用。然后,CodeTEST的編譯驅動(dòng)器又會(huì )調用原編譯器對插樁后的代碼進(jìn)行編譯生成可執行目標代碼送到目標板上運行。當程序在目標系統運行到插樁點(diǎn)的位置時(shí),目標板的控制總線(xiàn)和地址總線(xiàn)上會(huì )出現相應的控制信號和地址信號。當CodeTEST的輔助硬件(信號捕獲探頭)從控制總線(xiàn)和地址總線(xiàn)上監視到符合以上條件的信號時(shí),CodeTEST會(huì )主動(dòng)地從數據總線(xiàn)上把數據捕獲回來(lái)送到CodeTEST的內存中暫存并對這些數據進(jìn)行預處理,然后將預處理后的數據通過(guò)局域網(wǎng)送到工作平臺上。通過(guò)與前面生成的符號數據庫中的數據進(jìn)行比較,我們就此得知當前程序的運行狀態(tài),借此完成對嵌入式軟件的性能分析,高級覆蓋率分析,內存分析和大容量的代碼跟蹤。
由此可知,CodeTEST是一個(gè)硬件輔助軟件的測試與分析工具,它一方面吸取軟件打點(diǎn)技術(shù),并對這種技術(shù)進(jìn)行了改善,純軟件工具插入的是一個(gè)函數,而CodeTEST插入的是一條賦值語(yǔ)句, 它在匯編級也是一條語(yǔ)句,所以它執行的時(shí)間非常短,同時(shí)避免了被其它的中斷所中斷,所以它對目標系統的影響非常?。?%-15%)。另一方面,CodeTEST從純硬件的測試工具那里吸取了從總線(xiàn)捕獲數據的技術(shù)并且對它進(jìn)行了改善,CodeTEST不再是采樣的方式,它是通過(guò)監視系統總線(xiàn),當程序運行到插入的特殊的點(diǎn)的時(shí)候才會(huì )主動(dòng)的到數據總線(xiàn)上把數據捕獲回來(lái),借此,在同樣的處理能力下,CodeTEST可以做到精確的數據觀(guān)察。
CodeTEST強大的測試分析功能。
由于CodeTEST對軟件打點(diǎn)技術(shù)和從總線(xiàn)捕獲數據進(jìn)行了改善和提升,正是這種原理上的優(yōu)勢,所以CodeTEST具有強大的性能分析、內存分析、高級覆蓋率分析和代碼跟蹤功能。
1. 強大的性能分析:CodeTEST能同時(shí)對128000個(gè)函數和1000個(gè)任務(wù)進(jìn)行性能分析,可以精確的得出每個(gè)函數或任務(wù)執行的最大時(shí)間、最小時(shí)間和平均時(shí)間,精確度達到50ns;能夠精確的顯示各函數或任務(wù)之間的調用情況,幫助你發(fā)現系統瓶頸、優(yōu)化系統和提升你的系統性能。
2. 強大的覆蓋率分析。 CodeTEST可以在系統真實(shí)的環(huán)境下,可以從單元級、集成級、系統級以及產(chǎn)品終端現場(chǎng)階段進(jìn)行嵌入式軟件的分析與測試。幫助測試工程師掌握當前的測試覆蓋率數據,指導測試用例的編寫(xiě)。
3. 強大的內存分析。CodeTEST可以動(dòng)態(tài)追蹤內存分配,報告內存出錯和相應的原始數據。他不僅可以在程序運行時(shí)報告為每條語(yǔ)句分配多少字節的內存,而且他可以鑒別20多種內存分配的錯誤。例如:CodeTEST可以捕捉“釋放空指針(freeing a null pointer)”一樣常見(jiàn)的程序錯誤,報告發(fā)生錯誤的函數和代碼行幫,助你盡早發(fā)現動(dòng)態(tài)內純泄漏,而無(wú)需到系統崩潰時(shí)。
4. 強大的代碼跟蹤分析。CodeTEST提供400K的追蹤緩沖空間,能追蹤150萬(wàn)行的源代碼。我們可以設置觸發(fā)器來(lái)追蹤自己感興趣的事件,可以顯示運行過(guò)程中程序運行的實(shí)際情況,幫助你查找程序的BUG所在。
結束語(yǔ)
隨著(zhù)后PC時(shí)代的到來(lái),嵌入式應用將會(huì )迅速增長(cháng),應用的復雜性也急劇增加,傳統的軟件分析和測試手段已不能滿(mǎn)足嵌入式軟件分析測試的基本要求,與此相比,AMC公司以其公司的幾項專(zhuān)利技術(shù),為我們提供的針對嵌入式軟件分析測試的解決方案,為廣大的嵌入式系統開(kāi)發(fā)者提供了新的技術(shù)手段,使我們可以以全新的視角審視我們原有的開(kāi)發(fā)過(guò)程,發(fā)現一切可以變的如此快捷、簡(jiǎn)單。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。