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