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