高級(jí)調(diào)試動(dòng)態(tài)系統(tǒng)mC/Probe
前言
本文引用地址:http://m.butianyuan.cn/article/81531.htm隨著低成本的在線調(diào)試能力的增強(qiáng),通過指令單步調(diào)試變得更容易,成本也比較低。這種方式可以查看和修改變量值,顯示寄存器的內(nèi)容,查看內(nèi)存塊,但通常只有在目標(biāo)系統(tǒng)停止運(yùn)行時(shí)使用。然而,很多實(shí)時(shí)系統(tǒng)是不能停止的。因此,在不設(shè)置斷點(diǎn)的情況下,如何查看系統(tǒng)正在做什么?如何在不妨礙和影響系統(tǒng)動(dòng)態(tài)性能的前提下,實(shí)時(shí)查看和監(jiān)測(cè)系統(tǒng)的行為?
當(dāng)我們?cè)噲D測(cè)試實(shí)時(shí)系統(tǒng)的動(dòng)態(tài)行為時(shí),傳統(tǒng)的調(diào)試技術(shù)功能很快就變得有限了。自從第一片微處理器誕生以來,用于監(jiān)控和調(diào)試動(dòng)態(tài)系統(tǒng)的工具基本上沒有發(fā)生什么變化。為了解決這個(gè)問題,嵌入式工程師采用了諸如LED、測(cè)試端口、示波器、邏輯分析儀、仿真器、字符型LCD、圖形顯示等工具。事實(shí)上,上述的任何一種方式都可以從嵌入式系統(tǒng)中獲取一些正在運(yùn)行的信息,每種方式都可以提供嵌入式硬件操作的觀察點(diǎn),用以揭露系統(tǒng)內(nèi)部發(fā)生的神秘事情。但是,其中許多技術(shù)需要額外的硬件和軟件來記錄和查看目標(biāo)系統(tǒng)發(fā)生的信息。
下文首先簡(jiǎn)要評(píng)估在監(jiān)控目標(biāo)系統(tǒng)實(shí)時(shí)行為時(shí),嵌入式工程師常用的一些初級(jí)技術(shù),然后推薦一種便宜的、使用簡(jiǎn)單,但性能強(qiáng)大的新調(diào)試技術(shù)。
常用的初級(jí)調(diào)試工具
LED
很多嵌入式系統(tǒng)都會(huì)包含一個(gè),在某些情況下會(huì)有多個(gè)發(fā)光二極管(LED)。LED被用來顯示各種各樣的動(dòng)態(tài)信息。它們可以指示嵌入式系統(tǒng)是否在運(yùn)行,某個(gè)條件是否發(fā)生,系統(tǒng)是否發(fā)生了錯(cuò)誤,已經(jīng)運(yùn)行到了某個(gè)位置等等。
LED是一種簡(jiǎn)單、有效且比較便宜的器件,但同時(shí)它們也有局限性。首先,它們?cè)黾恿顺杀荆菍⑺鼈冞M(jìn)行組合,形成條形或其它更復(fù)雜的顯示方式,否則它們不能傳遞變量值。其次,LED顯示的數(shù)據(jù)量是有限的,并且顯示方式也不夠友好。必須承認(rèn),LED具有比較好的指示方式,顯示系統(tǒng)正在運(yùn)行或一個(gè)特定的事件已經(jīng)發(fā)生,但在其它方面并不擅長(zhǎng)。
使用printf()函數(shù)
嵌入式工程師可以在代碼中使用printf()函數(shù)(假設(shè)采用C語言編程)設(shè)置斷點(diǎn)來獲得對(duì)象的動(dòng)態(tài)行為。在調(diào)試過程中,printf()函數(shù)可以到處移動(dòng)來顯示目標(biāo)的應(yīng)用,以便在系統(tǒng)開發(fā)過程中獲取信息。不難想象,過度使用printf()函數(shù)將導(dǎo)致應(yīng)用程序臃腫。通常printf()函數(shù)會(huì)放在主機(jī)的終端輸出窗口,由于這個(gè)原因,當(dāng)連續(xù)獲取數(shù)據(jù)時(shí),工程師需要將各種數(shù)據(jù)流實(shí)時(shí)地重新分類。這些數(shù)據(jù)流一般是由整數(shù)或浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換得到的文本值,故迫使工程師讀取每個(gè)值時(shí),調(diào)整它的量級(jí),理解它的重要性。大多數(shù)情況下,采用數(shù)據(jù)值曲線圖或許比文本值更恰當(dāng)。
由于printf()函數(shù)占用代碼量,在一些系統(tǒng)中,特別是在8位微控制器中,不能簡(jiǎn)單地應(yīng)用這種方法。即使在代碼不受限制的情況下,printf()函數(shù)在格式化輸入時(shí)也會(huì)引起延時(shí)。當(dāng)通過串口傳遞信息時(shí),產(chǎn)生的延時(shí)會(huì)更長(zhǎng),更不用說增加了系統(tǒng)的負(fù)載。況且新的PC機(jī)不再包含串行接口RS-232C,因此這個(gè)技術(shù)幾乎要銷聲匿跡了。
LCD字符顯示
有一些嵌入式處理器使用額外的I/O口與字符型LCD。這種方式相對(duì)費(fèi)用比較昂貴,且需要寫代碼來顯示希望得到的狀態(tài)和變量值。這種設(shè)備可以顯示的變量數(shù)是有限的,需要一次或幾次完成所有的顯示。此外,還需要實(shí)現(xiàn)一個(gè)用戶接口來選擇查看變量值。很明顯,這種方式占用了嵌入式工程師開發(fā)實(shí)際產(chǎn)品精力。取決于產(chǎn)品本身的成本或其它原因,顯示可能不會(huì)作為最終產(chǎn)品的一部分。
圖形顯示
那些擁有圖形顯示設(shè)備的嵌入式系統(tǒng)可以傳遞很多系統(tǒng)的實(shí)時(shí)信息,數(shù)值、圖、列表、柱狀圖等都很容易顯示出來。然而,這種顯示手段會(huì)導(dǎo)致系統(tǒng)成本的增加,如電子顯示設(shè)備和圖形用戶接口(GUI)軟件,以及創(chuàng)建接口傳遞信息所占用時(shí)間。盡管在開發(fā)的初級(jí)階段,顯示設(shè)備可以被借用來幫助開發(fā),事實(shí)上,很多嵌入式系統(tǒng)擁有的顯示設(shè)備,通常是將其作為用戶接口,而不是用于開發(fā)。
高級(jí)調(diào)試工具
我們需要的是監(jiān)測(cè)目標(biāo)系統(tǒng),而不必負(fù)擔(dān)額外的費(fèi)用或增加設(shè)備的負(fù)載。有一種設(shè)備允許我們以圖形方式顯示從目標(biāo)系統(tǒng)獲取的任何信息,它就是普遍存在的PC機(jī)。
以上結(jié)論使得Micrium公司開發(fā)了mC/Probe高級(jí)調(diào)試系統(tǒng)。這個(gè)概念很簡(jiǎn)單,我們可以把大部分的負(fù)擔(dān)轉(zhuǎn)移到運(yùn)行Microsoft Windows的PC機(jī)上,而將盡量少的代碼放到目標(biāo)系統(tǒng)中。
mC/Probe是一個(gè)基于Microsoft Windows的應(yīng)用程序,可以實(shí)時(shí)顯示產(chǎn)品中任何變量值、內(nèi)存分配和I/O口值。mC/Probe通過邏輯圖、數(shù)據(jù)指示器、溫度計(jì)、柱狀圖、速度圖、餅圖、LED以及其他方式來顯示變量值。而不需要在嵌入式產(chǎn)品中寫入任何代碼,不使用printf()函數(shù),也不必在產(chǎn)品中增加用戶接口。Micrium公司以源代碼的方式提供了一個(gè)小且簡(jiǎn)單的stub(占位程序),在創(chuàng)建目標(biāo)應(yīng)用時(shí)需要PC機(jī)端的stub,使用通用的UART、USB、TCP/IP、JTAG接口或其它目標(biāo)系統(tǒng)接口。在開發(fā)產(chǎn)品的過程中,一旦stub與產(chǎn)品一起編譯連接,即可開始查看嵌入式系統(tǒng)的實(shí)時(shí)行為。
mC/Probe可以用于任何編譯器和處理器(8、16、32位CPU或DSP)。事實(shí)上,任何工具鏈(編譯器、匯編器、連接器)都適用。如果系統(tǒng)中有RTOS,亦可以與RTOS結(jié)合使用。
mC/Probe工作流程如下:Windows應(yīng)用程序分析由工具鏈的連接器產(chǎn)生的文件,確定目標(biāo)板上每個(gè)全局變量的名稱、類型和地址,并在符號(hào)瀏覽器中列出所有的變量。然后用戶將圖形組件(虛擬對(duì)象)拖拽到數(shù)據(jù)屏幕中的一個(gè)畫面,并為每個(gè)對(duì)象指定符號(hào)瀏覽器中的一個(gè)變量。在目標(biāo)系統(tǒng)接口允許的情況下,放在開放數(shù)據(jù)屏幕中的圖形組件關(guān)聯(lián)符號(hào)值將很快獲得更新。如果工程師需要修改目標(biāo)代碼,則連接器將改變變量的地址,mC/Probe重新加載新的連接文件,調(diào)整數(shù)據(jù)屏幕中所有圖形組件的信息。
事實(shí)上,目標(biāo)系統(tǒng)只需要很少的代碼,就足夠響應(yīng)如“發(fā)送0x40102030地址開始的12個(gè)字節(jié)”這樣的要求。Windows應(yīng)用程序在收到應(yīng)答后,根據(jù)新的值更新數(shù)據(jù)屏幕中相關(guān)的組件。因?yàn)榇a位于RTOS的空閑任務(wù)中,在與RTOS一起使用時(shí),目標(biāo)駐留代碼通常不會(huì)插入。換句話說,因?yàn)樵诳臻e任務(wù)中CPU不執(zhí)行任何操作,它不占用應(yīng)用程序的CPU周期。如果工程師希望僅僅更新某一段代碼中的變量值,他可以將目標(biāo)駐留代碼放在那個(gè)位置上。結(jié)果是,與Windows應(yīng)用程序通信所占用的時(shí)鐘周期的百分比,可以通過簡(jiǎn)單地修改目標(biāo)系統(tǒng)中調(diào)用駐留代碼的頻率(和調(diào)用的位置)來滿足用戶的需求。
采用mC/Probe可以顯示溫度、壓強(qiáng)、濕度、過程變量、狀態(tài)變量、定時(shí)器、計(jì)算結(jié)果、邏輯I/O、最大/最小值、執(zhí)行時(shí)間、堆棧使用、I/O寄存器、I/O口、列表、數(shù)組、繪圖變量隨時(shí)間的變化等等。也可以顯示布爾型、整數(shù)、浮點(diǎn)數(shù)據(jù)和字符串。
mC/Probe允許創(chuàng)建多個(gè)數(shù)據(jù)屏幕,通過邏輯分組來顯示變量,查看目標(biāo)的行為。如果設(shè)計(jì)一個(gè)發(fā)動(dòng)機(jī)控制器,可以通過創(chuàng)建一個(gè)數(shù)據(jù)屏幕來顯示控制器的實(shí)時(shí)數(shù)據(jù),例如:制動(dòng)位置、電流和每分鐘最大轉(zhuǎn)數(shù)、氣缸溫度、發(fā)動(dòng)機(jī)運(yùn)行時(shí)間、發(fā)動(dòng)機(jī)油壓和溫度、空氣壓強(qiáng)和溫度、停止時(shí)間、燃料數(shù)量等等。
mC/Probe提供了完整的圖形對(duì)象,包括模擬LED、標(biāo)簽、標(biāo)準(zhǔn)尺、圖、列表,增強(qiáng)了控制的靈活性。
標(biāo)簽用于顯示變量值或者內(nèi)容,如ASCII 字符串,但作為數(shù)字量則代表了一個(gè)整數(shù)或浮點(diǎn)數(shù),或者用于簡(jiǎn)單地顯示一個(gè)可配置長(zhǎng)度的字符串。標(biāo)準(zhǔn)尺使用模擬尺或者儀表方式來顯示數(shù)據(jù)。圖形通過線圖和柱狀圖來顯示數(shù)據(jù)。列表是最靈活的,并且有一個(gè)電子數(shù)據(jù)表接口,允許包含其它數(shù)據(jù)單元的數(shù)據(jù),或者目標(biāo)系統(tǒng)中變量值的計(jì)算公式。極大增強(qiáng)了列表的擴(kuò)展性和靈活性。以枚舉類型為例,可以從整數(shù)值轉(zhuǎn)換為邏輯字符串的形式表示,因?yàn)楸葦?shù)值更有意義。
應(yīng)用級(jí)的調(diào)試
對(duì)于應(yīng)用級(jí)別的調(diào)試來講,高級(jí)調(diào)試工具,例如mC/Probe比初級(jí)的工具更合適。由實(shí)現(xiàn)相關(guān)功能的幾個(gè)任務(wù)組成的嵌入式系統(tǒng),不適合采用斷點(diǎn)和LED的方式來調(diào)試。通過使用mC/Probe窗口接口,可以在一個(gè)觀察點(diǎn)獲取更廣泛的信息,更適合應(yīng)用級(jí)的調(diào)試工作。為某一個(gè)特定的模塊,如RTOS、TCP/IP、USB協(xié)議等開發(fā)的數(shù)據(jù)屏幕,可以用于這些模塊的任何嵌入式系統(tǒng)。與模塊相對(duì)應(yīng)的數(shù)據(jù)屏幕可以用于新的工作屏幕,與圖形相關(guān)聯(lián)的變量將被重新連接,這意味著變量地址將從新目標(biāo)上運(yùn)行的代碼連接輸出文件中自動(dòng)獲取。
認(rèn)為“高級(jí)調(diào)試工具在對(duì)有問題的底層代碼函數(shù)調(diào)試時(shí)缺乏洞察力”的評(píng)論也是正確的。對(duì)這種任務(wù)調(diào)試來說,斷點(diǎn)和LED是不可替代的。應(yīng)該指出,mC/Probe可以作為在所有產(chǎn)品的初期開發(fā)階段使用的工具,對(duì)于高級(jí)特性的系統(tǒng)缺陷,如任務(wù)的性能、堆棧使用、或緩存使用等,在早期就提供一些警告信息。
評(píng)論