使用串口实现Tracealyzer流跟踪

浏览:1892来源:本站时间:2021-12-09

Tracealyzer的流模式跟踪是通过芯片的通信接口,如JTAG调试接口、串口和USB、以太网口等将跟踪的RTOS事件数据实时的发送到主机端的分析软件,进行实时的记录的显示。相比快照模式,流模式可以长时间跟踪,甚至可以长达几周的时间,只要PC的硬盘空间足够。

Percepio官方提供的几种流端口包括了J-Link RTT,ARM的ITM通信,USB,文件系统和TCP/IP等几种示例的实现。但是这其中没有串口的实现可以参考。

图片

根据Tracealyzer参考手册中的介绍,实现自定义的流端口只需要实现两个宏,分别是TRC_STREAM_PORT_READ_DATA和TRC_STREAM_PORT_WRITE_DATA,用于读取数据和发送数据。一般这两个宏定义在trcStreamingPort.h,宏读写数据的实现放在trcStreamingPort.c。可以从其他流端口的目录下复制这两个文件来进行修改。

图片

trcStreamingPort.h:

图片

TRC_STREAM_PORT_READ_DATA的用途是从流端口读取数据,目的是能接收Tracealyzer主机端软件按下“开始会话”和“结束会话”按钮时发送的命令。读写数据的操作是放在Tracealyzer创建的TzCtl任务中来进行的,所以要让TzCtrl任务能读取到数据只能采用中断或者DMA的方式,将数据先进行缓存或发送到消息队列,当TzCtrl任务执行时再通过TRC_STREAM_PORT_READ_DATA从缓存或消息队列读取。

但官方并没有说明Tracealyzer命令的数据量是多少,也就是说缓存或者队列的应该设多大合适。于是通过串口监视的方式,来获取。

图片

从监视结果可以发现,按下“开始会话”按钮发送的命令的“01 01 00 00 00 00 FD FF”,按下“结束会话”按钮发送的命令是“01 01 00 00 00 00 FE FF”,长度都是8字节。

用一个8字节长度的数组来缓存命令数据,下面是TRC_STREAM_PORT_READ_DATA的实现函数,返回0表示读取成功。使用的是STM32芯片的USART1,波特率最高可达4.5Mbits/s。

图片

命令的接收在串口中断中完成,写入到缓存数组中。

图片

下面是TRC_STREAM_PORT_WRITE_DATA的实现函数,通过传递的事件数据地址和要发送的字节数,按字节读取全部的事件数据并通过串口发送出去,返回0表示发送成功。

图片

串口的流模式实现就完成了,接下来就是测试实际的效果了,打开PC端的Tracealyzer软件,从File->Settings->PSF Streaming Setting选择Target Connect的类型为SerialPort,并根据目标系统串口的波特率和数据格式设置。

图片

然后运行目标系统,在Tracealyzer软件的Live Stream窗口开启跟踪。可以看到数据的传输速率还是比较高的,当然实际的数据量与RTOS系统产生的事件数量和Tracealyzer的配置有关。如果出现事件丢失的情况,可以使用更高的波特率,或者通过Tracealyzer记录器库的配置宏,禁用一些事件的记录,减少事件的产生。

图片图片

在没有使用DMA的情况下,利用串口实现流模式会占用比较多的CPU时间,如果是系统负载比较重的情况下比较容易出现事件丢失,这时候建议启用DMA来发送数据。



京ICP备:京ICP备05011254号-1 版权归北京麦克泰软件技术有限公司所有
北京麦克泰软件技术有限公司