FreeRTOS之Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)

https://blog.csdn.net/ZCShouCSDN/article/details/54670473

  • 大约一个月之前,Tracealyzer for FreeRTOS目前更新到了4.x,新版本不在区分针对哪个系统,而是统一使用 Percepio Tracealyzer这个名称 。而且整个软件也是基本全部重新实现了,且与3.x版本License不兼容。
  • 破解啥的不多说,和3.x基本一样。只是在判断逻辑上有所变化!
2017/12/30
  • Tracealyzer for FreeRTOS目前更新到了3.3.1,其配置稍有改动。

简介

  最近公司搞新项目,需要使用FreeRTOS,之前学的Linux的长时间不用基本忘的差不多了,对于FreeRTOS不是非常了解。在官网转悠的时候发现了有个可视化分析工具:FreeRTOS+Trace,感觉应该不错!下载后发现其是http://percepio.com/这个网站上的东西。到官网看了看,功能确实非常强大!目前,官网最新版为4.1.0 。
Tracealyzer
  不过这个东西是收费的,虽然也提供了免费版本,但是免费版功能确实太少了,只能查看各全局图,没有详细信息!不过,对于个人使用,可以申请30天的评估版License,至于破解啥的,之前也在相关论坛发过破解教程,非常简单,就不多说了!

Trace源码

  想要使用Percepio Tracealyzer,必须将Percepio Tracealyzer的Trace源码放到自己的项目中才可以!安装后在软件的安装目录下会有针对不同系统的Trace源码
Trace
下面我们就以FreeRTOS为例,来说明一下各文件的具体用途。

│  readme.txt
│  trcKernelPort.c
│  trcSnapshotRecorder.c
│  trcStreamingRecorder.c
├─config
│      trcConfig.h                  // 整个Trace源码的配置文件.
│      trcSnapshotConfig.h          // 快照模式配置文件,和流模式对应文件选其一
│      trcStreamingConfig.h         // 流模式配置文件,和快照模式对应文件选其一
├─include
│      trcHardwarePort.h            // 所有硬件依赖关系。包含几个预定义的硬件端口,包括ARM Cortex-M,PIC32,Renesas RX等。
│      trcKernelPort.h              // FreeRTOS特定的定义,最值得注意的是跟踪钩子定义。
│      trcPortDefines.h             // 配置文件的各种常量定义
│      trcRecorder.h                // 公共API,开发者将以上两种模式进行了统一,用户使用时,只需要包含该文件即可!
└─streamports                       // 该文件夹下就是流模式对应的不同接口方式的实现,以下任选其一即可。最新的4.x中又多了几种,这里没有添加
    ├─Jlink_RTT
    │  │  Readme.txt
    │  │  SEGGER_RTT.c
    │  │  SEGGER_RTT_Printf.c
    │  └─include
    │          SEGGER_RTT.h
    │          SEGGER_RTT_Conf.h
    │          trcStreamingPort.h
    ├─TCPIP
    │  │  Readme.txt
    │  │  trcStreamingPort.c
    │  └─include
    │          trcStreamingPort.h
    └─USB_CDC
        │  Readme.txt
        │  trcStreamingPort.c
        └─include
                trcStreamingPort.h

注意:
1. 官网最新的版本是4.1.0,从3.1.0开始,Trace源代码有了很大的改变,源码进行了整合,简洁了很多!
2. FreeRTOS的源码目录下,有个FreeRTOS-Plus目录,其中也有Trace源码,但是该源码也比较旧,不建议使用!
3. 网上现有资料也是针对旧源码的,和官方的User Manual不匹配。

  目前,Percepio Tracealyzer支持两种追踪模式:快照模式(Snapshot Mode)和流模式(Streaming Mode)

快照模式(Snapshot Mode)

  该模式下,将追踪数据放到目标机的RAM中,然后你可以在任何时间读取出来分析显示(就相当于每次都取一次快照)。这种方法具有最小的硬件依赖性,因此可以用于基本上任何32位处理器,只需要有一定的方法(如调试连接或文件系统)可以从目标机获取数据即可。
Snapshot Mode
  快照录制针对内存效率进行了优化,并将事件保存为四字节记录,通常每个事件只使用一个此类记录,包括时间戳记。因此,我们的标准演示应用程序仅在快照模式下生成大约18 KB / s的跟踪数据,平均每个事件少于7个字节。 但是,快照模式中使用的优化可防止流式传输跟踪,因此流模式使用不同的实现和数据格式。

流模式(Streaming Mode)

  在使用流模式时,数据将不断传输到主机PC。 这样,只要您的PC上有磁盘空间,就可以录制。 由于RTOS跟踪产生的数据量是中等的(大约20-200 KB / s),理论上可以记录几天甚至几周的大硬盘驱动器。
  实际上,Percepio Tracealyzer从版本3.1开始受限于PC中RAM的数量。 您可以打开任意大小的跟踪文件,但是如果您的PC耗尽了物理内存,则导致页面交换可能导致加载时间过长以及GUI响应速度较慢。 然而,Percepio Tracealyzer可以在标准PC上加载相当长的痕迹,通常可以处理5-10百万个事件。 这至少需要几分钟的时间,通常是10-30分钟。 此外,Percepio Tracealyzer会检测跟踪文件是否对可用RAM太大,然后发出警告,要求您确认加载跟踪。
  流模式的实施针对速度进行了优化,并且存储事件的速度比针对低内存使用情况高度优化的快照模式快得多。
  目前Percepio Tracealyzer支持Jlink_RTT、 USB CDC、TCP/IP、串口等种方式的流模式(官方将其称为streamports)。

仅适用于 FreeRTOS v7.3 及之后的版本

流模式在ARM-MDK的使用

  Tracealyzer for FreeRTOS默认的模式是快照模式。这里,我以流模式使用Jlink_RTT方式为例来说明。使用的开发板为自己画的,芯片为STM32F407VG。在移植之前,首先确保已将FreeRTOS移植完成,并能正常运行。
  首先对Trace的源代码进行一下整理(个人不喜欢在源码中放一堆实际用不到的文件),以下是我的目录结构:

Trace
│  trcKernelPort.c
│  trcStreamingRecorder.c
├─include
│      trcConfig.h
│      trcHardwarePort.h
│      trcKernelPort.h
│      trcPortDefines.h
│      trcRecorder.h
│      trcStreamingConfig.h
└─streamports
    │  SEGGER_RTT.c
    │  trcStreamingPort.c
    └─include
            SEGGER_RTT.h
            SEGGER_RTT_Conf.h
            trcStreamingPort.h

如果使用的是快照模式,streamports下的代码完全忽略即可。

接下来,在MDK-ARM中建立项目
TraceMDK
(1)将各文件添加到MDK-ARM中,并且设置好MDK-ARM头文件路径(保证FreeRTOS以正常运行)

(2)打开trcConfig.h,修改如下,尤其是加注释的地方,特别注意。其他参数保持默认即可:

#ifndef TRC_CONFIG_H
#define TRC_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

#include "trcPortDefines.h"

/******************************************************************************
 * Include of processor header file
 * 
 * Here you may need to include the header file for your processor. This is 
 * required at least for the ARM Cortex-M port, that uses the ARM CMSIS API.
 * Try that in case of build problems. Otherwise, remove the #error line below.
 *****************************************************************************/
#include "stm32F4xx.h"      // 这里根据需要添加自己的芯片的头文件
//#error "Trace Recorder: Please include your processor´s header file here and remove this line."

/*******************************************************************************
 * Configuration Macro: TRC_CFG_HARDWARE_PORT
 *
 * Specify what hardware port to use (i.e., the "timestamping driver").
 * All ARM Cortex-M MCUs are supported by "TRC_HARDWARE_PORT_ARM_Cortex_M".
 *
 * See trcSnapshotHardwarePort.h or trcStreamingHardwarePort.h for available
 * ports and information on how to define your own port, if not already present.
 ******************************************************************************/
#define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_ARM_Cortex_M        // 选择芯片对应的类型,具体支持的类型见trcStreamingPort.h

/*******************************************************************************
 * Configuration Macro: TRC_CFG_RECORDER_MODE
 *
 * Specify what recording mode to use. Snapshot means that the data is saved in
 * an internal RAM buffer, for later upload. Streaming means that the data is
 * transferred continuously to the host PC. 
 *
 * For more information, see http://percepio.com/2016/10/05/rtos-tracing/
 * and the Tracealyzer User Manual.
 *
 * Values:
 * TRC_RECORDER_MODE_SNAPSHOT
 * TRC_RECORDER_MODE_STREAMING
 ******************************************************************************/
#define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_STREAMING       // 选择追踪模式(默认快照模式,这里我改成了流模式)

/*******************************************************************************
 * Configuration Macro: TRC_CFG_RECORDER_BUFFER_ALLOCATION
 *
 * Specifies how the recorder's internal buffer is allocated (snapshot or
 * streaming). Note that CUSTOM is only supported in snapshot mode.
 *
 * TRC_RECORDER_BUFFER_ALLOCATION_STATIC  - Static allocation 
 * TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC - Allocated in vTraceEnable
 * TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM  - Use vTraceSetRecorderDataBuffer
 ******************************************************************************/
#define TRC_CFG_RECORDER_BUFFER_ALLOCATION TRC_RECORDER_BUFFER_ALLOCATION_STATIC

/******************************************************************************
 * TRC_CFG_FREERTOS_VERSION
 *
 * Specify what version of FreeRTOS that is used (don't change unless using the
 * trace recorder library with an older version of FreeRTOS).
 *
 * TRC_FREERTOS_VERSION_7_3                     If using FreeRTOS v7.3.x
 * TRC_FREERTOS_VERSION_7_4                     If using FreeRTOS v7.4.x 
 * TRC_FREERTOS_VERSION_7_5_OR_7_6              If using FreeRTOS v7.5.0 - v7.6.0
 * TRC_FREERTOS_VERSION_8_X                     If using FreeRTOS v8.X.X
 * TRC_FREERTOS_VERSION_9_0_0                   If using FreeRTOS v9.0.0
 * TRC_FREERTOS_VERSION_9_0_1                   If using FreeRTOS v9.0.1
 * TRC_FREERTOS_VERSION_9_0_2                   If using FreeRTOS v9.0.2
 * TRC_FREERTOS_VERSION_10_0_0                  If using FreeRTOS v10.0.0 or later
 *****************************************************************************/
#define TRC_CFG_FREERTOS_VERSION TRC_FREERTOS_VERSION_10_0_0
// 这里根据自己的FreeRTOS版本修改

/* 这中间还有一大堆,这里省略,通常来说不需要修改。。。 */

/* Specific configuration, depending on Streaming/Snapshot mode */
#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT)
#include "trcSnapshotConfig.h"
#elif (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
#include "trcStreamingConfig.h"
#endif

#ifdef __cplusplus
}
#endif

#endif /* _TRC_CONFIG_H */

(3)注意:由于默认情况下,Keil不支持C99特性,而Trace源码使用了C99特性(C99规定,变量声明可以放到函数的任何位置,而早期C规定,变量定义必须在函数开头)。在Keil中,将C99特性选中,如下图:
Keil修改

如果没有上面的设置,编译时,Keil报错:error: #268: declaration may not appear after executable statement in block.

(4)修改 FreeRTOSConfig.h。FreeRTOS 是一个高度可配置的系统。通常来说,我们只需要修改该配置文件即可,而不用去关注FreeRTOS的其他文件,修改后文件如下(注意图中注释部分):

/* 前面全部省略了... */

/* Trace源码头文件,前面说过,最新的3.1.0版本,Trace源码被统一,简化,使用者只需要包含trcRecorder.h 这一个文件即可!*/
/** @addtogroup Integrates the Tracealyzer recorder with FreeRTOS.
  * @{
  */
/* 以下为使用Percepio Tracealyzer需要的东西,不需要时将 configUSE_TRACE_FACILITY 定义为 0 ,使用时,将 configUSE_TRACE_FACILITY  定义为 1 即可 */
#if ( configUSE_TRACE_FACILITY == 1 )
#include "trcRecorder.h"
#define INCLUDE_xTaskGetCurrentTaskHandle               1   // 启用一个可选函数(该函数被 Trace源码使用,默认该值为0 表示不用)
#endif
/**
  * @}
  */

注意:由于trcRecorder的源码是使用的是旧版本的FreeRTOS,在最新的FreeRTOS中,好多类型都改变了,例如xQueueHandle -> QueueHandle_t。因此,configENABLE_BACKWARD_COMPATIBILITY 必须留空或者定义为 1以兼容旧的FreeRTOS源码。

(5)在main函数中,启用trcRecorder中统一的API即可!启动追踪函数为 vTraceEnable(TRC_INIT)或者vTraceEnable(TRC_START_AWAIT_HOST)。必须在启动FreeRTOS的调度器(vTaskStartScheduler();)之前。

注意:
1. 对于两种模式,trcRecorder中的公共API的传参是有区别的!例如:上面的vTraceEnable函数,在流模式下只能用:TRC_INIT或者TRC_START_AWAIT_HOST
2. 流模式下,使用TRC_START_AWAIT_HOST时,只有收到了主机传来的命令时才开始工作,否则不会有任何额外的开销。

  至此,编译项目(我已经添加了两个任务),现在到开发板即可!打开Tracealyzer for FreeRTOS,如下,现在自己的芯片类型,然后,菜单->file->就可以开始追踪了(以下为3.x的软件)!

测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值