树莓派JTAG详细使用笔记
树莓派JTAG详细使用笔记
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调试程序的过程。工欲善其事,必先利其器。
拥有好的分析代码手段,将很容易的进行代码定位与质量分析。在关键的时候,能够发挥出巨大的作用,特别在对复杂代码的逻辑分析上,也能很好的定位。