嵌入式系統交叉調試方法一般分為兩種,一種是基于JTAG的片上調試方法,一種是基于調試代理的遠程調試方法。 JTAG是一種國際標準芯片測試協(xié)議,目前大多數CPU體系都支持JTAG;JTAG的片上調試方法最突出的代表就是JLink調試器,其定義了一個(gè)軟件調試層面的RDI接口標準,然后JLink調試器將調試環(huán)境軟件(IAR、KEIL等)發(fā)出的RDI接口轉化為JTAG命令,對芯片進(jìn)行調試。該方法多適用于嵌入式系統底層驅動(dòng)調試、裸系統調試和單應用調試。 file:///C:\Users\郭曉娟\AppData\Local\Temp\ksohtml\wpsC5E6.tmp.png 基于調試代理的遠程調試方法是在目標機上運行一個(gè)調試代理程序,與宿主機的調試器進(jìn)行通信交互,一起配合完成調試的任務(wù)。該方法主要使用軟件陷入來(lái)模擬斷點(diǎn)以接管CPU來(lái)完成調試。GDB遠程調試是主要代表,其提供兩種方式。一種是gdbserver,其能在目標機的系統上獨立運行,用于調試有操作系統的應用程序;另一種是stub,其和嵌入式系統程序一起鏈接運行,一般用于調試系統程序。Gdbserver比較容易,但需要操作系統支持;stub調試比較難,需要針對具體的芯片體系進(jìn)行移植。兩者的工作原理是相似的。GDB調試基于串口協(xié)議或者TCP/IP協(xié)議。由于調試代理、串口驅動(dòng)或者TCP/IP驅動(dòng)需要占用大量的內存空間,因此該方法一般用于內存資源比較豐富的嵌入式系統的調試。 file:///C:\Users\郭曉娟\AppData\Local\Temp\ksohtml\wpsC5F7.tmp.png 嵌入式系統一般分資源寬裕型系統和資源緊缺型系統,前者CPU處理能力強、內存資源豐富(一般在M字節級以上),如能支持Linux內核運行的嵌入式系統,而其一般都是選用基于調試代理的遠程調試方法來(lái)進(jìn)行開(kāi)發(fā);而后者的CPU處理能力一般、內存資源有限(一般在100K字節以下),多見(jiàn)于單片機控制器類(lèi)成本敏感的消費類(lèi)電子系統,系統程序難以和stub程序一起在內存中運行,因此難以選擇基于調試代理的遠程調試方法來(lái)進(jìn)行開(kāi)發(fā),而是選擇基于JTAG的片上調試方法或者直接串口打印的方式來(lái)進(jìn)行調試。但是,在資源緊缺型嵌入式系統上,針對帶操作系統(如基于UCOS內核、FreeRTOS內核)的應用程序進(jìn)行調試,基于JTAG的片上調試方法也是難以勝任的?紤]以下類(lèi)型的嵌入式系統: 帶嵌入式操作系統的電子產(chǎn)品往往都具有多個(gè)應用,例如一些帶LCD平的音頻播放器,它除了有音樂(lè )應用,也有圖片應用、FM應用、電子書(shū)應用等等,同時(shí)還可以充當一個(gè)U盤(pán)進(jìn)行文件拷貝。該系統同時(shí)可能運行一到兩個(gè)應用,例如聽(tīng)音樂(lè )看電子書(shū),而其他應用則不能同時(shí)運行。嵌入式系統學(xué)習加意義氣嗚嗚吧久零就易,這些應用程序和操作系統、UI資源文件、配置文件都是存在于外存(如nand flash或者nor flash)的固件區,對使用用戶(hù)不可見(jiàn);而音樂(lè )文件、電子書(shū)等則是存在于外存的用戶(hù)區,對使用用戶(hù)可見(jiàn)。從中可看成,各個(gè)應用程序是分時(shí)復用寶貴的內存資源。由于成本敏感,內存資源的大小是經(jīng)過(guò)精心設計的。對于單個(gè)應用程序,也會(huì )將代碼分為常駐內存類(lèi)型和可切換類(lèi)型。例如,對性能影響比較大的解碼部分代碼就需要常駐內存,而選擇文件相關(guān)的代碼則可以在需要時(shí)才加載到內存。同時(shí),使用固化一部分內核的代碼,就能做到以100K左右的內存來(lái)支撐整個(gè)系統的運行。應用程序在非運行狀態(tài)時(shí)存儲在外存中,在應用運行時(shí)才會(huì )被操作系統加載到內存中,同時(shí)對可切換類(lèi)型的代碼進(jìn)行調度切換。 如果要調試這種帶操作系統類(lèi)型的應用程序,由于內存的原因,依然不能選擇基于調試代理的遠程調試方法,而選擇基于JTAG的片上調試方法會(huì )遇到以下問(wèn)題: 由于沒(méi)有STUB在目標機運行,所以基于JTAG的片上調試方法只能通過(guò)JTAG協(xié)議接口來(lái)對內存進(jìn)行讀寫(xiě)。而上述應用程序包括常駐代碼和可切換類(lèi)型代碼,在未運行時(shí)需要存儲到外存中,在需要的時(shí)候才能由定制的操作系統加載到內存中。很明顯,JTAG接口無(wú)法將代碼寫(xiě)到外存中去。因此,需要通過(guò)其他的手段將固件(包括操作系統、所有的應用程序、UI資源文件、配置文件)燒寫(xiě)到固件區,才能使用基于JTAG的片上調試方法進(jìn)行調試。即不使用該方法的程序下載功能,而是使用讀內存、設置斷點(diǎn)等功能。 因此,調試這種帶操作系統類(lèi)型的應用程序一般的流程如下: 1) 調試過(guò)程中遇到問(wèn)題,停止調試,修改好,編譯鏈接該應用程序。 2) 打包固件,將操作系統、所有的應用程序、UI資源文件、配置文件等打包成一個(gè)固件。 3) 燒寫(xiě)固件,一般使用USB量產(chǎn)工具,或者直接的外存燒寫(xiě)工具。 4) 啟動(dòng)系統,并運行到該程序,進(jìn)入調試狀態(tài)。 這種調試方式最大的問(wèn)題就是效率很低,因為每次修改程序,都要重新打包整個(gè)固件,一般要耗費10分鐘以上,同時(shí),還要重新燒寫(xiě)整個(gè)固件,燒寫(xiě)前還要先擦除外存,這里也要耗費不少時(shí)間。另外,由于燒寫(xiě)固件和JTAG調試是兩套不同的工具,板子上電到連接工具也需要消耗不少時(shí)間。 |