JLink等仿真器相关(J-Link, RTT, J-SCOPE)

这篇博客介绍了如何使用Python的pylink库为JLink-RTT日志添加时间戳。文章详细阐述了在Windows环境下配置JLink DLL库,并通过pylink-square库进行JTAG连接和RTT读取。作者提到了在实施过程中遇到的时间戳位置不准确的bug,并给出了解决方案。同时,展示了如何根据文件大小滚动日志文件。在遇到键盘中断时,程序会停止接收log并关闭连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过pylink给jlink-RTT添加时间戳

参考链接

目前还有一些bug,比如时间戳有时候会加在一行log的中间,有时候又会少一些时间戳,但是log目前没发现出现问题

在使用pylink时,需要用到Jlink的dll库,需要将D:\SEGGER\JLink_V766d文件夹下的JLink_x64.dllJLinkARM.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输出

  1. 打开 RTT,选择通过Serial No 连接:
    在这里插入图片描述

  2. 通过 J-Link Commander 获取 Serial No(S/N) 编号,也可以在 MDK 的调试器配置页看到这个编号:
    在这里插入图片描述

通过 J-SCOPE 查看波形

  1. 参考:J-SCOPE使用手册
  2. 说明:J-SCOPE支持两种模式(HSS和RTT);其中HSS高速采样模式是通过导入工程编译生成的相关文件,利用J-Link一致去查询固件中的全局变量的值,速率最大1KHz,固件无需做任何修改;而RTT模式则是固件通过特定的接口,将需要绘制波形的数据主动发出,然后J-SCOPE负责接收和绘制波形,固件需要添加数据发送的代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值