通过pylink给jlink-RTT添加时间戳
目前还有一些bug,比如时间戳有时候会加在一行log的中间,有时候又会少一些时间戳,但是log目前没发现出现问题
在使用
pylink
时,需要用到Jlink的dll库,需要将D:\SEGGER\JLink_V766d
文件夹下的JLink_x64.dll
和JLinkARM.dll
拷贝到以下python
脚本的同一路径下
在安装
pylink
的时候要特别注意:我们需要安装的是pylink-square
,可以通过pip install pylink-square
安装,安装完成后可以通过pip list | findstr pylink-square
。(Linux系统下用pip list | grep pylink
)
import pylink
import time
import os
MAX_FILE_SIZE = 200 * 1024 * 1024 # 设置log文件的大小最大为 200MB,如果超过就新建一个文件继续存储
def RTT_read_string(link):
"""从RTT up buffer读取字符串
Args:
link: the ``JLink`` instance
Returns:
读到的字符串
"""
try:
if link.target_connected():
readdata = link.rtt_read(0, BUFFER_SIZE_UP)
if len(readdata) > 0:
readdata = ''.join(map(chr, readdata))
else:
readdata = []
except pylink.errors.JLinkException:
readdata = []
pass
return readdata
jlink = pylink.JLink()
jlink.open()
jlink.set_tif(pylink.enums.JLinkInterfaces.JTAG)
jlink.connect('STM32F302VE')
jlink.rtt_start()
# log 文件以当前时间命名
file_name = "./" + time.strftime("%Y%m%d_%H%M%S", time.localtime()) + ".txt"
fp = open(file_name, "a", newline='\n') # 指定文件换行符为'\n',即只有遇到'\n'才换行(这样遇到'\r\n'时就不会换行两次了)
while True:
try:
rttOut = RTT_read_string(jlink)
if len(rttOut) != 0:
# print(rttOut, end="") # 用于调试,在终端输出,不另外添加换行,因为log中已经包含了换行符
try:
fp.write(time.strftime("[%Y%m%d %H:%M:%S] ", time.localtime()) + rttOut) # 每一条log都加上时间戳
file_stat = os.stat(file_name) # 获取文件大小
if file_stat.st_size > MAX_FILE_SIZE: # 如果文件大于指定大小,就关闭当前文件,并新建一个新的文件用于存储接下来的log
fp.close()
file_name = "./" + time.strftime("%Y%m%d_%H%M%S", time.localtime()) + ".txt"
fp = open(file_name, "a", newline='\n')
except KeyboardInterrupt: # 用Ctrl-C停止接收log
print("keyInterrupt")
fp.close()
jlink.rtt_stop()
jlink.close()
break
except:
# 当固件中调用SEGGER_RTT_SetTerminal()函数切换RTT通道时,这边会多接收到一个非法字符,无法写入到文件,需要通过fp.write(rttOut[1:]) 跳过这个非法字符
fp.write(time.strftime("[%Y%m%d %H:%M:%S] ", time.localtime()) + rttOut[1:])
print("UnKnow")
except KeyboardInterrupt:
print("keyInterrupt")
fp.close()
jlink.rtt_stop()
jlink.close()
break
同一个电脑连接多个JLink的RTT输出
-
打开 RTT,选择通过Serial No 连接:
-
通过 J-Link Commander 获取 Serial No(S/N) 编号,也可以在 MDK 的调试器配置页看到这个编号:
通过 J-SCOPE 查看波形
- 参考:J-SCOPE使用手册
- 说明:J-SCOPE支持两种模式(HSS和RTT);其中HSS高速采样模式是通过导入工程编译生成的相关文件,利用J-Link一致去查询固件中的全局变量的值,速率最大1KHz,固件无需做任何修改;而RTT模式则是固件通过特定的接口,将需要绘制波形的数据主动发出,然后J-SCOPE负责接收和绘制波形,固件需要添加数据发送的代码。