使用在線(xiàn)仿真器(ICE)進(jìn)行程序優(yōu)化
關(guān)鍵字:線(xiàn)仿真器 程序優(yōu)化
本文引用地址:http://dyxdggzs.com/article/194597.htm目前,在線(xiàn)仿真器(In Circuit Emulator,ICE)在嵌入式系統開(kāi)發(fā)中被越來(lái)越多的工程師所采用。尤其是在國外嵌入式開(kāi)發(fā)公司中,ICE是一種必備的調試工具,被大規模地應用,以提高開(kāi)發(fā)調試階段的效率。但在國內,由于調試習慣和開(kāi)發(fā)成本的原因,仿真器更多是在產(chǎn)品開(kāi)發(fā)初期的底層驅動(dòng)程序調試階段中被應用。當產(chǎn)品的性能比較穩定后,工程師往往會(huì )采用串口調試方法進(jìn)行應用程序的調試。
與仿真器調試相比,串口調試的功能比較簡(jiǎn)單,人機交互功能也不夠友好。遇到復雜的程序錯誤時(shí),開(kāi)發(fā)效率可能會(huì )大大降低。一個(gè)功能強大的ICE,往往能夠提供豐富的調試手段,使調試工作事半功倍。ICE為嵌入式調試工作所帶來(lái)的方便和高效,只有使用者才能夠深刻地體會(huì )。
現在市面上的ICE種類(lèi)很多,功能也有很大的不同。很多仿真器只能提供基本的調試功能,如設置斷點(diǎn)、系統資源的觀(guān)測等。有些高級功能,如嵌入式跟蹤宏單元(Embedded Trace Macrocell,ETM)跟蹤功能,只有一些高端仿真器才會(huì )提供,當然價(jià)格也比一般仿真器要高出不少。本文主要介紹使用ICE在程序優(yōu)化方面的一些應用,其中要用到一些高級功能。
功能1:任意兩條語(yǔ)句間的運行時(shí)間的測量
當編好一段代碼,想計算這段代碼的運行時(shí)間,為代碼優(yōu)化提供依據,該如何準確測量這段時(shí)間?
沒(méi)有仿真器的話(huà),有以下兩種方法可以采用:
1. 手動(dòng)計時(shí),從執行到這段代碼時(shí)開(kāi)始看手表計時(shí),到這段代碼運行結束時(shí)停止計時(shí)。這種方式誤差很大,對于執行時(shí)間只有幾個(gè)微秒甚至更短時(shí)間的代碼段,這種方式顯然不能滿(mǎn)足要求。
2. 在代碼中加入計時(shí)函數。這種方式具有一定準確度,但是會(huì )增加代碼的復雜度,計時(shí)結果需要打印輸出。
如果使用ICE仿真器,這個(gè)工作就變得很簡(jiǎn)單了。以橫河公司的advicePRO為例,在其所使用的自帶的調試軟件microVIEW-PLUS(以下簡(jiǎn)稱(chēng)MVP)中,既不需要看手表也不需要修改代碼,只要在代碼兩端設置斷點(diǎn)就可以輕松獲得這段代碼的運行時(shí)間,而且精確度可達20ns的范圍。如圖1所示,在執行到第一個(gè)斷點(diǎn)b1時(shí),將窗口狀態(tài)欄中的時(shí)間清零,再執行代碼,程序停在第二個(gè)斷點(diǎn)b2時(shí),這段代碼的執行時(shí)間就會(huì )精確地顯示在狀態(tài)欄中。
圖1:設置斷點(diǎn),以進(jìn)行兩條語(yǔ)句間的運行時(shí)間的測量。
功能2:兩條語(yǔ)句間的運行時(shí)間的多次測量和分析
對于同一段代碼,由于運行條件不同,運行時(shí)間也不盡相同,可能會(huì )有較大的變化。如何對某段代碼的運行時(shí)間進(jìn)行統計,真正達到性能分析的目的呢?
在使用仿真器時(shí),可以重復“優(yōu)化功能1”中的測量功能,進(jìn)行手動(dòng)統計。但這樣做的缺點(diǎn)是費時(shí)費力,也不能真正反映程序實(shí)時(shí)運行時(shí)的狀態(tài)。
帶ETM跟蹤功能的ICE仿真器可以提供一種簡(jiǎn)便的測量功能,可以連續對程序進(jìn)行指定次數的時(shí)間測量,并自動(dòng)進(jìn)行時(shí)間統計。但不是所有帶ETM跟蹤功能的仿真器都有這樣的功能,下面仍以橫河公司的advicePRO為例介紹該功能的使用。具體測量步驟如下:
1.在程序段設置的起始和結束事件點(diǎn):事件(Event)是指程序執行過(guò)程中的能夠被檢測到的各種活動(dòng)。例如,某個(gè)函數或者某個(gè)地址上語(yǔ)句的執行,某個(gè)地址上數據的讀寫(xiě),甚至監測到的外部觸發(fā)信號都可以被定義成事件,作為跟蹤功能和時(shí)間測量的起始或者終止條件。圖2是通過(guò)設置窗口將某個(gè)源代碼文件的第184行的取指(Fetch)狀態(tài)作為事件e0。假設要測量LCD_test.c文件中for循環(huán)中的184行至191行的運行時(shí)間,根據圖2中的方法在184行和191行設置兩個(gè)事件e0和e1。(見(jiàn)圖3)
圖2:在設置窗口中設置源代碼文件的起始點(diǎn)。
圖3:在程序文件中設置了起始點(diǎn)和結束點(diǎn)后的MVP窗口。
2.設定外部輸出條件:將e0、e1設為外部輸出條件,如圖4所示。
圖4:設置外部輸出條件。
3.設定測量條件:在圖5所示的窗口中,將e0、e1設定為時(shí)間測量的起點(diǎn)和終點(diǎn),并進(jìn)行測量模式的設定??梢赃M(jìn)行超過(guò)指定時(shí)間和在指定時(shí)間之內的測量統計。
圖5:設定時(shí)間測量的起點(diǎn)和終點(diǎn),并進(jìn)行測量模式的設定。
4.運行程序:做好以上設定之后,可以運行程序,進(jìn)行時(shí)間測量。
5.測量結果顯示:測量結束后,測量結果會(huì )以圖表形式自動(dòng)顯示在報告窗口中,并且顯示最長(cháng)、最短、平均運行時(shí)間。(見(jiàn)圖6)通過(guò)這個(gè)圖表,用戶(hù)可以清晰地了解這段代碼的運行時(shí)間分布情況,為代碼優(yōu)化提供最直接的依據。
圖6:通過(guò)以圖表形式顯示的測量結果,可以清晰地了解代碼的運行時(shí)間分布。
功能3:測量代碼覆蓋率
代碼覆蓋率(Coverage Ratio)是指在一段代碼中被執行到的語(yǔ)句占這段代碼的比例。它是衡量代碼質(zhì)量的一個(gè)重要的指標,在代碼測試工作中經(jīng)常會(huì )被用到。在PC應用程序中測試代碼覆蓋率不是一件很難的事情,但是在嵌入式系統的實(shí)時(shí)環(huán)境中進(jìn)行測量就比較困難。
橫河公司的advicePLUS仿真器就提供了這樣的擴展功能,使嵌入式環(huán)境下測量代碼覆蓋率變成一件可以輕松完成的事情。設置方法很簡(jiǎn)單,只要在MVP的相應設置窗口中給出被測代碼段的起始和終止地址,或者給出被測函數的名稱(chēng)即可。(見(jiàn)圖7)
圖7:在MVP中進(jìn)行代碼覆蓋率分析。
程序運行結束后,代碼覆蓋率也會(huì )以圖表的形式顯示在結果窗口中。(見(jiàn)圖8)從圖表中可以很明顯看出各個(gè)函數的代碼執行情況。
如:函數Strcpy()的代碼覆蓋率為0,說(shuō)明此函數沒(méi)有被執行過(guò),對于編程者來(lái)說(shuō)就要考慮這個(gè)函數是否有存在的必要。對于覆蓋率很低的函數,需要考慮是否需要將此函數并入其他函數之中。
圖8:以圖表形式顯示的代碼覆蓋率。
不只代碼覆蓋率可以測量,某一地址范圍內的數據覆蓋率也可以進(jìn)行類(lèi)似的測量。這一功能讓使用者可以輕松掌握數據區的使用率信息。(見(jiàn)圖9)
圖9:測試指定地址范圍內的數據覆蓋率。
在嵌入式開(kāi)發(fā)中進(jìn)行程序優(yōu)化并不是一件很容易的事情,ICE仿真器提供的這些功能可以讓程序優(yōu)化變得簡(jiǎn)單,讓程序員能更有效地配置系統資源。
需要注意的是,這些功能并不是所有ICE仿真器都能提供的。選擇功能強大的仿真器能夠給開(kāi)發(fā)者帶來(lái)的不只是開(kāi)發(fā)效率的提高,也能夠幫助開(kāi)發(fā)者提高代碼質(zhì)量,使企業(yè)產(chǎn)品能夠更加穩定可靠地運行。
評論