基于Proemulator的插樁構架研究
由于目標機與宿主機處理器體系結構不同,嵌入式軟件無(wú)法在宿主機上直接運行與測試,因此嵌入式軟件的開(kāi)發(fā)過(guò)程常常比硬件開(kāi)發(fā)過(guò)程還要漫長(cháng),導致整個(gè)系統開(kāi)發(fā)周期長(cháng),軟件功能調試和性能測試不能及時(shí)完成,軟件質(zhì)量無(wú)法保證。嵌入式模擬器能良好地解決這一問(wèn)題。
將模擬器應用到嵌入式軟件的開(kāi)發(fā)與測試中,其優(yōu)點(diǎn)有如下幾個(gè)方面:
(1)采用模擬器進(jìn)行嵌入式開(kāi)發(fā)與測試能讓軟件和硬件開(kāi)發(fā)同步進(jìn)行,縮短開(kāi)發(fā)周期;
(2)能提供比真正硬件環(huán)境下更豐富的測試環(huán)境,拓寬測試范圍;能進(jìn)行長(cháng)時(shí)間的測試,甚至能在真實(shí)硬件不能承受的“危險”條件下測試。
(3)能提供調試,測試,變量查看,性能分析,實(shí)驗數據存儲等多種額外功能,便于開(kāi)發(fā)與測試人員進(jìn)行分析。
1國內外模擬器相關(guān)研究
國內外已有若干較成熟的嵌入式系統模擬器,如ARM公司的ARMmulator,同濟大學(xué)開(kāi)發(fā)的Proemulatot中針對ARM芯片的指令模擬器,清華大學(xué)Sky Eye項目中的指令模擬器,Linux上的開(kāi)源軟件GDB ARMulator。
Proemulator是一個(gè)源碼開(kāi)放的通用模擬器架構,能在宿主機上以純軟件方式模擬各種硬件設備(包括CPU、輸入/輸出設備等),也可以模擬由這些設備組成的單片機或嵌入式系統。它基于插件機制,主程序提供整個(gè)構架,包括運行環(huán)境的建立、代碼的裝載和運行時(shí)內存、寄存器、端口的查看界面等,而插件負責模擬不同硬件設備的行為和特性,并抽象成一個(gè)統一的接口提供給主程序調用。通過(guò)這個(gè)機制,模擬新的設備變得更為容易。Proemutator提供多種CPU插件與若干種片內與片外外設,結構圖如圖1所示。

2 基于嵌入式模擬器的插樁構架
嵌入式測試平臺建立在嵌入式模擬器之上,測試過(guò)程中首先對被測程序進(jìn)行插樁,樁節點(diǎn)在程序運行過(guò)程中能同步的,即時(shí)地向樁信息分析器輸出預設的樁信息。分析器能實(shí)時(shí)接收裝數據,并進(jìn)行分析,從而得出整個(gè)被測程序運行過(guò)程中的覆蓋率和分支情況?;谇度胧侥M器的插樁構架如圖2所示。

3 基于Proemulator的插樁構架實(shí)現
嵌入式模擬器和樁信息分析器為兩個(gè)獨立進(jìn)程,在兩者之間實(shí)現樁數據的傳遞,需采用進(jìn)程間通信機制。常見(jiàn)的進(jìn)程間通信方法有以下幾種:
(1)Socket通信是常見(jiàn)的進(jìn)程間通信方法,它能良好地支持網(wǎng)絡(luò )通信協(xié)議TCP/IP,在進(jìn)行通信時(shí),需要設置端口,并通過(guò)幾次握手建立TCP連接,因此適合網(wǎng)絡(luò )間的大量數據傳輸,而對于單機上的少量多次數據傳輸并不合適。
(2)共享內存的方法較為常見(jiàn),對于每個(gè)進(jìn)程來(lái)說(shuō),獲得共享內存后,就能實(shí)現內存的讀寫(xiě)操作。但是如果不進(jìn)行同步,則一個(gè)進(jìn)程在進(jìn)行讀的過(guò)程中另一個(gè)進(jìn)程進(jìn)行寫(xiě)操作,就會(huì )造成數據的不一致。因此在采用共享內存的方法時(shí),需要將共享區域設置為臨界資源。常用的方法有信號量機制,兩個(gè)進(jìn)程訪(fǎng)問(wèn)共享內存時(shí),利用P,V操作進(jìn)行讀寫(xiě)的互斥。當P操作成功時(shí),才能訪(fǎng)問(wèn)臨界區,訪(fǎng)問(wèn)完畢后進(jìn)行V操作,讓出使用權,使得別的進(jìn)程能夠訪(fǎng)問(wèn)。共享內存的方法適合多個(gè)進(jìn)程間的大量數據共享,只要處理好操作的互斥性,該方法非常實(shí)用。
(3)WM COPYDATA消息是Windows底層消息,使用非常方便,只需獲得進(jìn)行通信的進(jìn)程的窗口句柄,就能通過(guò)SendMessege函數將數據封裝在消息中傳遞給該進(jìn)程,因為SendMessege函數在接收進(jìn)程接到消息后才會(huì )返回,因此絕對不會(huì )發(fā)生消息丟失的情況,是可靠的通信。接收方只需要處理WM_COPYDATA消息,便能獲得傳遞來(lái)的數據。當然,該方法不能用于網(wǎng)絡(luò )間的傳輸,只能用于單機環(huán)境下的Windows操作系統。還有管道,剪貼板,文件映射等方法,本文不做詳細介紹。下面詳細介紹基于嵌入式模擬器獲取樁數據的技術(shù)難點(diǎn)。
3.1基于Proemulator的插樁構架
Proemulator源碼完全開(kāi)放,提供了UART插件,對外設的模擬可以簡(jiǎn)化為對端口寄存器的模擬,當程序訪(fǎng)問(wèn)相應的端口時(shí),觸發(fā)其對應外設的動(dòng)作。UART內部包括控制口和數據口。向控制口寫(xiě)入工作方式控制字后,訪(fǎng)問(wèn)數據口數據能觸發(fā)事件。在被測程序中進(jìn)行插樁初始化,設定UART工作方式,在需要插樁的位置將樁數據寫(xiě)入UART數據端口,然后在UART插件中將寫(xiě)入數據端口的樁信息使用Windows進(jìn)程通信機制輸出。
Proemulator提供了多種串行數據重定位的方式來(lái)將模擬器內部的數據信息發(fā)送至外部,包括控制臺、磁盤(pán)文件、命名管道和串口。其中命名管道是一種較好的方式,只需編寫(xiě)自己的管道接收器,就能實(shí)時(shí)地接收管道發(fā)送出來(lái)的樁數據,使用串口也比較方便。還能在Proemulator中加入共享內存,或者發(fā)送WMCOPYDATA消息,基于Proemulator的插樁構架如圖3所示。

3.2插樁構架性能分析
本文實(shí)現了基于Proemulator的樁數據的發(fā)送與獲取,并進(jìn)行了分析,見(jiàn)表1。

4結 語(yǔ)
本文提出基于嵌入式模擬器的插樁構架,將插樁后的程序經(jīng)編譯生成可執行代碼,運行于模擬器上,在運行過(guò)程中模擬器能實(shí)時(shí)地將樁信息發(fā)送到樁信息分析器,進(jìn)行代碼的白盒測試。本文基于已有的嵌入式模擬器Proemulator實(shí)現了樁數據獲取?;谇度胧侥M器的插樁架均能即時(shí)地進(jìn)行樁數據的發(fā)送接收與分析,能有效進(jìn)行白盒測試。
評論