樹莓派JTAG詳細(xì)使用筆記
掃描二維碼
隨時隨地手機(jī)看文章
樹莓派JTAG詳細(xì)使用筆記
-
1.說明
-
2.環(huán)境準(zhǔn)備
-
2.1 硬件連接
-
2.2 準(zhǔn)備軟件
-
3.總結(jié)
1.說明
有的時候,在調(diào)試代碼的時候,往往會借助一些硬件調(diào)試工具,JTAG就是很好的調(diào)試工具。下面來詳細(xì)介紹一下如何在樹莓派上使用JTAG進(jìn)行調(diào)試。
本文主要在樹莓派4上實(shí)現(xiàn)jlink調(diào)試功能。通過jlink+openocd調(diào)試樹莓派4。之后就可以通過gdb指令調(diào)試樹莓派4的程序了。
工欲善其事,必先利其器,有了更好的工具,讓開發(fā)的程序變得更加穩(wěn)定,同時也在后期對程序進(jìn)行定位分析的時候,也能很容易的進(jìn)行程序的跟蹤。
下面來詳細(xì)描述一下環(huán)境搭建與使用。
2.環(huán)境準(zhǔn)備
對于gdb的使用,建議在Ubuntu上進(jìn)行,這樣支持的更加友好。所以本次實(shí)驗(yàn)的軟件部分主要是在Ubuntu上進(jìn)行環(huán)境搭建與開發(fā)。
2.1 硬件連接
樹莓派的40pin引腳上其實(shí)是有jtag接口的,所以不用飛線,只需要杜邦線就可以實(shí)現(xiàn)線路連接。
基本的引腳定義如下:
管腳名字 | gpio功能ALT4 |
---|---|
GPIO22 | ARM_TRST |
GPIO24 | ARM_TDO |
GPIO25 | ARM_TCK |
GPIO26 | ARM_TDI |
GPIO27 | ARM_TMS |
為了更加方便的看清線路的連接,圖片標(biāo)識如下
其引腳的定義如下:
實(shí)物連接可以看下面的圖片:
其中樹莓派接入一個jlink調(diào)試器。
放大后的引腳圖如下:
線路連接完成后,可以進(jìn)行后續(xù)操作。
2.2 準(zhǔn)備軟件
安裝JLinkOB
首先必須安裝JLinkOB驅(qū)動。
因?yàn)槭窃赨buntu上搭建環(huán)境,所以可以進(jìn)行圖中下載,然后安裝
sudo dpkg -i JLink_Linux_V672c_x86_64.deb
看到如下的圖片則成功
驗(yàn)證是否安裝成功,可以輸入:
sudo JLinkExe
看到如下信息表示成功
「安裝openocd」
對于openocd的安裝,要支持樹莓派4,則可以到如下的鏈接去下載
https://github.com/xpack-dev-tools/openocd-xpack/releases/download/v0.10.0-13/xpack-openocd-0.10.0-13-linux-x64.tgz
對于Windows上的openocd,下載地址
https://gnutoolchains.com/arm-eabi/openocd/
如果從其他渠道下載,后期調(diào)試時,可能會遇到如下的錯誤:
raspi4.cfg:15: Error: invalid command name "dap"
可以通過對腳本的配置實(shí)現(xiàn)。其樹莓派4的腳本可以在百度網(wǎng)盤中找到。
執(zhí)行
sudo /home/bigmagic/tools/xpack-openocd-0.10.0-13-linux-x64/xPacks/openocd/0.10.0-13/bin/openocd -f /home/bigmagic/tools/xpack-openocd-0.10.0-13-linux-x64/xPacks/openocd/0.10.0-13/scripts/interface/jlink.cfg -f /home/bigmagic/openocd/raspi4.cfg
可以實(shí)現(xiàn)openocd通過jlink的連接到樹莓派4上。
讓程序halt
為了讓樹莓派程序在啟動的時候停下來,然后手動通過openocd加載固件到內(nèi)存,可以進(jìn)行如下操作:
看下面github中的實(shí)現(xiàn)
https://github.com/metebalci/baremetal-rpi/blob/master/01-infinite-loop/infloop.s
只有一段代碼
l: b l
在不斷執(zhí)行循環(huán)程序。
而后修改SD卡中的配置文件
enable_uart=1 arm_64bit=1 kernel=infloop.bin enable_jtag_gpio=1 gpio=22-27=a4 init_uart_clock=48000000 init_uart_baud=115200
其中infloop.bin表示可執(zhí)行的程序,這里替換成自己的程序就可以運(yùn)行正常的程序了。
開啟調(diào)試
「第一步:存放文件」
將啟動固件放到sd卡中。
將相關(guān)的文件放入,可以在我的網(wǎng)盤下進(jìn)行下載:
https://pan.baidu.com/s/1F5toHNpt20tfVsmhzspw6Q
提取碼:iq7m
將SD卡插入,插上電源,系統(tǒng)進(jìn)入等待JTAG連接的模式。
「第二步:連接openocd」
通過下面的指令腳本進(jìn)行連接
sudo /home/bigmagic/tools/xpack-openocd-0.10.0-13-linux-x64/xPacks/openocd/0.10.0-13/bin/openocd -f /home/bigmagic/tools/xpack-openocd-0.10.0-13-linux-x64/xPacks/openocd/0.10.0-13/scripts/interface/jlink.cfg -f /home/bigmagic/openocd/raspi4.cfg
其中主要的命令就是
openocd -f xxx.cfg -f raspi4.cfg
連接完成可以看到打印信息如下:
主要注意的是三個端口的連接,這里控制openocd采用telnet,連接gdb的端口采用3333。
「第三步:通過telnet加載固件」
此時需要通過telnet去load內(nèi)存鏡像到內(nèi)存中。
本次實(shí)驗(yàn)采用的是rt-thread的raspi4的系統(tǒng)進(jìn)行調(diào)試。
https://github.com/RT-Thread/rt-thread/tree/master/bsp/raspberry-pi/raspi4
編譯完成生成rtthread.bin和rtthread.elf可以看到如下圖所示
然后就可以進(jìn)行相關(guān)的調(diào)試了。
啟動telnet
telnet localhost 4444
加載固件
halt load_image /home/bigmagic/work/rt-thread2/bsp/raspberry-pi/raspi4/rtthread.bin 0x80000
表示將rtthread.bin固件加載到樹莓派4的0x80000地址處。
然后輸入
step 0x80000
表示從入口地址0x80000執(zhí)行程序。
「第四步:啟動gdb調(diào)試」
在另外的一個控制臺輸入
aarch64-elf-gdb
接著輸入
target remote localhost:3333 file rtthread.elf
此時程序就可以在入口函數(shù)處停留了。
「第五步:查看寄存器與代碼」
輸入layout src可以展開代碼
輸入layout reg可以查看寄存器
輸入layout split可以展開匯編
然后就可以按照gdb的方式進(jìn)行調(diào)試了。
比如我們設(shè)置斷點(diǎn)為entry
break entry c
然后就可以看到停到斷點(diǎn)處了
這樣調(diào)試程序起來就非常方便了。
3.總結(jié)
上述介紹了樹莓派4上用jlink與openocd調(diào)試程序的過程。工欲善其事,必先利其器。
擁有好的分析代碼手段,將很容易的進(jìn)行代碼定位與質(zhì)量分析。在關(guān)鍵的時候,能夠發(fā)揮出巨大的作用,特別在對復(fù)雜代碼的邏輯分析上,也能很好的定位。