JLink Commander调试方法

1. 背景

  • 目前开发中常用的调试手段主要有串口、IO口输出作为调试方式。目前串口的限制较多,有些硬件不太方便接串口或者一些实时的数据,当时没有接串口则无法实时获取调试信息。
  • IO调试,可获得的信息较少,在设备出现运行异常,如死机等情况,无法通过串口和IO口获得较多现场的信息。
    Jlink可以通过commander命令调试口或者比较多现场实时的数据以及调试信息。例如:
    1)获取当前运行PC指针,
    2)获取ram以及flash中的数据,结合map文件可以查看代码中的变量值
  • 这些信息有助于提高开发效率以及快速定位问题。
    Jlink commander命令还可以和JLINK RTT结合,用来打印应用log,RTT可以用来替换uart串口。

目标

提高开发效率,获取代码现场数据,缩短定位bug的时间。

实现方法

硬件条件:
JLink(V8版本以上),
安装JLink驱动,JLink驱动要求V4.9以上,
支持Jlink的设备

JLINK Commander使用方法。

  1. 连接JLink到设备,并安装好对应的驱动,
  2. 打开Jlink Commander 终端
  3. 输入connect命令
  4. 按照提示输入:?
  5. 系统会弹窗并提示选择对应平台,以富芮坤8018为例,这里选择Cortex M3
  6. 选择接口为SWD,并设置传输速率
  7. 界面显示识别到了Cortex M3 ,便连接上了目标板,如下图所示

MCUXpresso 使用Jlink调试 jlink调试方法_M3

  1. 此时我们就可以使用jlink commander命令来进行调试 ,commander 命令可参考segger官方说明文档:https://wiki.segger.com/J-Link_Commander
    常用的命令有halt,go,mem(mem8,mem16, mem32), write(write1, write2, write4 )
    其他的命令可以自行体验: 如setpc命令用来设置PC指针。Erase命令用来擦除flash

命令

功能

参数

备注

halt

停止运行


停止运行后,会显示PC指针,SP地址等信息。

go

运行


mem

读取内存地址

起始地址 读取长度

可以结合map文件读取对应变量的值。

write

写对应地址。 可以和mem命令配合使用

起始地址 读取长度

结合map文件写入变量的值。

  • halt 命令是可以与go命令配合使用,执行halt命令后,设备会停止运行,并再commander终端显示当前寄存器的数值。里面可以重点关注PC指针,SP指针和R14寄存器值。

MCUXpresso 使用Jlink调试 jlink调试方法_数据_02

上面的信息连可以看到当前运行的PC指针,再可以结合生成的map文件,就可以看到当前运行的函数。例如上面运行的PC指针为0x01000E72,下图是固件的map文件,查看map文件对应地址的函数为SEGGER_RTT_Write。

MCUXpresso 使用Jlink调试 jlink调试方法_M3_03

  • go 命令:
    用来运行程序,需要和halt命令配合执行,在halt执行后,再运行go。
  • mem:
    用来读取内存的数据,参数为内存的地址和读取的长度。 mem8 mem16 mem32分别用来读取不同长度单位的数据。 也可以直接用mem命令按照8位来读取。
    例如下图命令读取0x20003300地址16个字节的内容,里面存放的是“SEGGER RTT”的字符串

write:

用来写入对应的内存地址,参数为内存的地址和写入的数据。write1 write2 write4分别用来写入不用的自己长度。

例如要在上面0x20003300地址写入12345678,则执行如下命令:write4 0x20003300 12345678

在通过mem命令读取0x20003300地址数据,可以看到数据已经变成了12345678

MCUXpresso 使用Jlink调试 jlink调试方法_串口_04