嵌入式系統的除錯策略
JTAG 是除錯通信的傳輸層,位于運行在主機上的除錯器與嵌入式處理器除錯資源之間。命令被移入命令暫存器,以存取除錯中的硬體 IP。由于 ICE 增加了成本,很多半導體供應商將更多除錯硬體整合在晶片上,以解決除錯限制的問(wèn)題,并提供與 ICE 相似的功能。片上除錯硬體的一種常見(jiàn)實(shí)現是飛思卡爾半導體公司在 68-kbit Coldfire 嵌入式處理器和 PowerPC(現在是 Power 架構)處理器上的背景除錯模式(background debugger mode ,BDM)。其他供應商也有相似功能的專(zhuān)有名稱(chēng)。
片上除錯硬體增加了一些功能,如硬體中斷點(diǎn)、內部暫存器存取、讀/寫(xiě)到記憶體,以及觀(guān)察點(diǎn)(watchpoint)等,這些功能以前只能透過(guò) ICE 使用。在一個(gè)多處理器 SoC 中,可以將每塊晶片除錯硬體連接到主 JTAG 控制器。不同供應商的連接可能有所不同,但典型的作法是在片上除錯 JTAG 狀態(tài)機和主除錯器之間建立起一個(gè) TDI-TDO JTAG 鏈(圖 4)。

跟蹤
即時(shí)系統除錯中最大的問(wèn)題之一就是海森堡的臭蟲(chóng)(Heisenberg bug),或探針效應(probe effect):為除錯或監控而增加的任何軟體或硬體都可能改變即時(shí)系統的行為。當增加用于剖析、除錯或監控資訊的軟體時(shí),就會(huì )發(fā)生這種情況。使用除錯硬體時(shí)也會(huì )有類(lèi)似的影響。例如,片上除錯硬體可能將處理器的執行流程修改到插入中斷點(diǎn)處,或者用于剖析的硬體可能偷取(steal)從處理器到記憶體的部分頻寬,以便用來(lái)保存剖析的資訊。
除錯硬體還可能以 UART 連接來(lái)記錄資訊,而產(chǎn)品軟體也可能使用這個(gè)介面。ICE 通常提供非侵入式的跟蹤功能,開(kāi)發(fā)者可以在任何時(shí)候存取處理器的程式計數器。越來(lái)越多的 SoC 供應商正在把跟蹤硬體整合到晶片上,以提供類(lèi)似的功能(圖 5)。

透過(guò)專(zhuān)用的跟蹤硬體、專(zhuān)用的跟蹤埠、跟蹤資料與處理器資料分離的資料R流排,以及 JTAG 介面,使跟蹤硬體得以實(shí)現非侵入式的跟蹤。
使用者可以利用一個(gè)跟蹤埠來(lái)X取跟蹤資訊。在這種方式下,將一個(gè)跟蹤盒或邏輯分析儀連接到跟蹤埠,以重建資訊并讓它們與原始碼建立關(guān)聯(lián)性。另一種X取跟蹤資訊的方法是使用一個(gè)虛擬跟蹤緩n記憶體,處理器記憶體將跟蹤資訊存入緩n記憶體,而當測試結束時(shí)由主機(例如透過(guò) JTAG 埠)來(lái)檢索(retrieve)這些資訊。第叁種方法是使用一個(gè)專(zhuān)用的跟蹤緩n記憶體,專(zhuān)門(mén)用來(lái)保存跟蹤資訊,這可以讓主機在測試結束時(shí)檢索。
全球嵌入式處理器除錯介面(Global Embedded Processor Debug Interface)的IEEE-ISTO 5001TM 2003 Nexus 5001TM 論壇標準可為嵌入式處理器的軟體發(fā)展和除錯提供一個(gè)開(kāi)放而通用的介面(參考文獻 7)。Nexus Forum 在 1998 年開(kāi)始運作,在1999 年發(fā)表了第一個(gè) Nexus 標準,并在 2003 年做了更新。其目標是,在嵌入式系統除錯與工具領(lǐng)域多個(gè)供應商的經(jīng)驗基礎上,實(shí)現片上除錯功能與介面的標準化。由于該論壇的多個(gè)供應商已經(jīng)為片上除錯提供了專(zhuān)有產(chǎn)品,因此基本的片上除錯要求已經(jīng)足以輕地達到 Nexus 的符合性。好處是 Nexus 跟蹤介面的標準化,例如跟蹤功能、信號、消息協(xié)定和應用編程介面(application-programming interface,API)。同時(shí),標準化還為供應商的定制化提供充分的空間。Nexus 標準最初是針對汽車(chē)應用的,現已快速擴充到無(wú)線(xiàn)與網(wǎng)路市場(chǎng)。
多核心除錯
緩衡記憶體能提供高性能,但卻難以除錯,因為它們將 CPU 的執行情況與外部記憶體R流排隱藏起來(lái),并且難以了解到核心與 DMA 或加速硬體之間的一致性。嵌入式跟蹤硬體有助于解決這個(gè)問(wèn)題,因為被跟蹤的R流排通常是虛擬的(在緩衡記憶體以前),而非實(shí)體的。跟蹤緩n記憶體前、后的R流排也非常有助于更完整地了解緩衡記憶體的行為(圖 6)。

兩個(gè)跟蹤結果的比較,能夠提供快取失敗(cache miss)的良好指示,此時(shí)緩衡記憶體造成對實(shí)體R流排的存取。這種方法有助于減少快取失敗,并提高軟體的性能。另一種方法是增加嵌入式的緩衡記憶體除錯硬體,在除錯模式下讀取緩衡記憶體內容,或寫(xiě)入緩衡記憶體。這種方法通常采用緩衡記憶體除錯暫存器形式,并透過(guò)軟體或 JTAG 埠存取。使用者使用除錯器可以暫停程式的執行,并檢查緩衡記憶體的內容。使用者可以用這個(gè)資訊解決各種緩衡記憶體清除問(wèn)題,如無(wú)效、同步或溢出。
現代 SoC 經(jīng)常在一顆晶片內整合多個(gè)處理器,用傳統的除錯硬體難以對多個(gè)核心之間的互通性進(jìn)行除錯。有一種最新出現的除錯技術(shù)叫交叉觸發(fā)(Cross-triggering),它成為對復雜多核心 SoC 除錯的常用方法(參考文獻 8)。該方法的原理是將一個(gè)核心域的事件轉換到其他核心域或相同核心域的產(chǎn)生觸發(fā)器(generate trigger)上。典型事件是進(jìn)入除錯模式、發(fā)生中斷、出現觀(guān)察點(diǎn),以及出現中斷點(diǎn)。輸入觸發(fā)器一般是除錯要求。觸發(fā)器產(chǎn)生一個(gè)除錯要求、一個(gè)中斷,或一個(gè) SoC 墊(SOC pad)的突波雜訊(glitch)。它們都可以⒍或停止處理器上的跟蹤。觸發(fā)器的組合將所有彈性留給了最終使用者,使他們能夠設計出復雜的除錯序列??梢栽?Core B 到達某個(gè)程式位址時(shí),用交叉觸發(fā)器⒍ Core A 上的一個(gè)跟蹤,或當 Core A 進(jìn)入除錯時(shí),停止 Core B 的活動(dòng)。
隨著(zhù)對 SoC 尺寸壓力不斷地增加,低成本除錯可能成為嵌入式系統架構的圣杯。但是必須牢記一件重要的事:永遠不要在系統的除錯能力方面作出妥協(xié)。如果不能預先處理好系統的所有臭蟲(chóng),那么以后就無(wú)法獲得更大發(fā)現問(wèn)題的機會(huì )。在減少嵌入式除錯硬體上所節省的成本,其代價(jià)可能是在專(zhuān)案后期付出更高昂的軟體除錯成本。另外還應記得,除錯與安全兩種要求是相互矛盾的。很多制造商現在交付產(chǎn)品時(shí)只是簡(jiǎn)單地關(guān)掉除錯功能來(lái)防止駭客的攻擊。這種做法是不明智的。你永遠不可能預期會(huì )在現場(chǎng)遇到什么問(wèn)題。比較好的做法是采用各種安全方式防止進(jìn)入除錯部分,如用密鑰或熔絲(fuse),這樣才不會(huì )危及你的除錯功能。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論