1. 背景
目前开发中常用的调试手段主要有串口、IO口输出作为调试方式。目前串口的限制较多,有些硬件不太方便接串口或者一些实时的数据,当时没有接串口则无法实时获取调试信息。
- IO调试,可获得的信息较少,在设备出现运行异常,如死机等情况,无法通过串口和IO口获得较多现场的信息。
Jlink可以通过commander命令调试口或者比较多现场实时的数据以及调试信息。例如:
1)获取当前运行PC指针,
2)获取ram以及flash中的数据,结合map文件可以查看代码中的变量值
- IO调试,可获得的信息较少,在设备出现运行异常,如死机等情况,无法通过串口和IO口获得较多现场的信息。
- 这些信息有助于提高开发效率以及快速定位问题。
Jlink commander命令还可以和JLINK RTT结合,用来打印应用log,RTT可以用来替换uart串口。
目标
提高开发效率,获取代码现场数据,缩短定位bug的时间。
实现方法
硬件条件:
JLink(V8版本以上),
安装JLink驱动,JLink驱动要求V4.9以上,
支持Jlink的设备
JLINK Commander使用方法。
- 连接JLink到设备,并安装好对应的驱动,
- 打开Jlink Commander 终端
- 输入connect命令
- 按照提示输入:?
- 系统会弹窗并提示选择对应平台,以富芮坤8018为例,这里选择Cortex M3
- 选择接口为SWD,并设置传输速率
- 界面显示识别到了Cortex M3 ,便连接上了目标板,如下图所示
此时我们就可以使用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寄存器值。
上面的信息连可以看到当前运行的PC指针,再可以结合生成的map文件,就可以看到当前运行的函数。例如上面运行的PC指针为0x01000E72,下图是固件的map文件,查看map文件对应地址的函数为SEGGER_RTT_Write。
- 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