基于Proemulator的插樁構(gòu)架研究
由于目標(biāo)機(jī)與宿主機(jī)處理器體系結(jié)構(gòu)不同,嵌入式軟件無法在宿主機(jī)上直接運(yùn)行與測試,因此嵌入式軟件的開發(fā)過程常常比硬件開發(fā)過程還要漫長,導(dǎo)致整個(gè)系統(tǒng)開發(fā)周期長,軟件功能調(diào)試和性能測試不能及時(shí)完成,軟件質(zhì)量無法保證。嵌入式模擬器能良好地解決這一問題。
將模擬器應(yīng)用到嵌入式軟件的開發(fā)與測試中,其優(yōu)點(diǎn)有如下幾個(gè)方面:
(1)采用模擬器進(jìn)行嵌入式開發(fā)與測試能讓軟件和硬件開發(fā)同步進(jìn)行,縮短開發(fā)周期;
(2)能提供比真正硬件環(huán)境下更豐富的測試環(huán)境,拓寬測試范圍;能進(jìn)行長時(shí)間的測試,甚至能在真實(shí)硬件不能承受的“危險(xiǎn)”條件下測試。
(3)能提供調(diào)試,測試,變量查看,性能分析,實(shí)驗(yàn)數(shù)據(jù)存儲(chǔ)等多種額外功能,便于開發(fā)與測試人員進(jìn)行分析。
1國內(nèi)外模擬器相關(guān)研究
國內(nèi)外已有若干較成熟的嵌入式系統(tǒng)模擬器,如ARM公司的ARMmulator,同濟(jì)大學(xué)開發(fā)的Proemulatot中針對ARM芯片的指令模擬器,清華大學(xué)Sky Eye項(xiàng)目中的指令模擬器,Linux上的開源軟件GDB ARMulator。
Proemulator是一個(gè)源碼開放的通用模擬器架構(gòu),能在宿主機(jī)上以純軟件方式模擬各種硬件設(shè)備(包括CPU、輸入/輸出設(shè)備等),也可以模擬由這些設(shè)備組成的單片機(jī)或嵌入式系統(tǒng)。它基于插件機(jī)制,主程序提供整個(gè)構(gòu)架,包括運(yùn)行環(huán)境的建立、代碼的裝載和運(yùn)行時(shí)內(nèi)存、寄存器、端口的查看界面等,而插件負(fù)責(zé)模擬不同硬件設(shè)備的行為和特性,并抽象成一個(gè)統(tǒng)一的接口提供給主程序調(diào)用。通過這個(gè)機(jī)制,模擬新的設(shè)備變得更為容易。Proemutator提供多種CPU插件與若干種片內(nèi)與片外外設(shè),結(jié)構(gòu)圖如圖1所示。
2 基于嵌入式模擬器的插樁構(gòu)架
嵌入式測試平臺(tái)建立在嵌入式模擬器之上,測試過程中首先對被測程序進(jìn)行插樁,樁節(jié)點(diǎn)在程序運(yùn)行過程中能同步的,即時(shí)地向樁信息分析器輸出預(yù)設(shè)的樁信息。分析器能實(shí)時(shí)接收裝數(shù)據(jù),并進(jìn)行分析,從而得出整個(gè)被測程序運(yùn)行過程中的覆蓋率和分支情況?;谇度胧侥M器的插樁構(gòu)架如圖2所示。
3 基于Proemulator的插樁構(gòu)架實(shí)現(xiàn)
嵌入式模擬器和樁信息分析器為兩個(gè)獨(dú)立進(jìn)程,在兩者之間實(shí)現(xiàn)樁數(shù)據(jù)的傳遞,需采用進(jìn)程間通信機(jī)制。常見的進(jìn)程間通信方法有以下幾種:
(1)Socket通信是常見的進(jìn)程間通信方法,它能良好地支持網(wǎng)絡(luò)通信協(xié)議TCP/IP,在進(jìn)行通信時(shí),需要設(shè)置端口,并通過幾次握手建立TCP連接,因此適合網(wǎng)絡(luò)間的大量數(shù)據(jù)傳輸,而對于單機(jī)上的少量多次數(shù)據(jù)傳輸并不合適。
(2)共享內(nèi)存的方法較為常見,對于每個(gè)進(jìn)程來說,獲得共享內(nèi)存后,就能實(shí)現(xiàn)內(nèi)存的讀寫操作。但是如果不進(jìn)行同步,則一個(gè)進(jìn)程在進(jìn)行讀的過程中另一個(gè)進(jìn)程進(jìn)行寫操作,就會(huì)造成數(shù)據(jù)的不一致。因此在采用共享內(nèi)存的方法時(shí),需要將共享區(qū)域設(shè)置為臨界資源。常用的方法有信號量機(jī)制,兩個(gè)進(jìn)程訪問共享內(nèi)存時(shí),利用P,V操作進(jìn)行讀寫的互斥。當(dāng)P操作成功時(shí),才能訪問臨界區(qū),訪問完畢后進(jìn)行V操作,讓出使用權(quán),使得別的進(jìn)程能夠訪問。共享內(nèi)存的方法適合多個(gè)進(jìn)程間的大量數(shù)據(jù)共享,只要處理好操作的互斥性,該方法非常實(shí)用。
(3)WM COPYDATA消息是Windows底層消息,使用非常方便,只需獲得進(jìn)行通信的進(jìn)程的窗口句柄,就能通過SendMessege函數(shù)將數(shù)據(jù)封裝在消息中傳遞給該進(jìn)程,因?yàn)镾endMessege函數(shù)在接收進(jìn)程接到消息后才會(huì)返回,因此絕對不會(huì)發(fā)生消息丟失的情況,是可靠的通信。接收方只需要處理WM_COPYDATA消息,便能獲得傳遞來的數(shù)據(jù)。當(dāng)然,該方法不能用于網(wǎng)絡(luò)間的傳輸,只能用于單機(jī)環(huán)境下的Windows操作系統(tǒng)。還有管道,剪貼板,文件映射等方法,本文不做詳細(xì)介紹。下面詳細(xì)介紹基于嵌入式模擬器獲取樁數(shù)據(jù)的技術(shù)難點(diǎn)。
3.1基于Proemulator的插樁構(gòu)架
Proemulator源碼完全開放,提供了UART插件,對外設(shè)的模擬可以簡化為對端口寄存器的模擬,當(dāng)程序訪問相應(yīng)的端口時(shí),觸發(fā)其對應(yīng)外設(shè)的動(dòng)作。UART內(nèi)部包括控制口和數(shù)據(jù)口。向控制口寫入工作方式控制字后,訪問數(shù)據(jù)口數(shù)據(jù)能觸發(fā)事件。在被測程序中進(jìn)行插樁初始化,設(shè)定UART工作方式,在需要插樁的位置將樁數(shù)據(jù)寫入U(xiǎn)ART數(shù)據(jù)端口,然后在UART插件中將寫入數(shù)據(jù)端口的樁信息使用Windows進(jìn)程通信機(jī)制輸出。
Proemulator提供了多種串行數(shù)據(jù)重定位的方式來將模擬器內(nèi)部的數(shù)據(jù)信息發(fā)送至外部,包括控制臺(tái)、磁盤文件、命名管道和串口。其中命名管道是一種較好的方式,只需編寫自己的管道接收器,就能實(shí)時(shí)地接收管道發(fā)送出來的樁數(shù)據(jù),使用串口也比較方便。還能在Proemulator中加入共享內(nèi)存,或者發(fā)送WMCOPYDATA消息,基于Proemulator的插樁構(gòu)架如圖3所示。
3.2插樁構(gòu)架性能分析
本文實(shí)現(xiàn)了基于Proemulator的樁數(shù)據(jù)的發(fā)送與獲取,并進(jìn)行了分析,見表1。
4結(jié) 語
本文提出基于嵌入式模擬器的插樁構(gòu)架,將插樁后的程序經(jīng)編譯生成可執(zhí)行代碼,運(yùn)行于模擬器上,在運(yùn)行過程中模擬器能實(shí)時(shí)地將樁信息發(fā)送到樁信息分析器,進(jìn)行代碼的白盒測試。本文基于已有的嵌入式模擬器Proemulator實(shí)現(xiàn)了樁數(shù)據(jù)獲取。基于嵌入式模擬器的插樁架均能即時(shí)地進(jìn)行樁數(shù)據(jù)的發(fā)送接收與分析,能有效進(jìn)行白盒測試。
評論