使用pylink访问SEGGER RTT

2019-01-15  本文已影响0人  tianxiaoMCU
关于SEGGER RTT

具体的描述还是看官网的介绍吧,点这里。一般只用来输出调试日志,偶尔也需要通过它来配置一些参数。虽然segger官方提供了RTT Viewer来查看输出数据,也可以发送数据,类似于精简版的串口调试助手,但毕竟过于简单。某些场景,比如生产测试工具,还是差了不少。本文主要是通过一个例子说明如何访问RTT,从而开发自己需要工具。

关于pylink

pylink是一个用python写的jlink操作库。通过这个库,可以很方便的通过jlink访问目标芯片,从而实现自己的想法。这个库的安装、使用方法,点这里

访问RTT的例子

这个例子通过将写入的数据读回来说明如何访问RTT,这个是需要芯片端程序支持的,固件需要将down buffer里的数据写到up buffer。

import pylink

jlink = pylink.JLink()
jlink.open()
jlink.set_tif(pylink.enums.JLinkInterfaces.SWD) 
jlink.connect('AMAPH1KK-KBR') 

jlink.rtt_start()

print('Please enter rtt write data and click ENTER:')
writedata = input()
jlink.rtt_write(0, [ord(x) for x in list(writedata)])

print()
print('Echo data:')
readdata = ''.join([chr(x) for x in jlink.rtt_read(0, len(writedata))])
print(readdata)

jlink.rtt_stop()

jlink.close()

步骤说明:

读写接口

前面的例子可以看到,pylink提供的读写接口只是单纯的读写数据,需要我们自己进行字符串到列表或者列表到字符串的转换。下面是自己封装的读写接口,其中BUFFER_SIZE_UP需要根据自己的实际情况定义。

def RTT_write_string(link, string, end=b'\r\n'):
    """写字符串到RTT down buffer
    Args:
        link: the ``JLink`` instance
        string: 待写入的字符串
        end: 字符串的结尾,默认使用windows格式,可选项
    Returns:
        成功写入的字节数
    """
    writedata = list(bytearray(string, "utf-8") + end)
    writeindex = 0
    bytes_written = 0
    try:
        if link.target_connected():
            while writeindex < len(writedata):
                bytes_written = link.rtt_write(0, writedata[writeindex:])
                writeindex = writeindex + bytes_written
                time.sleep(0.03)
        return bytes_written
    except pylink.errors.JLinkException:
        return -1


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
其它

pylink要求jlink的驱动版本>= 6.0b,该版本的jlink SDK原生提供了RTT的访问。如果使用5.xx或者更低版本的驱动,可以通过在内存中搜索_SEGGER_RTT并解析它,从而实现RTT的操作。这里分享一个例子

上一篇下一篇

猜你喜欢

热点阅读