樹莓派JTAG詳細使用筆記


樹莓派JTAG詳細使用筆記

toc

1.說明

有的時候,在調試代碼的時候,往往會借助一些硬件調試工具,JTAG就是很好的調試工具。下面來詳細介紹一下如何在樹莓派上使用JTAG進行調試。

本文主要在樹莓派4上實現jlink調試功能。通過jlink+openocd調試樹莓派4。之后就可以通過gdb指令調試樹莓派4的程序了。

工欲善其事,必先利其器,有了更好的工具,讓開發的程序變得更加穩定,同時也在后期對程序進行定位分析的時候,也能很容易的進行程序的跟蹤。

下面來詳細描述一下環境搭建與使用。

2.環境准備

對於gdb的使用,建議在Ubuntu上進行,這樣支持的更加友好。所以本次實驗的軟件部分主要是在Ubuntu上進行環境搭建與開發。

2.1 硬件連接

樹莓派的40pin引腳上其實是有jtag接口的,所以不用飛線,只需要杜邦線就可以實現線路連接。

基本的引腳定義如下:

管腳名字 gpio功能ALT4
GPIO22 ARM_TRST
GPIO24 ARM_TDO
GPIO25 ARM_TCK
GPIO26 ARM_TDI
GPIO27 ARM_TMS

為了更加方便的看清線路的連接,圖片標識如下

其引腳的定義如下:

實物連接可以看下面的圖片:

其中樹莓派接入一個jlink調試器。

放大后的引腳圖如下:

線路連接完成后,可以進行后續操作。

2.2 准備軟件

安裝JLinkOB

首先必須安裝JLinkOB驅動。

因為是在Ubuntu上搭建環境,所以可以進行圖中下載,然后安裝

sudo dpkg -i JLink_Linux_V672c_x86_64.deb

看到如下的圖片則成功

驗證是否安裝成功,可以輸入:

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/

如果從其他渠道下載,后期調試時,可能會遇到如下的錯誤:

raspi4.cfg:15: Error: invalid command name "dap"

可以通過對腳本的配置實現。其樹莓派4的腳本可以在百度網盤中找到。

執行

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通過jlink的連接到樹莓派4上。

讓程序halt

為了讓樹莓派程序在啟動的時候停下來,然后手動通過openocd加載固件到內存,可以進行如下操作:

看下面github中的實現

https://github.com/metebalci/baremetal-rpi/blob/master/01-infinite-loop/infloop.s

只有一段代碼

l: b l 

在不斷執行循環程序。

而后修改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表示可執行的程序,這里替換成自己的程序就可以運行正常的程序了。

開啟調試

第一步:存放文件

將啟動固件放到sd卡中。

將相關的文件放入,可以在我的網盤下進行下載:

將SD卡插入,插上電源,系統進入等待JTAG連接的模式。

第二步:連接openocd

通過下面的指令腳本進行連接

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內存鏡像到內存中。

本次實驗采用的是rt-thread的raspi4的系統進行調試。

https://github.com/RT-Thread/rt-thread/tree/master/bsp/raspberry-pi/raspi4

編譯完成生成rt-thread.bin和rt-thread.elf可以看到如下圖所示

然后就可以進行相關的調試了。

啟動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執行程序。

第四步:啟動gdb調試

在另外的一個控制台輸入

aarch64-elf-gdb

接着輸入

target remote localhost:3333
file rtthread.elf

此時程序就可以在入口函數處停留了。

第五步:查看寄存器與代碼

輸入layout src可以展開代碼

輸入layout reg可以查看寄存器

輸入layout split可以展開匯編

然后就可以按照gdb的方式進行調試了。

比如我們設置斷點為entry

break entry
c

然后就可以看到停到斷點處了

這樣調試程序起來就非常方便了。

3.總結

上述介紹了樹莓派4上用jlink與openocd調試程序的過程。工欲善其事,必先利其器。

擁有好的分析代碼手段,將很容易的進行代碼定位與質量分析。在關鍵的時候,能夠發揮出巨大的作用,特別在對復雜代碼的邏輯分析上,也能很好的定位。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM