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