嵌入式系統(tǒng)的除錯(cuò)策略
嵌入式系統(tǒng)除錯(cuò)的工作量,可望占了嵌入式軟體專(zhuān)案工作量的一半以上。了解硬體除錯(cuò)功能以及它們所能解決的問(wèn)題,是選擇正確的晶片、建立除錯(cuò)系統(tǒng)以及提高生產(chǎn)效率的關(guān)鍵。
本文引用地址:http://m.butianyuan.cn/article/148126.htm很多人都相信臭蟲(chóng)(bug)此一用詞起源于海軍少將 Grace Murray Hopper。但事實(shí)上,沒(méi)人知道這種用法的真正來(lái)源,它可能可以回溯到 Thomas A Edison,或甚至更早。美國(guó)海軍后備役軍官 Hopper 在 1945 年 9 月 9 日于哈佛大學(xué)對(duì) Mark II Aiken 繼電計(jì)算器( Relay Calculator)進(jìn)行測(cè)試時(shí),于短路的 Panel F #70 號(hào)繼電器處發(fā)現(xiàn)了一雙臭蟲(chóng)。她把這只臭蟲(chóng)拿掉后(就是對(duì)電腦進(jìn)行除臭蟲(chóng)(debugging)),就解決了這臺(tái)機(jī)器不定時(shí)關(guān)機(jī)的故障(參考文獻(xiàn) 1)。雖然這個(gè)早期的例子指的是從系統(tǒng)硬體中去除臭蟲(chóng),但今天debugging這個(gè)詞是指發(fā)現(xiàn)一個(gè)程式的問(wèn)題,并去掉缺陷代碼(defective code)的過(guò)程。這些問(wèn)題包括任何與原始意向的差異,而去掉缺陷代碼的做法則遠(yuǎn)優(yōu)于增加糾正代碼(correction code)。理想情況下,在任何時(shí)間都可以獲得所有的特性(如系統(tǒng)的R流排與暫存器值),供監(jiān)控與修改。但隨著 IC 轉(zhuǎn)向 SoC,可存取性(accessibility)就變得更加困難了。
對(duì)硬體除錯(cuò),是要盡可能地可以存取到嵌入式系統(tǒng)內(nèi)部資源,這可以透過(guò)觀察系統(tǒng)的特性,如 CPU 狀態(tài)和 PC 值,或修改系統(tǒng)的參數(shù)。在嵌入式系統(tǒng)設(shè)計(jì)的早期可以用簡(jiǎn)單技術(shù)進(jìn)行除錯(cuò),如記錄(logging)與監(jiān)控,或者對(duì)多核心 SoC而言,可以采用最新開(kāi)發(fā)的方法,如跟蹤、緩衡記憶體除錯(cuò)(cache debugging)和交叉觸發(fā)(cross-triggering)等。本文的重點(diǎn)不是在如何編寫(xiě)代碼或?yàn)榇a除錯(cuò),而是描述現(xiàn)在可用的嵌入式硬體硅智財(cái)權(quán)(intellectual property ,IP),以及該 IP 能解決哪方面的除錯(cuò)問(wèn)題。
記錄與監(jiān)控
最古老也是最常用的除錯(cuò)方法就是在代碼中增加一些列印敘述(print statement),它可以顯示軟體某個(gè)部分的執(zhí)行資訊,并提供暫存器和變數(shù)的實(shí)際值。這可能是一年級(jí)學(xué)生練習(xí)hello world的一種延續(xù),該程式會(huì)在熒幕上顯示這兩個(gè)詞,用于表示程式能夠運(yùn)行,以及執(zhí)行到了某個(gè)點(diǎn)。列印敘述(或 printf 語(yǔ)句)只是記錄的一種變型,它是用處理器將重要資訊寫(xiě)入一個(gè)管道(pipe),作為外部跟蹤的過(guò)程。所使用的管道將視系統(tǒng)而訂,在 printf 情況下,管道是標(biāo)準(zhǔn)的輸出(熒幕),但它也可以是 UART、USB,甚至是通用 I/O。
當(dāng)你需要用一種對(duì)程式設(shè)計(jì)工程師有意義的方式,組織各個(gè)部分資訊時(shí)(例如提供感測(cè)器資訊或狀態(tài)機(jī)的轉(zhuǎn)換),采用記錄的方法是很有價(jià)值的??梢杂糜涗浌ぞ邅?lái)分析記錄的資訊,并產(chǎn)生一個(gè)后處理資料庫(kù)。必須小心使用記錄功能才能獲得高效率。例如,記錄資訊應(yīng)使用關(guān)鍵字開(kāi)頭,如警告、錯(cuò)誤或除錯(cuò)等,并應(yīng)能識(shí)別出資訊的建立者。應(yīng)將記錄功能劃分為一小組檔案,以便于維護(hù),并提供時(shí)間戳資訊。不幸的是,記錄是一種侵入性的方法,它會(huì)修改軟體的即時(shí)狀態(tài),因而不同于最終應(yīng)用。
除錯(cuò)監(jiān)控器是另一種常見(jiàn)的除錯(cuò)工具,它與運(yùn)行在 CPU 記憶體中的目標(biāo)代碼一起工作(參考文獻(xiàn) 2 和參考文獻(xiàn) 3)。除錯(cuò)器運(yùn)行在一臺(tái)主機(jī)上,它透過(guò)一個(gè)專(zhuān)用的埠發(fā)送指令和接收響應(yīng),從而達(dá)到與監(jiān)控器通信的目的??梢詫?Linux 上的 gdbserver 程式當(dāng)作一個(gè)除錯(cuò)監(jiān)控器,不過(guò)它比早期的 ROM 監(jiān)控器更復(fù)雜
(圖 1)。
當(dāng)使用者希望在某條指令處設(shè)置一個(gè)中斷點(diǎn)時(shí),gdbserver 會(huì)保存該指令,而用一個(gè)系統(tǒng)呼叫(system call)來(lái)替代它。Gdbserver 然后用 Linux 的 ptrace 程式獲得所有進(jìn)行系統(tǒng)呼叫的應(yīng)用程式資訊。接著,當(dāng)發(fā)生系統(tǒng)呼叫而⒍中斷點(diǎn)時(shí),gdbserver 可以取得對(duì)被除錯(cuò)應(yīng)用的控制。除錯(cuò)器運(yùn)行在一臺(tái)主控機(jī)上,透過(guò)串列埠或乙太網(wǎng)路連接到目標(biāo)物件(參考文獻(xiàn) 4)。監(jiān)控器的方法既便宜又實(shí)用,但也有一些缺點(diǎn),例如需要在進(jìn)行任何除錯(cuò)前載入代碼,并可能與應(yīng)用軟體相互影響。如果代碼位于快閃記憶體中就不能使用監(jiān)控器軟體,因?yàn)橐迦胲涹w中斷點(diǎn)就需要修補(bǔ)應(yīng)用軟體。
內(nèi)電路模擬
內(nèi)電路模擬器(in-circuit emulator ,ICE)是第一種以硬體為基礎(chǔ)的除錯(cuò)技術(shù),它是所除錯(cuò)處理器的一個(gè)版本。ICE 通常使用一顆現(xiàn)場(chǎng)可編程閘陣列(field-programmable gate array,F(xiàn)PGA)。FPGA 外合(bond out)其內(nèi)部R流排和狀態(tài)信號(hào),而讓使用者可以使用它們(圖 2)。
ICE 提供的除錯(cuò)功能多于 ROM 監(jiān)控器。使用 ICE 時(shí),必須用一個(gè)連接到 ICE 盒的連接替換待除錯(cuò)電路板上的處理器。一個(gè)運(yùn)行并模擬除錯(cuò)器功能的主機(jī)控制這個(gè) ICE 盒。ICE 的主要局限性之一是它的價(jià)格昂貴。另外,雖然這個(gè)方法很適合簡(jiǎn)單的處理器,但現(xiàn)代 SoC 有更高的復(fù)雜性、整合度和頻率,因此 IC 供應(yīng)商難以為現(xiàn)代處理器提供 ICE 版本。
一些歐洲公司在1985 年成立了聯(lián)合測(cè)試活動(dòng)組(Joint Test Action Group,JTAG),這個(gè)聯(lián)盟嘗試要解決測(cè)試半導(dǎo)體 IC 的各種問(wèn)題。它們?yōu)?IC 的邊界掃描測(cè)試建立了 IEEE 1149.1 標(biāo)準(zhǔn),并在 1990 年公布了此一標(biāo)準(zhǔn)(參考文獻(xiàn) 5 和 圖 3)。
JTAG 標(biāo)準(zhǔn)定義了一個(gè)有限的 I/O JTAG 埠,有多達(dá)五個(gè)信號(hào),透過(guò)串列通信完成電路的測(cè)試與分析:測(cè)試時(shí)(test clock,TCK)、測(cè)試模式選擇(test-mode select,TMS)、可選的測(cè)試重定(test reset, TRST)、測(cè)試資料登錄(test-data in ,TDI)和 測(cè)試資料輸出(test-data out,TDO)。
IEEE 將 JTAG 硬體建立在一個(gè) 16 態(tài)的有限狀態(tài)(finite-state)機(jī)上,并由 TMS 信號(hào)控制。TCK的上升沿時(shí)(rising- edge clock)X取到此一 TMS 信號(hào)。資料資訊在TDI 墊(TDI pad)移入,并在TDO 墊移出。最后用 TRST 來(lái)對(duì)設(shè)計(jì)重新設(shè)定。IC 的每個(gè)墊都可以增加掃描暫存器,并將它們內(nèi)部連接起來(lái)構(gòu)成一個(gè)邊界掃描鏈??梢酝高^(guò) TDI/TDO 和 JTAG 命令將此鏈移入和移出,以測(cè)試電路板上的外部連接,測(cè)試 IC 內(nèi)部的邏輯連接,X取 IC 墊的值,并將 JTAG 置于旁路模式。JTAG 提供了低成本的u造測(cè)試功能,并成為最常用的測(cè)試方法。但是,由于它有易于使用、高可用性和低成本實(shí)現(xiàn)的特點(diǎn),設(shè)計(jì)者經(jīng)常會(huì)把 JTAG 當(dāng)作除錯(cuò)埠,以存取片上的除錯(cuò)資源(參考文獻(xiàn) 6)。
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論