嵌入式系統基礎之:嵌入式軟件開(kāi)發(fā)流程
這里一般將進(jìn)行交叉編譯的主機稱(chēng)為宿主機,也就是普通的通用PC,而將程序實(shí)際的運行環(huán)境稱(chēng)為目標機,也就是嵌入式系統環(huán)境。由于一般通用計算機擁有非常豐富的系統資源、使用方便的集成開(kāi)發(fā)環(huán)境和調試工具等,而嵌入式系統的系統資源非常緊缺,無(wú)法在其上運行相關(guān)的編譯工具,因此,嵌入式系統的開(kāi)發(fā)需要借助宿主機(通用計算機)來(lái)編譯出目標機的可執行代碼。
由于編譯的過(guò)程包括編譯、鏈接等幾個(gè)階段,因此,嵌入式的交叉編譯也包括交叉編譯、交叉鏈接等過(guò)程,通常ARM的交叉編譯器為arm-elf-gcc、arm-linux-gcc等,交叉鏈接器為arm-elf-ld、arm-linux-ld等,交叉編譯過(guò)程如圖4.18所示。
2.交叉調試
嵌入式軟件經(jīng)過(guò)編譯和鏈接后即進(jìn)入調試階段,調試是軟件開(kāi)發(fā)過(guò)程中必不可少的一個(gè)環(huán)節,嵌入式軟件開(kāi)發(fā)過(guò)程中的交叉調試與通用軟件開(kāi)發(fā)過(guò)程中的調試方式有很大的差別。在常見(jiàn)軟件開(kāi)發(fā)中,調試器與被調試的程序往往運行在同一臺計算機上,調試器是一個(gè)單獨運行著(zhù)的進(jìn)程,它通過(guò)操作系統提供的調試接口來(lái)控制被調試的進(jìn)程。而在嵌入式軟件開(kāi)發(fā)中,調試時(shí)采用的是在宿主機和目標機之間進(jìn)行的交叉調試,調試器仍然運行在宿主機的通用操作系統之上,但被調試的進(jìn)程卻是運行在基于特定硬件平臺的嵌入式操作系統中,調試器和被調試進(jìn)程通過(guò)串口或者網(wǎng)絡(luò )進(jìn)行通信,調試器可以控制、訪(fǎng)問(wèn)被調試進(jìn)程,讀取被調試進(jìn)程的當前狀態(tài),并能夠改變被調試進(jìn)程的運行狀態(tài)。
嵌入式系統的交叉調試有多種方法,主要可分為軟件方式和硬件方式兩種。它們一般都具有如下一些典型特點(diǎn)。
n 調試器和被調試進(jìn)程運行在不同的機器上,調試器運行在PC機(宿主機),而被調試的進(jìn)程則運行在各種專(zhuān)業(yè)調試板上(目標板)。
n 調試器通過(guò)某種通信方式(串口、并口、網(wǎng)絡(luò )、JTAG等)控制被調試進(jìn)程。
n 在目標機上一般會(huì )具備某種形式的調試代理,它負責與調試器共同配合完成對目標機上運行著(zhù)的進(jìn)程的調試。這種調試代理可能是某些支持調試功能的硬件設備,也可能是某些專(zhuān)門(mén)的調試軟件(如gdbserver)。
n 目標機可能是某種形式的系統仿真器,通過(guò)在宿主機上運行目標機的仿真軟件,整個(gè)調試過(guò)程可以在一臺計算機上運行。此時(shí)物理上雖然只有一臺計算機,但邏輯上仍然存在著(zhù)宿主機和目標機的區別。
下面分別就軟件調試樁方式和硬件片上調試兩種方式進(jìn)行詳細介紹。
(1)軟件方式。
軟件調試主要是通過(guò)插入調試樁的方式來(lái)進(jìn)行的。調試樁方式進(jìn)行調試是通過(guò)目標操作系統和調試器內分別加入某些功能模塊,二者互通信息來(lái)進(jìn)行調試。該方式的典型調試器有g(shù)db調試器。
gdb的交叉調試器分為GdbServer和GdbClient,其中的GdbServer就作為調試樁在安裝在目標板上,GdbClient就是駐于本地的gdb調試器。它們的調試原理圖如圖4.19所示。
gdb調試的工作流程。
n 首先,建立調試器(本地gdb)與目標操作系統的通信連接,可通過(guò)串口、網(wǎng)卡、并口等多種方式。
n 然后,在目標機上開(kāi)啟GdbServer進(jìn)程,并監聽(tīng)對應端口。
n 在宿主機上運行調試器gdb,這時(shí),gdb就會(huì )自動(dòng)尋找遠端的通信進(jìn)程,也就是GdbServer的所在進(jìn)程。
n 在宿主機上的gdb通過(guò)GdbServer請求對目標機上的程序發(fā)出控制命令。這時(shí),GdbServer將請求轉化為程序的地址空間或目標平臺的某些寄存器的訪(fǎng)問(wèn),這對于沒(méi)有虛擬存儲器的簡(jiǎn)單的嵌入式操作系統而言,是十分容易的。
n GdbServer把目標操作系統的所有異常處理轉向通信模塊,并告知宿主機上gdb當前有異常。
n 宿主機上的gdb向用戶(hù)顯示被調試程序產(chǎn)生了哪一類(lèi)異常。
這樣就完成了調試的整個(gè)過(guò)程。這個(gè)方案的實(shí)質(zhì)是用軟件接管目標機的全部異常處理及部分中斷處理,并在其中插入調試端口通信模塊,與主機的調試器進(jìn)行交互。但是它只能在目標機系統初始化完畢、調試通信端口初始化完成后才能起作用,因此,一般只能用于調試運行于目標操作系統之上的應用程序,而不宜用來(lái)調試目標操作系統的內核代碼及啟動(dòng)代碼。而且,它必須改變目標操作系統,因此,也就多了一個(gè)不用于正式發(fā)布的調試版。
評論