下面是一個完整的jtag調(diào)試部件:
下面來講講arm上的jtag調(diào)試,openocd就是一個jtag的調(diào)試工具
我們在調(diào)試程序的時候,通常需要設(shè)置斷點(diǎn),斷點(diǎn)也就是指令所在的位置,
斷點(diǎn)分為兩種:硬件斷點(diǎn)跟軟件斷點(diǎn)
硬件斷點(diǎn):指令的地址。當(dāng)cpu要去某個地址取指令的時候,就暫停cpu的運(yùn)行。在s3c2440上只支持兩個硬件斷點(diǎn)
軟件斷點(diǎn):軟件斷點(diǎn)不限制斷點(diǎn)的個數(shù),因此硬件斷點(diǎn)的方法是不可用的。當(dāng)我們需要在某個指令上打斷點(diǎn)的時候,openocd會先去取得斷點(diǎn)的地址,然后把每個斷點(diǎn)處的值替換成某個特定的值(如deeedeee),當(dāng)cpu取數(shù)據(jù)的時候得到該特定的值,就知道到達(dá)了斷點(diǎn)地址,暫停cpu的運(yùn)行,去除斷點(diǎn)的時候再把原本的值換回去。如果沒指定硬件斷點(diǎn)的話,一般都默認(rèn)是軟件斷點(diǎn)。
另外openocd對于軟件斷點(diǎn)有特定的要求:
1.程序必須位于它的鏈接地址上,即如果指定了。 = 0x30000000,那么程序必須實(shí)際上是位于0x30000000這個地方,也就是說程序必須已經(jīng)重定位好,位于它的鏈接地址。
2.程序必須按照某種特定的順序排放:
SECTIONS{
。 = 0x30000000;
.text :{
head.o(.text)
init.o(.text)
nand.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata)}
.data ALIGN(4) : {*(.data)}
.bss ALIGN(4) : {*(.bss) *(COMMON)}
}
gdb調(diào)試就是基于軟件斷點(diǎn)的調(diào)試,我們可以用gdb對程序代碼的某一行進(jìn)行斷點(diǎn)設(shè)置,那么它是如何定位到某個指令的地址的?
這就需要有調(diào)試信息,也就是在編譯的時候加上 -g 給程序添加調(diào)試信息。
eclipse對gdb進(jìn)行了進(jìn)一步的封裝(GUI),我們可以通過對eclipse進(jìn)行某些設(shè)置達(dá)到調(diào)試arm程序的目的。
1.首先把文件加入工程
2.設(shè)置調(diào)試配置:
點(diǎn)工具欄上的小蟲子
Debug Configurations.。。
新建一個調(diào)試配置
選擇選項卡Main,在C/C++ Application: 選項上選擇要調(diào)試的elf文件
選擇選項卡Debugger,GDB debugger: 選擇為arm-elf-gdb
選擇選項卡Commands, ‘Initialize’conmmands 下輸入命令:
target remote 127.0.0.1:3333 //連接openocd
load //加載程序到內(nèi)存
break _start //設(shè)置斷點(diǎn)到_start
c //continue繼續(xù)執(zhí)行
然后Apply ,最后Debug開始調(diào)試
3.當(dāng)然,上述程序是在內(nèi)存執(zhí)行的,但是開發(fā)板一開始的時候內(nèi)存還沒初始化,是不可用的,因此我們需要先設(shè)置內(nèi)存
在openocd的命令控制臺上(telnet 127.0.0.1 4444進(jìn)入openocd控制臺)
halt //暫停cpu
load_image init.bin 0 //加載內(nèi)存初始化程序 init.bin 到 0 地址
resume 0 //在0地址開始運(yùn)行
halt //暫停cpu
然后就可以Debug了
Debug時,當(dāng)運(yùn)行到斷點(diǎn)處的時候,我們可以看到某些寄存器或者變量的值,這些值在eclipse上顯示:
評論