嵌入式系統(tǒng)的除錯(cuò)策略
JTAG 是除錯(cuò)通信的傳輸層,位于運(yùn)行在主機(jī)上的除錯(cuò)器與嵌入式處理器除錯(cuò)資源之間。命令被移入命令暫存器,以存取除錯(cuò)中的硬體 IP。由于 ICE 增加了成本,很多半導(dǎo)體供應(yīng)商將更多除錯(cuò)硬體整合在晶片上,以解決除錯(cuò)限制的問(wèn)題,并提供與 ICE 相似的功能。片上除錯(cuò)硬體的一種常見(jiàn)實(shí)現(xiàn)是飛思卡爾半導(dǎo)體公司在 68-kbit Coldfire 嵌入式處理器和 PowerPC(現(xiàn)在是 Power 架構(gòu))處理器上的背景除錯(cuò)模式(background debugger mode ,BDM)。其他供應(yīng)商也有相似功能的專(zhuān)有名稱(chēng)。
片上除錯(cuò)硬體增加了一些功能,如硬體中斷點(diǎn)、內(nèi)部暫存器存取、讀/寫(xiě)到記憶體,以及觀察點(diǎn)(watchpoint)等,這些功能以前只能透過(guò) ICE 使用。在一個(gè)多處理器 SoC 中,可以將每塊晶片除錯(cuò)硬體連接到主 JTAG 控制器。不同供應(yīng)商的連接可能有所不同,但典型的作法是在片上除錯(cuò) JTAG 狀態(tài)機(jī)和主除錯(cuò)器之間建立起一個(gè) TDI-TDO JTAG 鏈(圖 4)。
跟蹤
即時(shí)系統(tǒng)除錯(cuò)中最大的問(wèn)題之一就是海森堡的臭蟲(chóng)(Heisenberg bug),或探針效應(yīng)(probe effect):為除錯(cuò)或監(jiān)控而增加的任何軟體或硬體都可能改變即時(shí)系統(tǒng)的行為。當(dāng)增加用于剖析、除錯(cuò)或監(jiān)控資訊的軟體時(shí),就會(huì)發(fā)生這種情況。使用除錯(cuò)硬體時(shí)也會(huì)有類(lèi)似的影響。例如,片上除錯(cuò)硬體可能將處理器的執(zhí)行流程修改到插入中斷點(diǎn)處,或者用于剖析的硬體可能偷取(steal)從處理器到記憶體的部分頻寬,以便用來(lái)保存剖析的資訊。
除錯(cuò)硬體還可能以 UART 連接來(lái)記錄資訊,而產(chǎn)品軟體也可能使用這個(gè)介面。ICE 通常提供非侵入式的跟蹤功能,開(kāi)發(fā)者可以在任何時(shí)候存取處理器的程式計(jì)數(shù)器。越來(lái)越多的 SoC 供應(yīng)商正在把跟蹤硬體整合到晶片上,以提供類(lèi)似的功能(圖 5)。
透過(guò)專(zhuān)用的跟蹤硬體、專(zhuān)用的跟蹤埠、跟蹤資料與處理器資料分離的資料R流排,以及 JTAG 介面,使跟蹤硬體得以實(shí)現(xiàn)非侵入式的跟蹤。
使用者可以利用一個(gè)跟蹤埠來(lái)X取跟蹤資訊。在這種方式下,將一個(gè)跟蹤盒或邏輯分析儀連接到跟蹤埠,以重建資訊并讓它們與原始碼建立關(guān)聯(lián)性。另一種X取跟蹤資訊的方法是使用一個(gè)虛擬跟蹤緩n記憶體,處理器記憶體將跟蹤資訊存入緩n記憶體,而當(dāng)測(cè)試結(jié)束時(shí)由主機(jī)(例如透過(guò) JTAG 埠)來(lái)檢索(retrieve)這些資訊。第叁種方法是使用一個(gè)專(zhuān)用的跟蹤緩n記憶體,專(zhuān)門(mén)用來(lái)保存跟蹤資訊,這可以讓主機(jī)在測(cè)試結(jié)束時(shí)檢索。
全球嵌入式處理器除錯(cuò)介面(Global Embedded Processor Debug Interface)的IEEE-ISTO 5001TM 2003 Nexus 5001TM 論壇標(biāo)準(zhǔn)可為嵌入式處理器的軟體發(fā)展和除錯(cuò)提供一個(gè)開(kāi)放而通用的介面(參考文獻(xiàn) 7)。Nexus Forum 在 1998 年開(kāi)始運(yùn)作,在1999 年發(fā)表了第一個(gè) Nexus 標(biāo)準(zhǔn),并在 2003 年做了更新。其目標(biāo)是,在嵌入式系統(tǒng)除錯(cuò)與工具領(lǐng)域多個(gè)供應(yīng)商的經(jīng)驗(yàn)基礎(chǔ)上,實(shí)現(xiàn)片上除錯(cuò)功能與介面的標(biāo)準(zhǔn)化。由于該論壇的多個(gè)供應(yīng)商已經(jīng)為片上除錯(cuò)提供了專(zhuān)有產(chǎn)品,因此基本的片上除錯(cuò)要求已經(jīng)足以輕地達(dá)到 Nexus 的符合性。好處是 Nexus 跟蹤介面的標(biāo)準(zhǔn)化,例如跟蹤功能、信號(hào)、消息協(xié)定和應(yīng)用編程介面(application-programming interface,API)。同時(shí),標(biāo)準(zhǔn)化還為供應(yīng)商的定制化提供充分的空間。Nexus 標(biāo)準(zhǔn)最初是針對(duì)汽車(chē)應(yīng)用的,現(xiàn)已快速擴(kuò)充到無(wú)線與網(wǎng)路市場(chǎng)。
多核心除錯(cuò)
緩衡記憶體能提供高性能,但卻難以除錯(cuò),因?yàn)樗鼈儗?CPU 的執(zhí)行情況與外部記憶體R流排隱藏起來(lái),并且難以了解到核心與 DMA 或加速硬體之間的一致性。嵌入式跟蹤硬體有助于解決這個(gè)問(wèn)題,因?yàn)楸桓櫟腞流排通常是虛擬的(在緩衡記憶體以前),而非實(shí)體的。跟蹤緩n記憶體前、后的R流排也非常有助于更完整地了解緩衡記憶體的行為(圖 6)。
兩個(gè)跟蹤結(jié)果的比較,能夠提供快取失敗(cache miss)的良好指示,此時(shí)緩衡記憶體造成對(duì)實(shí)體R流排的存取。這種方法有助于減少快取失敗,并提高軟體的性能。另一種方法是增加嵌入式的緩衡記憶體除錯(cuò)硬體,在除錯(cuò)模式下讀取緩衡記憶體內(nèi)容,或?qū)懭刖徍庥洃涹w。這種方法通常采用緩衡記憶體除錯(cuò)暫存器形式,并透過(guò)軟體或 JTAG 埠存取。使用者使用除錯(cuò)器可以暫停程式的執(zhí)行,并檢查緩衡記憶體的內(nèi)容。使用者可以用這個(gè)資訊解決各種緩衡記憶體清除問(wèn)題,如無(wú)效、同步或溢出。
現(xiàn)代 SoC 經(jīng)常在一顆晶片內(nèi)整合多個(gè)處理器,用傳統(tǒng)的除錯(cuò)硬體難以對(duì)多個(gè)核心之間的互通性進(jìn)行除錯(cuò)。有一種最新出現(xiàn)的除錯(cuò)技術(shù)叫交叉觸發(fā)(Cross-triggering),它成為對(duì)復(fù)雜多核心 SoC 除錯(cuò)的常用方法(參考文獻(xiàn) 8)。該方法的原理是將一個(gè)核心域的事件轉(zhuǎn)換到其他核心域或相同核心域的產(chǎn)生觸發(fā)器(generate trigger)上。典型事件是進(jìn)入除錯(cuò)模式、發(fā)生中斷、出現(xiàn)觀察點(diǎn),以及出現(xiàn)中斷點(diǎn)。輸入觸發(fā)器一般是除錯(cuò)要求。觸發(fā)器產(chǎn)生一個(gè)除錯(cuò)要求、一個(gè)中斷,或一個(gè) SoC 墊(SOC pad)的突波雜訊(glitch)。它們都可以⒍或停止處理器上的跟蹤。觸發(fā)器的組合將所有彈性留給了最終使用者,使他們能夠設(shè)計(jì)出復(fù)雜的除錯(cuò)序列??梢栽?Core B 到達(dá)某個(gè)程式位址時(shí),用交叉觸發(fā)器⒍ Core A 上的一個(gè)跟蹤,或當(dāng) Core A 進(jìn)入除錯(cuò)時(shí),停止 Core B 的活動(dòng)。
隨著對(duì) SoC 尺寸壓力不斷地增加,低成本除錯(cuò)可能成為嵌入式系統(tǒng)架構(gòu)的圣杯。但是必須牢記一件重要的事:永遠(yuǎn)不要在系統(tǒng)的除錯(cuò)能力方面作出妥協(xié)。如果不能預(yù)先處理好系統(tǒng)的所有臭蟲(chóng),那么以后就無(wú)法獲得更大發(fā)現(xiàn)問(wèn)題的機(jī)會(huì)。在減少嵌入式除錯(cuò)硬體上所節(jié)省的成本,其代價(jià)可能是在專(zhuān)案后期付出更高昂的軟體除錯(cuò)成本。另外還應(yīng)記得,除錯(cuò)與安全兩種要求是相互矛盾的。很多制造商現(xiàn)在交付產(chǎn)品時(shí)只是簡(jiǎn)單地關(guān)掉除錯(cuò)功能來(lái)防止駭客的攻擊。這種做法是不明智的。你永遠(yuǎn)不可能預(yù)期會(huì)在現(xiàn)場(chǎng)遇到什么問(wèn)題。比較好的做法是采用各種安全方式防止進(jìn)入除錯(cuò)部分,如用密鑰或熔絲(fuse),這樣才不會(huì)危及你的除錯(cuò)功能。
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論