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