树莓派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调试程序的过程。工欲善其事,必先利其器。

拥有好的分析代码手段,将很容易的进行代码定位与质量分析。在关键的时候,能够发挥出巨大的作用,特别在对复杂代码的逻辑分析上,也能很好的定位。





posted @ 2020-05-28 14:35  bigmagic  阅读(4887)  评论(3编辑  收藏  举报