上一篇文章說(shuō)到在ads中如何裸奔代碼(bin文件),很遺憾,如果用gcc編譯的elf文件ads并不能很好支持,當然帶調試信息的elf文件debug起來(lái)總是比較方便的;當然以下是各種方案:
1 linux gcc編譯,windows ads或者iar調試;
2 linux gcc編譯,windows keil或者realview調試;
3 windows 下ads或者keil或者iar編譯調試;
4 windows 下用cygwin或者用GNUARM之類(lèi)的編譯,然后用gdb insight 配合gdb server調試。
5 虛擬機linux gcc編譯,然后運行gdb通過(guò)串口tcp遠程調試win主機的target,需要win端有一個(gè)gdbserver,如jlink gdbserver;
6 純linux下 gcc編譯,gdb+openocd+jlink或者wiggler調試,今天重點(diǎn)就是這個(gè)。
(1)(2)上一篇文章講過(guò)了,(3)相信大多數人都現在用著(zhù),(4)也很多資料介紹。
(5)我之前實(shí)驗過(guò),vmware,insight啟動(dòng)后提示connection reset by peer。by the way:由于jlink gdbserver的端口(2331)無(wú)法更改,我的insight也神神秘秘的target selection對話(huà)框無(wú)法輸入,默認端口是1000,真讓人抓狂!這個(gè)問(wèn)題很多人問(wèn),其實(shí)insight啟動(dòng)后會(huì )在當前用戶(hù)主目錄執行.gdbtkinit這個(gè)文件,里面保存了很多配置信息,大家可以進(jìn)去看看,端口也是在里面更改的。
準備工作: 官方建議大家把共享的腳本寫(xiě)在一個(gè)cfg里面,差異化的按類(lèi)別寫(xiě),多個(gè)腳本可以用-f在openocd啟動(dòng)時(shí)候指定,也可以在一個(gè)cfg文件像c語(yǔ)言一樣include另外一個(gè)cfg文件,我寫(xiě)成一個(gè)腳本方便調試,大家可別學(xué)我哦。 #------------------------------------------------------------------------- if { [info exists CHIPNAME] } { if { [info exists ENDIAN] } { if { [info exists CPUTAPID ] } { #jtag scan chain set _TARGETNAME [format "%s.cpu" $_CHIPNAME] #------------------------------------------------------------------------- #------------------------------------------------------------------------- #------------------------------------------------------------------------- jtag_khz 3000 #------------------------------------------------ arm7_9 dbgrq disable proc init_44b0 { } { halt mww phys 0x01C00000 0x0E $_TARGETNAME configure -event gdb-attach init_44b0 init #GDB 6.8 and higher set any memory area not in the memory map as inaccessible, this can be changed to the old behaviour by using the following gdb command. 接下來(lái)現啟動(dòng)openocd服務(wù),等待gdb或者insight來(lái)連接。 然后啟動(dòng)insight:命令我就不寫(xiě)了呵呵 最后下載,然后就可以調試了,也可以在gdb控制臺輸入命令來(lái)調試。 可愛(ài)的hello world 出現了:
1)本地gcc編譯器,一般linux自帶的就可以。
2)交叉gcc編譯器,現成的或者用crosstool自己編譯一個(gè),可以參照我前面的文章。
3)insight源碼。
4)openocd源碼。
安裝insight跟openocd:
1)安裝insight
# ./configure --prefix=/opt/crosstool/insight --target=arm-softfloat-linux --enable-sim
# make
# make install
2)安裝openocd(0.3.0)
# ./configure --prefix=/opt/crosstool/openocd --enable-parport--enable-jlink
# make
# make install
配置openocd:
1)好好看看官方的文檔,openocd每一個(gè)版本之間的命令差異很大。
2)按照良好的編程習慣,openocd推薦你按照以下步驟配置openocd
配置interface
配置openocd
配置board
配置target
../openocd-0.3.0/share/openocd/scripts有很多樣板腳本可以參考。
腳本放在當前程序調試文件夾,openocd啟動(dòng)時(shí)候自動(dòng)搜索openocd.cfg文件執行腳本命令。
以下是我的openocd.cfg
# Target configuration for the Samsung 44b0 system on chip
# Tested on a S3C44b0 Evaluation board
# Processor : ARM7tdmi
# Info: JTAG tap: s3c44b0.cpu tap/device found: 0x1f0f0f0f
# (Manufacturer:
#-------------------------------------------------------------------------
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME s3c44b0
}
set _ENDIAN $ENDIAN
} else {
# this defaults to a bigendian
set _ENDIAN little
}
set _CPUTAPID $CPUTAPID
} else {
# force an error till we get a good number
set _CPUTAPID 0x1f0f0f0f
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0x0f -expected-id $_CPUTAPID
target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi
#$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x40000000 -work-area-size 0x4000 -work-area-backup 1
#interface
#-------------------------------------------------------------------------
interface jlink
#reset configuration
#-------------------------------------------------------------------------
jtag_nsrst_delay 200
jtag_ntrst_delay 200
reset_config trst_and_srst
# JTAG ADAPTER SPECIFIC
# IMPORTANT! See README at top of this file.
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GDB Setup
#-------------------------------------------------------------------------
telnet_port 4444
gdb_port 2331
tcl_port 6666
echo " "
echo "-------------------------------------------"
echo "--- login with - telnet localhost 4444 ---"
echo "--- gdb_port 2331 ---"
echo "-------------------------------------------"
echo " "
gdb_breakpoint_override soft
gdb_memory_map disable
# ARM SPECIFIC
#------------------------------------------------
# arm7_9 dcc_downloads enable
# arm7_9 fast_memory_access enable
#------------------------------------------------
# Processor Initialialization
# Note: Processor writes can only occur when
# the state is in SYSTEM. When you call init_44b0
#------------------------------------------------
s3c44b0.cpu curstate
arm7_9 write_xpsr 0xd3 0
#-----------------------------------------------------------------
#-----------------------------System configure----------------------
#-----------------------------------------------------------------
#SYSCFG;INTMSK;WTCON
#PLLCON,10MHZ OSC,66M OUT
#SBUSCON;BWSCON;BANKCON0;BANKCON1;BANKCON2;BANKCON3;BANKCON4;BANKCON5;BANKCON6;BANKCON7
#REFRESH;BANKSIZE;MRSRB6;MRSRB7
mww phys 0x01E0000C 0x07FFFFFF
mww phys 0x01D30000 0x0
mww phys 0x01D80000 0x0003A031
mww phys 0x01C40000 0x80001B1B
mww phys 0x01C80000 0x11110112
mww phys 0x01C80004 0x00000600
mww phys 0x01C80008 0x00000700
mww phys 0x01C8000C 0x00000700
mww phys 0x01C80010 0x00000700
mww phys 0x01C80014 0x00000700
mww phys 0x01C80018 0x00000700
mww phys 0x01C8001C 0x00018000
mww phys 0x01C80020 0x00018000
mww phys 0x01C80024 0x0086041A
mww phys 0x01C80028 0x00000016
mww phys 0x01C8002C 0x00000020
mww phys 0x01C80030 0x00000020
#-----------------------------------------------------------------
#-----------------------------Port configure----------------------
#-----------------------------------------------------------------
#PCONA#;PDATA;PCONC;PUPC;PDATC;PDATD;PCOND;PUPD;PCONE;PDATE;PUPE;
#PCONF;PUPF;PDATF;PDATG;PCONG;PUPG;PDATB;PCONB
mww phys 0x01D20000 0x000001FF
mww phys 0x01D20004 0x00000000
mww phys 0x01D20010 0xfff5ff55
mww phys 0x01D20014 0x00000000
mww phys 0x01D20018 0x00003000
mww phys 0x01D2001C 0x0000AAAA
mww phys 0x01D20020 0x00000055
mww phys 0x01D20024 0x00000000
mww phys 0x01D20028 0x0000556B
mww phys 0x01D2002C 0x00000357
mww phys 0x01D20030 0x00000006
mww phys 0x01D20034 0x0022445A
mww phys 0x01D20038 0x00000000
mww phys 0x01D2003C 0x000001D3
mww phys 0x01D20040 0x00000000
mww phys 0x01D20044 0x000000FF
mww phys 0x01D20048 0x00000000
mww phys 0x01D20008 0x0000004F
mww phys 0x01D2000C 0x0000004F
}
#----------------------------------------------------------------------------
#----------------------------------- END ------------------------------------
#----------------------------------------------------------------------------
GDB 在啟動(dòng)的時(shí)候會(huì )按一定的路徑順序(通常是先當前目錄而后用戶(hù)目錄)尋找 .gdbinit 文件,一旦找到,就會(huì )自動(dòng)執行里面的命令。這個(gè)功能允許用戶(hù)把常用的一些命令放在這個(gè)文件里,這樣就不用每次進(jìn)入 gdb 后再去手動(dòng)執行這些命令。事實(shí)上,.gdbinit 就是一個(gè)腳本,甚至可在里面把常用的若干 gdb命令序列定義成一個(gè)新命令,這樣只要在 gdb 里面輸入這個(gè)新命令就等于自動(dòng)執行了被定義的那個(gè)命令序列。
以下是我的.gdbinit文件
set mem inaccessible-by-default off
#Previous versions of OpenOCD required the following gdb options to increase the packet size and speed up gdb communication.
#This is now handled in the qSupported PacketSize.
#但是現在如果去掉,還是出現(openocd那邊):Warning:acknowledgment received, but no packet pending
#Warning:negative reply, retrying
#Error: GDB missing ack(2) - assumed good
#Warning:negative reply, retrying
#之類(lèi)的錯誤,gdb的console窗口也會(huì )出現錯誤。
set remote memory-write-packet-size 1024
set remote memory-write-packet-size fixed
set remote memory-read-packet-size 1024
set remote memory-read-packet-size fixed
target remote localhost:2331
monitor sleep 500
monitor poll
monitor soft_reset_halt
命令我就不寫(xiě)了
//______________________________________________//
force soft breakpoints
use of EmbeddedICE dbgrq instead of breakpoint for target halt disabled
Info : J-Link initialization started / target CPU reset initiated
Info : J-Link ARM V7 compiled Jun 30 2009 11:05:27
Info : JLink caps 0xb9ff7bbf
Info : JLink hw version 70000
Info : JLink max mem block 9152
Info : Vref = 3.222 TCK = 1 TDI = 0 TDO = 0 TMS = 0 SRST = 0 TRST = 0
Info : J-Link JTAG Interface ready
Info : clock speed 3000 kHz
Info : JTAG tap: s3c44b0.cpu tap/device found: 0x1f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x1)
Info : Embedded ICE version 1
注意:openocd執行時(shí)候需要讀寫(xiě)jlink,普通用戶(hù)可能沒(méi)有這個(gè)權限,需要admin權限,而jlink不是usbfs設備,暫時(shí)沒(méi)有弄給普通用戶(hù)添加jlink的權限。普通用戶(hù)執行openocd會(huì )出現如下錯誤:
force soft breakpoints
use of EmbeddedICE dbgrq instead of breakpoint for target halt disabled
Info : J-Link initialization started / target CPU reset initiated
Error: J-Link command 0xde failed (-1)
Error: J-Link command 0xdc failed (-1)
Error: J-Link command 0x01 failed (-1)
Error: J-Link command EMU_CMD_VERSION failed (-1)

聯(lián)系客服