<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 調(diào)試你的嵌入式軟件

          調(diào)試你的嵌入式軟件

          ——
          作者: 時間:2006-12-19 來源: 收藏
          軟件調(diào)試工具的目的就是盡可能的揭露CPU內(nèi)部工作情況和軟件的執(zhí)行狀態(tài)。軟件開發(fā)者用不同的專業(yè)化工具來調(diào)試固件(具有軟件功能的硬件),而用來描述它們的術(shù)語卻容易引起混淆。下面就是這些工具的概述。
          內(nèi)部電路仿真器(in-circuit emulator, ICE)

          ICE是用來仿真CPU核心的設(shè)備,它可以在不干擾運算器的正常運行情況下,實時的檢測CPU的內(nèi)部工作情況。像桌面調(diào)試軟件所提供的:復(fù)雜的條件斷點、先進(jìn)的實時跟蹤、性能分析和端口分析這些功能,它也都能提供。

          ICE一般都有一個比較特殊的CPU,稱為外合(bond-out)CPU。這是一種被打開了封裝的CPU,并且通過特殊的連接,可以訪問到CPU的內(nèi)部信號,而這些信號,在CPU被封裝時,是沒法“看到”的。

          當(dāng)和工作站上強(qiáng)大的調(diào)試軟件聯(lián)合使用時,ICE就能提供你所能找到的最全面的調(diào)試功能。但I(xiàn)CE同樣有一些缺點:昂貴;不能全速工作;同樣,并不是所有的CPU都可以作為外合CPU的,從另一個角度說,這些外合CPU也不大可能及時的被新出的CPU所更換。

          ROM監(jiān)控器(ROM monitor)

          ROM監(jiān)控器是一小程序,駐留在嵌入系統(tǒng)ROM中,通過串行的或網(wǎng)絡(luò)的連接和運行在工作站上的調(diào)試軟件通信。這是一種便宜的方式,當(dāng)然也是最低端的技術(shù)。

          它除了要求一個通信端口和少量的內(nèi)存空間外,不需要其它任何專門的硬件。并提供了如下功能:下載代碼、運行控制、斷點、單步步進(jìn)、以及觀察、修改寄存器和內(nèi)存。

          因為ROM監(jiān)控器是操作軟件的一部分,只有當(dāng)你的應(yīng)用程序運行時,它才會工作。如果你想檢查CPU和應(yīng)用程序的狀態(tài),你就必須停下應(yīng)用程序,再次進(jìn)入ROM監(jiān)控器。

          在線調(diào)試(on-chip debugging, OCD)或在線仿真(on-chip emulator)

          特別的硅基材料以及定制和CPU管腳的串行連接,在這種特殊的CPU芯片上使用OCD,才能發(fā)揮出OCD的特點。用低端適配器就可以把OCD端口和主工作站以及前端調(diào)試軟件連接起來。從OCD的基本形式看來,它的特點和單一的ROM監(jiān)測器是一致的,但是不像后者需要專門的程序以及額外的通信端口。

          有兩種普遍的OCD接口:

          摩托羅拉的背景調(diào)試監(jiān)測(Motorola’s Background Debug Monitor,BDM)

          Joint Test Action Group(JTAG):雖然它最初開發(fā)出來是為了監(jiān)測IC和電路連接,但是這種串行接口擴(kuò)展了用途,包括對調(diào)試的支持。

          這些接口在底層方面的操作差異較大,但是BDM和JTAG仿真器給終端用戶提供同樣的便利。

          近來,更多的加強(qiáng)型OCD接口提供額外的管腳來收集實時跟蹤信息。顯而易見,用狹窄的串行接口來捕獲快速的實時跟蹤信息是比較吃力的。但是,高端調(diào)試軟件可以讓加強(qiáng)型OCD接口模擬ICE的功能,而且,這樣做的成本較低。

          另有一些高端軟件的調(diào)試包把通過邏輯分析器收集的實時跟蹤信息和標(biāo)準(zhǔn)OCD端口的運行控制特征包含到一起了

          除了調(diào)試系統(tǒng)的高級工具,許多的項目能夠完美地使用諸如發(fā)光二極管(LED)、串口和示波器這樣的簡單設(shè)備調(diào)試。

          串行口


          許多嵌入式的主板都具有一個RS232串行口,它允許你將調(diào)試信息傳送到PC工作站上標(biāo)準(zhǔn)的COM口上。如果你的嵌入式對象還有剩余的內(nèi)存空間,你就可以使用標(biāo)準(zhǔn)的puts()、printf()或者相等同的函數(shù)來發(fā)送有用的調(diào)試信息。

          如果你正在使用Windows工作站,你就只需要運行一個終端仿真器程序來顯示來自的嵌入式對象的調(diào)試信息。一個比較好的程序是HyperTerminal,它是Windows操作系統(tǒng)自帶的。我覺得一個更好的(免費)程序是Tera Term(Pro)。

          發(fā)光二極管

          一個簡單的狀態(tài)LED在某些系統(tǒng)上可能被當(dāng)作奢侈品,但是它能夠極為有效地幫助調(diào)試。(至少我會認(rèn)為沒有什么別的東西能夠提供類似的功能。)

          除了看到LED在代碼某個點處開始發(fā)光或者閃爍所帶來的提示之外,你還可以使用長或者短閃爍來表示大量的錯誤和狀態(tài)報告——這只需要一點點想象力。這不是藝術(shù)的表現(xiàn),但是很多嵌入式系統(tǒng)的開發(fā)人員只有一兩個或者稍多的LED來調(diào)試小型嵌入式系統(tǒng)。

          示波器

          示波器可能是基本調(diào)試輔助工具中最強(qiáng)大的一個,而且它不僅僅只能夠用于調(diào)試硬件。

          一個基本的模擬示波器就足夠了,但是有數(shù)字示波器會更好。好的示波器會有兩個或者更多的頻道,再加上一個額外的外部觸發(fā)脈沖輸入頻道,這個頻道帶有綜合觸發(fā)系統(tǒng)和延遲掃描。示波器能夠讓你看到你的程序?qū)ν獠慷丝诤屯庠O(shè)的訪問,并能夠監(jiān)測軟件的活動。

          下面是在你調(diào)試嵌入式軟件的時候應(yīng)用示波器的幾種方法:

          • 對你需要觀察的針對活動的事件使用一個空余的外部輸出插腳,或者用這個插腳來顯示活動的情況。
          • 在函數(shù)開始的時候設(shè)置插腳,再在結(jié)束的時候拿掉它,以測量函數(shù)的執(zhí)行時間。你可以以類似的方式檢測中斷的潛伏時間。
          • 如果CPU卡在了循環(huán)里,那么就要檢查地址總線的狀態(tài),以大概地查看CPU卡在哪個地方了(當(dāng)然,這要假設(shè)你正在使用外部內(nèi)存)。
          • 檢測中斷路,以查找阻塞的中斷,或者檢測外設(shè)未正常初始化而導(dǎo)致的中斷缺失。
          • 大多數(shù)調(diào)試工具都無法在系統(tǒng)初始啟動的時候提供任何幫助,但是你可以在系統(tǒng)周期性復(fù)位的時候使用示波器,用以觀察地址和數(shù)據(jù)總線的活動,以追蹤C(jī)PU在復(fù)位之后的活動進(jìn)展。
          不要節(jié)約

          最后,不要在高質(zhì)量的調(diào)試工具上節(jié)約。盡管這些基本的工具都是極其有用的,但是更加昂貴和綜合的工具如果能夠節(jié)省你數(shù)周昂貴的調(diào)試和工程努力,那么它們就總是物有所值的。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          關(guān)鍵詞: 嵌入式

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();