嵌入式系統的除錯策略
嵌入式系統除錯的工作量,可望占了嵌入式軟體專(zhuān)案工作量的一半以上。了解硬體除錯功能以及它們所能解決的問(wèn)題,是選擇正確的晶片、建立除錯系統以及提高生產(chǎn)效率的關(guān)鍵。
本文引用地址:http://dyxdggzs.com/article/148126.htm很多人都相信臭蟲(chóng)(bug)此一用詞起源于海軍少將 Grace Murray Hopper。但事實(shí)上,沒(méi)人知道這種用法的真正來(lái)源,它可能可以回溯到 Thomas A Edison,或甚至更早。美國海軍后備役軍官 Hopper 在 1945 年 9 月 9 日于哈佛大學(xué)對 Mark II Aiken 繼電計算器( Relay Calculator)進(jìn)行測試時(shí),于短路的 Panel F #70 號繼電器處發(fā)現了一雙臭蟲(chóng)。她把這只臭蟲(chóng)拿掉后(就是對電腦進(jìn)行除臭蟲(chóng)(debugging)),就解決了這臺機器不定時(shí)關(guān)機的故障(參考文獻 1)。雖然這個(gè)早期的例子指的是從系統硬體中去除臭蟲(chóng),但今天debugging這個(gè)詞是指發(fā)現一個(gè)程式的問(wèn)題,并去掉缺陷代碼(defective code)的過(guò)程。這些問(wèn)題包括任何與原始意向的差異,而去掉缺陷代碼的做法則遠優(yōu)于增加糾正代碼(correction code)。理想情況下,在任何時(shí)間都可以獲得所有的特性(如系統的R流排與暫存器值),供監控與修改。但隨著(zhù) IC 轉向 SoC,可存取性(accessibility)就變得更加困難了。
對硬體除錯,是要盡可能地可以存取到嵌入式系統內部資源,這可以透過(guò)觀(guān)察系統的特性,如 CPU 狀態(tài)和 PC 值,或修改系統的參數。在嵌入式系統設計的早期可以用簡(jiǎn)單技術(shù)進(jìn)行除錯,如記錄(logging)與監控,或者對多核心 SoC而言,可以采用最新開(kāi)發(fā)的方法,如跟蹤、緩衡記憶體除錯(cache debugging)和交叉觸發(fā)(cross-triggering)等。本文的重點(diǎn)不是在如何編寫(xiě)代碼或為代碼除錯,而是描述現在可用的嵌入式硬體硅智財權(intellectual property ,IP),以及該 IP 能解決哪方面的除錯問(wèn)題。
記錄與監控
最古老也是最常用的除錯方法就是在代碼中增加一些列印敘述(print statement),它可以顯示軟體某個(gè)部分的執行資訊,并提供暫存器和變數的實(shí)際值。這可能是一年級學(xué)生練習hello world的一種延續,該程式會(huì )在熒幕上顯示這兩個(gè)詞,用于表示程式能夠運行,以及執行到了某個(gè)點(diǎn)。列印敘述(或 printf 語(yǔ)句)只是記錄的一種變型,它是用處理器將重要資訊寫(xiě)入一個(gè)管道(pipe),作為外部跟蹤的過(guò)程。所使用的管道將視系統而訂,在 printf 情況下,管道是標準的輸出(熒幕),但它也可以是 UART、USB,甚至是通用 I/O。
當你需要用一種對程式設計工程師有意義的方式,組織各個(gè)部分資訊時(shí)(例如提供感測器資訊或狀態(tài)機的轉換),采用記錄的方法是很有價(jià)值的??梢杂糜涗浌ぞ邅?lái)分析記錄的資訊,并產(chǎn)生一個(gè)后處理資料庫。必須小心使用記錄功能才能獲得高效率。例如,記錄資訊應使用關(guān)鍵字開(kāi)頭,如警告、錯誤或除錯等,并應能識別出資訊的建立者。應將記錄功能劃分為一小組檔案,以便于維護,并提供時(shí)間戳資訊。不幸的是,記錄是一種侵入性的方法,它會(huì )修改軟體的即時(shí)狀態(tài),因而不同于最終應用。
除錯監控器是另一種常見(jiàn)的除錯工具,它與運行在 CPU 記憶體中的目標代碼一起工作(參考文獻 2 和參考文獻 3)。除錯器運行在一臺主機上,它透過(guò)一個(gè)專(zhuān)用的埠發(fā)送指令和接收響應,從而達到與監控器通信的目的??梢詫?Linux 上的 gdbserver 程式當作一個(gè)除錯監控器,不過(guò)它比早期的 ROM 監控器更復雜
(圖 1)。

當使用者希望在某條指令處設置一個(gè)中斷點(diǎn)時(shí),gdbserver 會(huì )保存該指令,而用一個(gè)系統呼叫(system call)來(lái)替代它。Gdbserver 然后用 Linux 的 ptrace 程式獲得所有進(jìn)行系統呼叫的應用程式資訊。接著(zhù),當發(fā)生系統呼叫而⒍中斷點(diǎn)時(shí),gdbserver 可以取得對被除錯應用的控制。除錯器運行在一臺主控機上,透過(guò)串列埠或乙太網(wǎng)路連接到目標物件(參考文獻 4)。監控器的方法既便宜又實(shí)用,但也有一些缺點(diǎn),例如需要在進(jìn)行任何除錯前載入代碼,并可能與應用軟體相互影響。如果代碼位于快閃記憶體中就不能使用監控器軟體,因為要插入軟體中斷點(diǎn)就需要修補應用軟體。
內電路模擬
內電路模擬器(in-circuit emulator ,ICE)是第一種以硬體為基礎的除錯技術(shù),它是所除錯處理器的一個(gè)版本。ICE 通常使用一顆現場(chǎng)可編程閘陣列(field-programmable gate array,FPGA)。FPGA 外合(bond out)其內部R流排和狀態(tài)信號,而讓使用者可以使用它們(圖 2)。

ICE 提供的除錯功能多于 ROM 監控器。使用 ICE 時(shí),必須用一個(gè)連接到 ICE 盒的連接替換待除錯電路板上的處理器。一個(gè)運行并模擬除錯器功能的主機控制這個(gè) ICE 盒。ICE 的主要局限性之一是它的價(jià)格昂貴。另外,雖然這個(gè)方法很適合簡(jiǎn)單的處理器,但現代 SoC 有更高的復雜性、整合度和頻率,因此 IC 供應商難以為現代處理器提供 ICE 版本。
一些歐洲公司在1985 年成立了聯(lián)合測試活動(dòng)組(Joint Test Action Group,JTAG),這個(gè)聯(lián)盟嘗試要解決測試半導體 IC 的各種問(wèn)題。它們?yōu)?IC 的邊界掃描測試建立了 IEEE 1149.1 標準,并在 1990 年公布了此一標準(參考文獻 5 和 圖 3)。

JTAG 標準定義了一個(gè)有限的 I/O JTAG 埠,有多達五個(gè)信號,透過(guò)串列通信完成電路的測試與分析:測試時(shí)(test clock,TCK)、測試模式選擇(test-mode select,TMS)、可選的測試重定(test reset, TRST)、測試資料登錄(test-data in ,TDI)和 測試資料輸出(test-data out,TDO)。
IEEE 將 JTAG 硬體建立在一個(gè) 16 態(tài)的有限狀態(tài)(finite-state)機上,并由 TMS 信號控制。TCK的上升沿時(shí)(rising- edge clock)X取到此一 TMS 信號。資料資訊在TDI 墊(TDI pad)移入,并在TDO 墊移出。最后用 TRST 來(lái)對設計重新設定。IC 的每個(gè)墊都可以增加掃描暫存器,并將它們內部連接起來(lái)構成一個(gè)邊界掃描鏈??梢酝高^(guò) TDI/TDO 和 JTAG 命令將此鏈移入和移出,以測試電路板上的外部連接,測試 IC 內部的邏輯連接,X取 IC 墊的值,并將 JTAG 置于旁路模式。JTAG 提供了低成本的u造測試功能,并成為最常用的測試方法。但是,由于它有易于使用、高可用性和低成本實(shí)現的特點(diǎn),設計者經(jīng)常會(huì )把 JTAG 當作除錯埠,以存取片上的除錯資源(參考文獻 6)。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論