一.无线调试器说明

许多单片机支持使用SWD与JTAG接口在线仿真调试,但很多场景下(如无人机、移动机器人),我们没有办法在设备运行的过程中将线缆插到设备上进行有线调试,这时候一个可以远程debug和查看曲线的无线调试器就显得非常重要了。

市面上大多数(几乎100%)无线调试器都是基于开源的CMSIS-DAP协议再加上WIFI或2.4G射频等无线通讯模块制作的,代表产品是正点原子的高速/普速版无线调试器,这种方案的优点是:1.全开源,可控性强,社区力量强;2.若硬件软件完全自制,则成本很低。

segger公司在去年8月时发布了j-link软件对树莓派的支持包:SEGGER J-Link adds support for Raspberry Pi as host,这使得我们有机会使用树莓派制作一款基于J-Link Remote Server的无线调试器,被调试的设备通过J-Link连接到树莓派,而树莓派和debug的主机之间通过TCP/IP进行通信。

基于J-Link Remote Server制作的无线调试器有以下特点:1.成本较高,需Cortex-A7及以上架构的CPU,以及支持glibc-2.28的操作系统;2.软件闭源,即使出了问题,由于国内使用的几乎都是盗版的j-link和keil,也无法寻求技术支持;3.软硬件商业化,方案稳定、简单;4.可使用segger公司成熟的j-scope数据可视化软件,便于调试。

我想制作这样一个无线调试器主要是因为上面说的优点4,我们使用正点原子或市面上其他的无线调试器时,其实是没有太好的数据可视化方法的,东南大学RM战队在交流分享时提到了两种使用正点原子无线调试器时的数据可视化方法,第一种是使用单独引出串口进行可视化,第二种是使用Cube IDE内置的工具进行可视化。事实上第二种方法是不成立的,ST明确指出STM32CubeMonitor(即上述可视化工具)只支持ST-Link,而正点原子无线调试器是基于CMSISI-DAP协议的,无法使用该工具。而第一种方式也有很多缺点,它是一种侵占式的监视,需要改变程序来监视不同的变量,数据获取的速度和程序中串口输出的速度有关,也无法同时监视很多变量的变化曲线,和segger的j-scope以及ST的STM32CubeMonitor的高速非侵占式监视都有较大差距。

二.软硬件配置及参数

硬件:Raspberry Pi 4B + J-Link V11

操作系统:Ubuntu Desktop 20.10

无线烧录速度:15M

J-Scope采样率:10K samples / s

J-Scope最大监视变量数目:20

事实上,在网络良好的情况下,无线调试器的下载速度和j-scope的采样速率只和我们所使用的j-link型号有关, j-link ob,j-link v9,j-link v11的速率各不相同。j-link 的手册中写到:

J-Link Remote Server allows using J-Link / J-Trace remotely via TCP/IP. This enables you to connect to and fully use a J-Link / J-Trace from another computer. Performance is just slightly (about 10%) lower than with direct USB connection.

在实际测试中,网络状况也会对远程j-link的连接产生影响,在远程调试的时候去网上下载东西会导致调试中断。我校校园网晚高峰时也会使j-link偶尔出现丢包的情况。

三.配置过程

1.说明

在第一节中我说过,segger公司的j-link软件需要Cortex-A7及以上架构的CPU,以及支持glibc-2.28的操作系统才可以运行,我使用过Raspberry Pi Zero W和友善之臂的NanoPi NEO Air进行了测试,均以失败告终,上面的数据就是这么得到的,所以我也不确定该软件在别的平台和环境下可以运行(我没有找到官方的最低配置要求),以下的教程均基于树莓派4b + 16G tf卡。

2.刷系统

Install Ubuntu on a Raspberry Pi

安装Ubuntu Desktop 20.10,我这里选择安装桌面是为了方便,若很熟悉命令行配网并愿意花时间去安装依赖,安装Server也是很好的,但事实上我还不清楚如何在命令行下进行校园网的锐捷认证。

刷完系统需要例行更新一下。

sudo apt -y update && sudo apt -y upgrade

若出现Temporary failure resolving 'ports.ubuntu.com'之类的域名解析错误,则需要手动添加DNS服务器,将下面两句话添加进/etc/resolv.conf文件。

nameserver 8.8.8.8
nameserver 8.8.4.4
3.安装J-Link软件
cd ~/Downloads
wget --post-data 'accept_license_agreement=accepted&non_emb_ctr=confirmed&submit=Download+software'   https://www.segger.com/downloads/jlink/JLink_Linux_arm64.deb
sudo dpkg -i JLink_Linux_arm64.deb
sudo apt -y update && sudo apt -y upgrade

四.使用方法

1.树莓派端

首先我们需要把j-link一端通过USB连接到树莓派上,另一端通过SWD或JTAG连接到我们要调试的嵌入式设备上,然后在树莓派上运行如下指令打开j-link的远程服务端。

JLinkRemoteServerCLExe -Port 19020

如果没有检测到j-link,可能会出现Unable to load library icui18n的错误提示,可以忽略,不影响使用。

如果是通过ssh运行该指令,或者没有安装图形界面,那么可能还会出现JLinkGUIServerExe: cannot connect to X server的报错,可忽略。

现在应该有如下界面:
在这里插入图片描述
随后我们需要获取树莓派的IP:

hostname -I
2.PC端

首先打开KEIL–Options for Target–Debug–Settings进行如下配置,IP地址就填我们刚刚获取到的树莓派的IP地址,这里注意一定要保证PC端和树莓派连接的是一个WIFI,即处在一个局域网内并且可以相互访问,我们可以在Windows的cmd里面ping树莓派的IP地址,看是否接收到回复。
在这里插入图片描述
随后我们要点击JLink Cmd按钮,在弹出的界面中再次输入树莓派的IP。
在这里插入图片描述
现在已经通过命令行连接上jlink了,如下图所示,这个命令行界面需要一直保持,不能关闭。
在这里插入图片描述
这时候在树莓派上,我们可以看到Client connected的提示:
在这里插入图片描述
随后,我们就可以在KEIL中远程下载程序和运行debug了,一切和直连设备没有任何区别。J-Scope也可以使用,输入远程IP和端口即可。

五.TO DO

我现在是简单设置了一个开机自启,通过ssh远程连接到树莓派,程序就会自动运行。我想做到真正的“即插即用”,即将树莓派连接到被调试设备上,就可以直接在KEIL中连接jlink了。同时,我也考虑到在没有网络或网络差的地方进行调试,所以我想尝试一下树莓派WIFI的AP模式信号强度是否足够;最后,我也会继续尝试其余廉价、体积更小的arm板卡。但是因为自己的懒惰和要做的事情太多,所以暂时搁置掉这些想法,有时间我会回来把坑填上的。

六.参考资料

SEGGER J-Link adds support for Raspberry Pi as host

Using a Raspberry Pi as a remote headless J-Link Server

KEIL开发环境使用JLINK远程调试

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐