zoukankan      html  css  js  c++  java
  • 树莓派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调试程序的过程。工欲善其事,必先利其器。

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





  • 相关阅读:
    堆得简单介绍以及堆排序
    从交换两个变量的值来看程序员的“奇技淫巧”
    两道有意思的题目
    mac上使用brew
    安全考虑,binlog_row_image建议尽量使用FULL
    Python3.6新特性
    自动化测试基础篇--Selenium浏览器操作
    自动化测试基础篇--Selenium Xpath定位
    自动化测试基础篇--Selenium元素定位
    自动化测试基础篇--Selenium Python环境搭建
  • 原文地址:https://www.cnblogs.com/bigmagic/p/12980705.html
Copyright © 2011-2022 走看看