低成本的ARM調試方案——有關於Wiggler、H-Jtag、OpenOCD、GDB、Insight

標籤: 調試 JTAG WIGGLER JLINK ICE

低成本的ARM調試方案——有關於Wiggler、H-Jtag、OpenOCD、GDB、Insight

先給大家介紹個大概情況,現在國內都有什麼著名的ARM開發工具和解決方案,價格從高低排:

  • BDI1000/2000/3000

目前我知道的最牛X的調試工具,可以調試ARM、MIPS、PPC、ColdFire、XScale等多種處理器。無需更換硬件,只需要買不同的軟件授權就可以調試不同的CPU。JTAG下載速度可以上兆,以太網接口。因爲太貴了(BDI2000好像要人民幣50000吧),我沒怎麼研究它到底配合什麼軟件來調試,不過GDB它是肯定支持的,它一直是我心目中的神話啊。

  • J-Link原版

J-Link是IAR公司爲ARM開發的調試工具,支持RDI協議的調試工具,如Keil、ADS、IAR等;支持GDB調試;什麼SWD之類的用得很少,有沒有都一樣;但J-Link不支持ARM10以上的內核。JTAG下載的速度可以達到400~500K,正版價格大約5000人民幣(全功能)吧,這麼貴基本也不考慮了。

  • Multi-ICE原版

ARM公司的原創調試工具,支持全系列ARM芯片,現在多少錢我也不知道了,反正在2000~3000人民幣這個級別。我這裏指的是國內做得比較好的那些,比如Realview之類的。僅僅支持ADS、SDT之類的裸奔代碼調試,JTAG下載速度130K左右。雖然這幾年Multi-ICE是國內ARM調試絕對的霸主,但現在ARM公司已經停止對ADS的維護了,Multi-ICE會開始走向沒落。

  • Multi-ICE盜版

國內有很多Multi-ICE的盜版,功能和Multi-ICE原版一樣,並口的、USB的都有,價錢幾百塊人民幣,淘寶上到處都有。但是和J-Link盜版相比,不推薦購買。

  • J-Link盜版

最近這段時間,J-Link盜版漸漸開始多起來了,淘寶上也很多,功能和原版沒有區別。價格大約在幾百人民幣左右,從性價比來看,推薦購買。我之後還會寫一篇用J-Link調試ARM的文章,當你入門之後,絕對無法忍受今天介紹的這個低成本方案的JTAG下載速度,那時就買個J-Link來爽爽。

  • U-Link盜版

U-Link是Keil公司做的用於ARM和某些增強型8051調試的工具,由於Keil公司做U-Link的時候沒有加密,導致現在盜版滿天飛,只需要100多塊錢就可以買到一個。現在Keil已經被ARM收購,U-Link也是ARM一家的了。U-Link正版在盜版的排擠下,根本沒有什麼買的必要;U-Link僅僅支持Keil,而且JTAG下載速度僅有20~30K。

  • Wiggler電纜

Wiggler是世界上最氾濫的一種調試工具,它非常簡單,只需要一片74HC244,一個9013,幾個電阻就可以。本來Wiggler是Macraigor(http://www.macraigor.com/)製作的,可以支持Macraigor的OCDRemote這個GDB Server,可以支持ARM、PPC、ColdFire、MIPS、XScale等多種CPU。後來因爲它結構太簡單,被人破解後搞得全世界都是,於是Macraigor怒了,現在用OCDRemote必須是Macraigor原廠的Wiggler了……儘管如此,後人又在Wiggler的硬件基礎上開發了很多的調試工具,例如H-Jtag;另外也有其他的調試工具增加了對Wiggler的支持,例如OpenOCD。Wiggler電纜的成本特別低,當然它的性能也和成本一樣低;用H-Jtag下載速度大約20~30KB/s,用Linux虛擬機下的OpenOCD下載速度大約2KB/s。不過對於囊中羞澀的學生們來說,是一個非常不錯的入門工具。本文就針對Wiggler進行介紹。

估計看這篇文章的人會有一些是從單片機起步,轉到ARM上來的,我先梳理下各種CPU調試的知識。

  • 從MCS-51/96、PIC之類的單片機轉入ARM

這條路是學校教學比較傳統的路子。條件好點的學校開單片機課的時候都有實驗,用實驗箱和仿真器做實驗,那種仿真器就是一種最早的CPU/MCU仿真器,仿真器通過仿真頭連接電路板,完全模擬CPU/MCU的功能;仿真器通過串口或者其他什麼口連接計算機,計算機上有集編譯器、調試器爲一體的集成開發環境,可以監控和運行程序。這種仿真器的成本一般比較高,而且仿真不同的CPU/MCU需要不同的硬件,結構也很複雜,使用軟件模擬的斷點。解釋下軟件模擬的斷點——就是用特殊的函數調用指令替換斷點所在位置的指令,這些特殊的函數具有和仿真器的監控軟件交互的功能。應該有很多的同學平時沒有條件用上這麼奢侈的設備,多半是用的是ISP,採用“點燈大法”——就是藉助LED、串口之類的調試程序,每修改一次程序就重新下載一次,調試非常的艱苦。我剛開始玩單片機的時候AT的89S52還沒有出來,我花一個月的生活費買了個燒寫器,每次改程序都把芯片撬下來放到燒寫器上,燒完再裝回去繼續點燈……
走這條路,要明白的事情有:ARM的寄存器可不是51那寥寥可數的幾個,是沒有必要也不可能背下來的;ARM芯片一般都內置了JTAG調試邏輯,不需要CPU仿真器,需要的是一個JTAG協議轉接器(雖然現在大家還叫這種東西爲仿真器);集成開發環境在使用者看來和單片機的沒有任何區別,這點請放心。

  • 從AVR、C8051F之類有JTAG的單片機轉入ARM

時代是不斷進步的,AVR、C8051F具有JTAG口的單片機。JTAG(Joint Test Action Group)組織定了一個最初是用於測試生產出來的芯片是不是良品的測試接口和標準,在芯片的各個管腳上放上鎖存器,然後串起來構成移位寄存器,可以監控芯片管腳的輸入和輸出;後來大家發現這東西用來搞芯片的在線調試不錯,於是就出現了現在JTAG調試風行的局面。再說的明白些,也就是利用JTAG可以控制CPU內核,每個CPU都可以成爲自己的“仿真器”,而不需要專用的設備。“人人都是食神。”——周星星語錄。從理論上來說,世界上只需要一種仿真器,哦,確切的說應該叫做JTAG協議轉換器,就可以調試所有的兼容JTAG標準的芯片;BDI2000這種超級貴的“仿真器”以及Wiggler這種什麼都通吃的便宜貨的存在是很合理的事情。
走這條路,應該已經明白了JTAG是什麼,所以不用多說了。

  • GDB是什麼

正像Windows和Linux的對比,集成開發環境比GDB在嵌入式開發領域,擁有更多的用戶,但這並不意味的GDB不好。GDB(GNU Project Debugger)是開源軟件組織GNU開發和維護的一種調試工具,它能調試目前所有的能跑Linux的CPU,當然ARM也是其中一員。對於初學者來說,不建議使用GDB,還是先從集成開發環境入手,例如ADS、SDT、Keil、IAR之類的。其實從編譯器的層面來講,集成開發環境和GDB所用的編譯器GCC沒有什麼區別,但集成開發環境裏面提供了源文件組織與瀏覽、工程文件管理、調試等多種功能,用起來很友好。GCC+GDB光學習寫相當於工程文件的Makefile就要花很多的時間。但是,一旦你的學習進了一步到了Linux的Loader和內核,集成開發環境就無能爲力了。前面已經提到了,本文覆蓋了從剛開始的裸奔代碼到涉足操作系統的GCC+GDB調試環境的建立方法。本文關於GDB的部分應該是國內挺難找到的HOWTO,轉載請註明來自EE小站。關於GDB,可以參考下我之前的這篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!268.entry

在開始之前請先確認你的電腦有並口,如果是筆記本就算了,買個PCMIA轉並口的卡的錢夠買個盜版U-Link了;要是肯下血本買盜版J-Link,那就看我以後寫的文章。

  • 首先說代碼裸奔怎麼做

你需要的東西有:

● 帶並口的電腦一臺
● 並口延長線一根
● Wiggler一個
● 隨便什麼ARM7或ARM9的開發板一個

如果沒有並口延長線,可以去電腦城買一根。如果沒有Wiggler,你可以選擇DIY,下面這張圖是Wiggler的一種版本:

如果不想DIY,上淘寶淘一個去。ARM開發板也可以在淘寶上淘淘,看你的經濟能力了。

你需要的軟件有:

● ADS (ARM Developer Suite) V1.2
● H-Jtag

ADS在一般學校的FTP上都有,H-JTAG請訪問http://www.hjtag.com。在此再拜一下Twentyone大俠,可以爲大家寫出這麼好的免費軟件。

H-Jtag和ADS的使用方法在H-Jtag的網站上的手冊裏寫得很清楚了,我就不再囉嗦了,給出地址http://www.hjtag.com/download/USER%20MANUAL%20(CN).pdf

  • 說說GDB怎麼做

如果你對Linux下ARM的開發沒有概念,先看我還是菜菜鳥的時候寫的這篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!121.entry

GDB使用GDB工具鏈,調試解決方案的結構是

GDB前端<--->GDB<--->GDB服務程序<--->JTAG協議轉換器(仿真器)<--->目標CPU(ARM CPU)
                                      |
                                  控制接口

GDB有一個很大的缺點——文本界面,使用非常不方便。但幸運的是,有很多熱心的開發者爲GDB寫了一些圖形“外殼”——GDB前端,大大方便了GDB的使用。因爲我們做的是交叉開發(即在x86結構的電腦上開發ARM等非x86結構的CPU程序),所以GDB無法直接調試編譯出來的程序,這就需要一個服務程序。這個服務程序可以是一個可以控制目標CPU的程序(可能運行於計算機上;也可能運行於某些仿真器上,例如如BDI2000就是這樣),也可以是一個運行於目標CPU上的服務程序,由它來裝載被調試的程序。但是後者一般需要目標CPU上已經運行起了Linux內核;調試Bootloader和Linux內核本身,需要前一種服務程序。GDB和GDB服務程序之間的連接方式可以是以太網或者串口,而且GDB服務程序一般還有別的控制接口,例如Telnet接口,可以實現對目標CPU的控制,如初始化和程序文件下載等。比較複雜哦,一會兒說到軟件的時候就會用上這些知識。

你需要的東西和裸奔代碼一樣

你需要的軟件有:

● 一個可以運行的Linux

虛擬機裏的、真實的都可以,推薦使用Open Suse 10.3,下載地址http://software.opensuse.org/

● 本機GCC編譯器

Open Suse自己帶的就可以

● 交叉GCC編譯器

可以去下載一個,隨便給個地址把http://www.linux4sam.org/twiki/bin/view/Linux4SAM/SoftwareTools#Cross_Toolchain值得注意的是U-Boot 1.2.0之後需要使用支持軟浮點的交叉編譯器,如果沒有,可以用Crosstool製作一個,可以看我之前的這篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!274.entry

● OpenOCD源碼

OpenOCD的主頁是http://openocd.berlios.de/web/。OpenOCD是一個運行於PC上的程序,它可以控制包括Wiggler之內的很多JTAG硬件;我們可以將它理解爲一種GDB服務程序。OpenOCD的源碼只能通過SVN下載,地址是svn://svn.berlios.de/openocd/trunk
,在寫這篇文章的時候OpenOCD已經是R818版本了,這個版本對Wiggler的支持有問題,我編譯的是r520版本的,如果沒有SVN Client,這個版本只能通過曲線的方式獲得:先到下載http://www.yagarto.de/download/oldver/openocd-r520-20080322.exe這個由YAGARTO提供的OpenOCD For Cygwin的版本,安裝它,在安裝目錄例如C:\Program Files\openocd-r520\source裏找到源碼壓縮包。

● Insight源碼

Insight是一個GDB的圖形前端,我感覺它比DDD更適合嵌入式系統程序的調試。

Insight的下載地址http://sourceware.org/insight/downloads.php

● 隨便什麼程序的源碼,例如U-Boot

U-Boot就不用介紹了,如果不知道可以Google下。

U-Boot的下載地址是http://www.denx.de/wiki/UBoot/SourceCode

下面開始編譯,先是OpenOCD,假設源代碼已經解壓縮到了/home/lxz/build-openocd,先設定權限

# cd /home/lxz/build-openocd

# chmod 755  ./bootstrap

# ./bootstrap

等一會兒,輸入

# ./configure --prefix=/usr/local/arm/openocd --enable-parport

這裏--prefix指定的是安裝的路徑,--enable-parport使能並口,然後

# make

# sudo make install

輸入root密碼,等一會兒,安裝就完成了

然後是insight,假設源碼已經解壓縮到了/home/lxz/insight-6.8,然後

# cd /home/lxz/insight-6.8

# ./configure --prefix=/usr/local/arm/arm-linux-insight --target=arm-linux

這裏--prefix指定的是安裝的路徑,--target指的是爲ARM編譯GDB,等一會兒,輸入

# make

等一會兒,輸入

# sudo make install

輸入root密碼,等一會兒,安裝就完成了

然後編譯一個U-Boot用於測試,假設源碼已經解壓縮到了/home/lxz/at91rm9200/u-boot-1.2.0,假設已經修改完了Makefile中的交叉編譯器的選項,假設我爲AT91RM9200DK開發板編譯,然後

# cd /home/lxz/at91rm9200/u-boot-1.2.0

# make at91rm9200dk_config

# make

於是得到了/home/lxz/at91rm9200/u-boot-1.2.0/u-boot這個映像

爲了能讓OpenOCD正常使用,我們還需要2個腳本,第一個是OpenOCD的配置腳本,這個腳本的作用是配置GDB服務程序、JTAG仿真器。寫這個腳本可以看OpenOCD的文檔http://openfacts.berlios.de/index-en.phtml?title=OpenOCD_configuration。我給出我的AT91RM9200DK開發板的配置文件at91rm9200.cfg,每一條配置信息的作用我就不解釋了,請仔細閱讀OpenOCD的文檔。

# Daemon configuration
telnet_port 23
gdb_port 2331
daemon_startup reset

# JTAG interface configuration
interface parport
jtag_speed 0
reset_config trst_and_srst
jtag_device 4 0x1 0xf 0xe

# parport options
parport_port 0x378
parport_cable wiggler

# Target configuration
target arm920t little run_and_init 0 arm920t
run_and_halt_time 0 1000
target_script 0 reset at91rm9200_init.script
working_area 0 0x00200000 0x1000 backup

我還是提一下,上面這段配置信息中的target_script 0 reset at91rm9200_init.script這句就是指定第二個腳本的,而且讓OpenOCD在當前目錄下搜索這個腳本。也就是說,如果at91rm9200.cfg在/home/lxz/at91rm9200下,那麼你在/home/lxz/at91rm9200下啓動OpenOCD服務程序,OpenOCD就會在/home/lxz/at91rm9200下搜索at91rm9200_init.script這個腳本;如果在與at91rm9200.cfg所在路徑不同的路徑下啓動OpenOCD服務程序,OpenOCD就無法找到at91rm9200_init.script,此時,target_script 0 reset at91rm9200_init.script這句就應該寫成target_script 0 reset /home/lxz/at91rm9200/at91rm9200_init.script。

第二個腳本的作用是初始化ARM CPU,因爲U-Boot往往是在SDRAM裏運行的,其連接位置也都在SDRAM裏。用GDB或GDB前端下載程序的時候,必須保證SDRAM是可用的。AT91RM9200這個CPU上電的時候如果從片內Boot ROM啓動(不推薦從外部啓動,因爲如果沒有啓動程序,AT91RM9200將運行於慢時鐘,這樣JTAG仿真器可能工作不正常),需要進一步配置PLL,PIO,SDRMC之類的外設之後,SDRAM纔可以使用。第二個腳本就是一系列寄存器讀寫和延時命令的集合,如何編寫請看OpenOCD的手冊http://openfacts.berlios.de/index-en.phtml?title=OpenOCD_commands,給出我的at91rm9200_init.script。

mww 0xfffffc28 0x00000000
mww 0xfffffc2c 0x00000000
mww 0xfffffc20 0x0000ff01
sleep 20
mww 0xfffffc28 0x20263e04
sleep 20
mww 0xfffffc2c 0x10483e0e
sleep 20
mww 0xfffffc30 0x00000000
sleep 20
mww 0xfffffc30 0x00000202
sleep 20
mww 0xfffff870 0xffff0000
mww 0xfffff804 0xffff0000
mww 0xffffff60 0x00000002
mww 0xffffff64 0x00000000
mww 0xffffff98 0x2188c159
mww 0xffffff90 0x00000002
mww 0x20000000 0x00000000
mww 0xffffff90 0x00000004
mww 0x20000000 0x00000000
mww 0x20000000 0x00000000
mww 0x20000000 0x00000000
mww 0x20000000 0x00000000
mww 0x20000000 0x00000000
mww 0x20000000 0x00000000
mww 0x20000000 0x00000000
mww 0x20000000 0x00000000
mww 0xffffff90 0x00000003
mww 0x20000200 0x00000000
mww 0xffffff94 0x000002e0
mww 0x20000000 0x00000000
mww 0xffffff90 0x00000000
mww 0x20000000 0x00000000
arm7_9 sw_bkpts enable

這個腳本寫起來很複雜,建議從一些樣例代碼上把寄存器的數值扒過來。另外,有些CPU,例如S3C2410,它上電的時候,SDRAM是默認可以用的,就不需要這個腳本了。還有一個值得注意的是,由於我們用的是Wiggler這種簡單的JTAG協議轉換器,初始化腳本里必須加上arm7_9 sw_bkpts enable這句。現在終於可以開始調試了,假設把OpenOCD安裝在了/usr/local/arm/openocd,把Insight安裝在了/usr/local/arm/arm-linux-insight,兩個初始化腳本都放在了/home/lxz/at91rm9200;你已經正確連接了Wiggler,開發板已經上電。接下來還是用命令來說明

# cd /home/lxz/at91rm9200

# sudo /usr/local/arm/openocd/bin/openocd -f at91rm9200.cfg

root's password:
Open On-Chip Debugger 1.0 (2008-07-21-20:15) svn:
$URL: http://svn.berlios.de/svnroot/repos/openocd/trunk/src/openocd.c $
Info:    jtag.c:1329 jtag_examine_chain(): JTAG device found: 0x05b0203f (Manufacturer: 0x01f, Part: 0x5b02, Version: 0x0)
Info:    target.c:240 target_init_handler(): executing reset script 'at91rm9200_init.script'
Info:    options.c:50 configuration_output_handler(): software breakpoints enabled

這就說明OpenOCD已經開始工作了。然後啓動Insight

# cd /home/lxz/at91rm9200/u-boot-1.2.0/

# /usr/local/arm/arm-linux-insight/bin/arm-linux-insight

出現下面的窗口

然後選擇菜單File&gt;Target Settings...,在出現的窗口中進行如下設置,然後點OK。

點擊看大圖

選擇菜單File&gt;Open,打開/home/lxz/at91rm9200/u-boot-1.2.0/u-boot這個映像;然後選擇菜單Run&gt;Download,將U-Boot程序下載到目標CPU。然後在程序運行的必經之路設定一個斷點,如下圖所示。

選擇菜單Control&gt;Continure,程序就會從頭開始執行,並停在斷點處了。Insight還有很多不錯的功能,並且很容易上手,大家研究下就好。補充一點,如果你對你的初始化腳本是否起作用沒有信心,可以在啓動Insight之後只選擇菜單Run&gt;Connect to target,然後選擇菜單View&gt;Memory查看各個寄存器和內存。最後給出一張我用Insight調試U-Boot的截圖。

點擊看大圖

在使用的過程中就會發現,用Wiggler下載的速度實在不怎麼樣,U-Boot的可執行映像至多隻有200KB,所以還是可以忍受的。

用同樣的方法也可以調試其他Boot Loader,甚至是Linux內核;但是Linux內核的可執行映像一般有2MB之大,用Wiggler調試也是不現實的。我之前已經做了廣告了,內核的調試要用J-Link來搞,敬請期待EE小站的後續文章。

我對ARM CPU的在線Flash Download這件事情不是很感冒,所以H-JTAG和OpenOCD的這部分功能EE小站是不會涉及了,請見諒。今天就到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章