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