前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >树莓派JTAG详细使用笔记

树莓派JTAG详细使用笔记

作者头像
bigmagic
发布2020-05-18 23:27:02
4.3K1
发布2020-05-18 23:27:02
举报
文章被收录于专栏:嵌入式iot嵌入式iot

1.说明

有的时候,在调试代码的时候,往往会借助一些硬件调试工具,JTAG就是很好的调试工具。下面来详细介绍一下如何在树莓派上使用JTAG进行调试。

本文主要在树莓派4上实现jlink调试功能。通过jlink+openocd调试树莓派4。之后就可以通过gdb指令调试树莓派4的程序了。

工欲善其事,必先利其器,有了更好的工具,让开发的程序变得更加稳定,同时也在后期对程序进行定位分析的时候,也能很容易的进行程序的跟踪。

1

下面来详细描述一下环境搭建与使用。

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

为了更加方便的看清线路的连接,图片标识如下

2

其引脚的定义如下:

3

实物连接可以看下面的图片:

4

其中树莓派接入一个jlink调试器。

5

放大后的引脚图如下:

6

线路连接完成后,可以进行后续操作。

2.2 准备软件

安装JLinkOB

首先必须安装JLinkOB驱动。

7

因为是在Ubuntu上搭建环境,所以可以进行图中下载,然后安装

代码语言:javascript
复制
sudo dpkg -i JLink_Linux_V672c_x86_64.deb

看到如下的图片则成功

8

验证是否安装成功,可以输入:

代码语言:javascript
复制
sudo JLinkExe

看到如下信息表示成功

9

「安装openocd」

对于openocd的安装,要支持树莓派4,则可以到如下的链接去下载

代码语言:javascript
复制
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,下载地址

代码语言:javascript
复制
https://gnutoolchains.com/arm-eabi/openocd/

如果从其他渠道下载,后期调试时,可能会遇到如下的错误:

代码语言:javascript
复制
raspi4.cfg:15: Error: invalid command name "dap"

可以通过对脚本的配置实现。其树莓派4的脚本可以在百度网盘中找到。

执行

代码语言:javascript
复制
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中的实现

代码语言:javascript
复制
https://github.com/metebalci/baremetal-rpi/blob/master/01-infinite-loop/infloop.s

只有一段代码

代码语言:javascript
复制
l: b l

在不断执行循环程序。

而后修改SD卡中的配置文件

代码语言:javascript
复制
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卡中。

将相关的文件放入,可以在我的网盘下进行下载:

https://pan.baidu.com/s/1F5toHNpt20tfVsmhzspw6Q

提取码:iq7m

将SD卡插入,插上电源,系统进入等待JTAG连接的模式。

「第二步:连接openocd」

通过下面的指令脚本进行连接

代码语言:javascript
复制
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

其中主要的命令就是

代码语言:javascript
复制
openocd -f xxx.cfg -f raspi4.cfg

连接完成可以看到打印信息如下:

10

主要注意的是三个端口的连接,这里控制openocd采用telnet,连接gdb的端口采用3333。

「第三步:通过telnet加载固件」

此时需要通过telnet去load内存镜像到内存中。

本次实验采用的是rt-thread的raspi4的系统进行调试。

代码语言:javascript
复制
https://github.com/RT-Thread/rt-thread/tree/master/bsp/raspberry-pi/raspi4

编译完成生成rtthread.bin和rtthread.elf可以看到如下图所示

11

然后就可以进行相关的调试了。

启动telnet

代码语言:javascript
复制
telnet localhost 4444

加载固件

代码语言:javascript
复制
halt
load_image /home/bigmagic/work/rt-thread2/bsp/raspberry-pi/raspi4/rtthread.bin 0x80000

表示将rtthread.bin固件加载到树莓派4的0x80000地址处。

12

然后输入

代码语言:javascript
复制
step 0x80000

表示从入口地址0x80000执行程序。

「第四步:启动gdb调试」

在另外的一个控制台输入

代码语言:javascript
复制
aarch64-elf-gdb

接着输入

代码语言:javascript
复制
target remote localhost:3333
file rtthread.elf

此时程序就可以在入口函数处停留了。

「第五步:查看寄存器与代码」

输入layout src可以展开代码

输入layout reg可以查看寄存器

输入layout split可以展开汇编

14

然后就可以按照gdb的方式进行调试了。

比如我们设置断点为entry

代码语言:javascript
复制
break entry
c

然后就可以看到停到断点处了

15

这样调试程序起来就非常方便了。

3.总结

上述介绍了树莓派4上用jlink与openocd调试程序的过程。工欲善其事,必先利其器。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.说明
  • 2.环境准备
    • 2.1 硬件连接
      • 2.2 准备软件
        • 安装JLinkOB
        • 让程序halt
        • 开启调试
    • 3.总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档