相對于軟件調(diào)試而言,使用硬件調(diào)試器可以獲得更強大的調(diào)試功能和更優(yōu)秀的調(diào)試性能。硬件調(diào)試器的基本原理是通過仿真硬件的執(zhí)行過程,讓開發(fā)者在調(diào)試時可以隨時了解到系統(tǒng)的當前執(zhí)行情況。目前嵌入式系統(tǒng)開發(fā)中最常用到的硬件調(diào)試器是ROM Monitor、ROM Emulator、In-Circuit Emulator和In-Circuit Debugger。 采用ROM Monitor方式進行交叉調(diào)試需要在宿主機上運行調(diào)試器,在目標機上運行ROM監(jiān)視器(ROM Monitor)和被調(diào)試程序,宿主機通過調(diào)試器與目標機上的ROM監(jiān)視器建立通信連接,它們之間的通信遵循遠程調(diào)試協(xié)議。ROM監(jiān)視器可以是一段運行在目標機ROM上的可執(zhí)行程序,也可以是一個專門的硬件調(diào)試設備,它負責監(jiān)控目標機上被調(diào)試程序的運行情況,能夠與宿主機端的調(diào)試器一同完成對應用程序的調(diào)試。在使用這種調(diào)試方式時,被調(diào)試程序首先通過ROM監(jiān)視器下載到目標機,然后在ROM監(jiān)視器的監(jiān)控下完成調(diào)試,目前使用的絕大部分ROM監(jiān)視器能夠完成設置斷點、單步執(zhí)行、查看寄存器、修改內(nèi)存空間等各項調(diào)試功能。 采用ROM Emulator方式進行交叉調(diào)試時需要使用ROM仿真器,它通常被插入到目標機上的ROM插槽中,專門用于仿真目標機上的ROM芯片。在使用這種調(diào)試方式時,被調(diào)試程序首先下載到ROM仿真器中,它等效于下載到目標機的ROM芯片上,然后在ROM仿真器中完成對目標程序的調(diào)試。ROM Emulator調(diào)試方式通過使用一個ROM仿真器,雖然避免了每次修改程序后都必須重新燒寫到目標機ROM中這一費時費力的操作,但由于ROM仿真器本身比較昂貴,功能相對來講又比較單一,因此只適應于某些特定場合。 采用In-Circuit Emulator(ICE)方式進行交叉調(diào)試時需要使用在線仿真器,它是仿照目標機上的CPU而專門設計的硬件,可以完全仿真處理器芯片的行為,并且提供了非常豐富的調(diào)試功能。在使用在線仿真器進行調(diào)試的過程中,可以按順序單步執(zhí)行,也可以倒退執(zhí)行,還可以實時查看所有需要的數(shù)據(jù),從而給調(diào)試過程帶來了很多的便利。嵌入式系統(tǒng)應用的一個顯著特點是與現(xiàn)實世界中的硬件直接相關,存在各種異變和事先未知的變化,從而給微處理器的指令執(zhí)行帶來各種不確定因素,這種不確定性在目前情況下只有通過在線仿真器才有可能發(fā)現(xiàn),因此盡管在線仿真器的價格非常昂貴,但仍然得到了非常廣泛的應用。 采用In-Circuit Debugger(ICD)方式進行交叉調(diào)試時需要使用在線調(diào)試器。由于ICE的價格非常昂貴,并且每種CPU都需要一種與之對應的ICE,使得開發(fā)成本非常高,一個比較好的解決辦法是讓CPU直接在其內(nèi)部實現(xiàn)調(diào)試功能,并通過在開發(fā)板上引出的調(diào)試端口,發(fā)送調(diào)試命令和接收調(diào)試信息,完成調(diào)試過程。目前Motorola公司提供的開發(fā)板上使用的是DBM調(diào)試端口,而ARM公司提供的開發(fā)板上使用的則是JTAG調(diào)試端口,使用合適的軟件工具與這些調(diào)試端口進行連接,可以獲得與ICE類似的調(diào)試效果。 軟件調(diào)試 軟件調(diào)試通常要在不同的層次上進行,有時可能需要對嵌入式操作系統(tǒng)的內(nèi)核進行調(diào)試,而有時可能僅僅只需要調(diào)試嵌入式應用程序就可以了。在嵌入式系統(tǒng)的整個開發(fā)過程中,不同層次上的軟件調(diào)試需要使用不同的調(diào)試方法。 嵌入式操作系統(tǒng)的內(nèi)核調(diào)試相對來講比較困難,這是因為在內(nèi)核中不便于增加一個調(diào)試器程序,而只能通過遠程調(diào)試的方法,通過串口和操作系統(tǒng)內(nèi)置的"調(diào)試樁"(debug stub)進行通信,共同完成調(diào)試過程。調(diào)試樁可以看成是一個調(diào)試服務器,它通過操作系統(tǒng)獲得一些必要的調(diào)試信息,并且負責處理宿主機發(fā)送來的調(diào)試命令。具體到嵌入式Linux系統(tǒng)內(nèi)核,調(diào)試時可以先在Linux內(nèi)核中設置一個調(diào)試樁,用作調(diào)試過程中和宿主機之間的通信服務器,然后就可以在宿主機中通過調(diào)試器的串口與調(diào)試樁進行通信,并通過調(diào)試器控制目標機上Linux內(nèi)核的運行。 嵌入式應用軟件的調(diào)試可以使用本地調(diào)試和遠程調(diào)試兩種方法,相對于操作系統(tǒng)的調(diào)試而言,這兩種方式都比較簡單。如果采用的是本地調(diào)試,首先要將所需的調(diào)試器移植到目標系統(tǒng)中,然后就可以直接在目標機上運行調(diào)試器來調(diào)試應用程序了;如果采用的是遠程調(diào)試,則需要移植一個調(diào)試服務器到目標系統(tǒng)中,并通過它與宿主機上的調(diào)試器共同完成應用程序的調(diào)試。在嵌入式Linux系統(tǒng)的開發(fā)中,遠程調(diào)試時目標機上使用的調(diào)試服務器通常是gdbserver,而宿主機上使用的調(diào)試器則是gdb,兩者相互配合共同完成調(diào)試過程。
|