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

2020/5/19
  • 更新了在使用 4.3.8 时遇到的一些问题说明
2018/5/16
  • 大约一个月之前,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.3.8,支持最新的 FreeRTOS 10.3.1 。
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.3.8,从 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 上有磁盘空间,就可以不停的缓存终端发回的跟踪数据,并被保存为 .psf 的文件。 由于RTOS 跟踪产生的数据量是中等的(大约20-200 KB / s),理论上可以记录几天甚至几周的大硬盘驱动器。
  针对于缓存的跟踪数据文件(.psf 文件),Percepio Tracealyzer 从版本 3.1 开始受限于 PC 中 RAM 的容量。 您可以打开任意大小的跟踪文件,但是如果您的PC 耗尽了物理内存,则导致页面交换可能导致加载时间过长以及 GUI 响应速度较慢。 然而,Percepio Tracealyzer 可以在标准 PC 上加载相当大的跟踪数据文件,通常可以处理 5-10 百万个事件。 这至少需要几分钟的时间,通常是 10-30 分钟。 此外,Percepio Tracealyze r会检测跟踪文件是否对可用 RAM 太大,然后发出警告,要求您确认加载跟踪。
  流模式的实施针对速度进行了优化,并且存储事件的速度比针对低内存使用情况高度优化的快照模式快得多。

streamports

  streamports 是一组宏,这些宏定义了记录器(即需要移植到自己项目中的 Trace 源码)应如何将跟踪数据写入流接口以及如何从 Percepio Tracealyzer 读取命令(启动/停止)。 记录器包括几个预定义的 streamports,这些 streamports 可以在安装目录下的streamports 目录中找到。
  我们还可以创建自己的 streamport,以利用系统中任何合适的通信接口。 官方有一篇博客来具体介绍了这一部分,地址:https://percepio.com/2016/10/05/rtos-tracing/ 。
  官方提供的各 streamports,在我们使用时需要进行一定的配置,这部分手册中有很详细的说明,如下图:
在这里插入图片描述
这里就不过多介绍了!

  1. 仅适用于 FreeRTOS v7.3 及之后的版本
  2. 目前默认提供了 Jlink_RTT、 USB CDC、TCP/IP 等种方式的示例程序
    在这里插入图片描述
  3. 上图为针对 FreeRTOS 系统的,如果使用其他系统,上面的 streamports 可能不同

流模式在 ARM-MDK 的使用

  Tracealyzer 默认的模式是快照模式。这里,我以流模式使用 Jlink_RTT 方式为例来说明。使用的开发板为自己画的,芯片为 STM32F407VG 和 STM32L476VC。在移植之前,首先确保已将 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 表示不用)。最新的 4.3.8,FreeRTOS 10.3.1 不再需要,直接删除即可
#endif
/**
  * @}
  */

注意:

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

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

(6)配置 PC 端的软件。
在这里插入图片描述

注意:

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

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

测试

问题

  1. 如果 Jink 设置的速度过慢将导致出现大量丢包。官方博客 https://percepio.com/2018/02/19/problems-j-link-rtt-streaming/ 有介绍如何处理
  2. 旧的 Trace 源码可能不支持最新版的 FreeRTOS

附件

STM32_FreeRTOS_Tracealyzer

  • 17
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
lvgl是一个开源的图形库,用于嵌入式系统的图形界面开发。而FreeRTOS是一个流行的实时操作系统,用于嵌入式系统的任务调度和管理。将lvgl与FreeRTOS进行移植,可以在嵌入式系统上实现图形界面和多任务的功能。 移植lvgl+FreeRTOS的步骤如下: 1. 配置硬件平台:根据目标硬件平台的特性,配置相应的驱动和外设支持。例如,配置显示屏驱动、触摸屏驱动等。 2. 配置FreeRTOS:根据目标硬件平台的资源和需求,配置FreeRTOS的内核参数,如任务堆栈大小、任务优先级等。 3. 移植lvgl:将lvgl的源代码添加到项目中,并根据目标硬件平台的特性进行适配。主要包括以下几个方面: - 配置显示驱动:根据硬件平台的显示屏特性,实现lvgl的显示驱动接口。 - 配置输入设备驱动:根据硬件平台的输入设备特性,实现lvgl的输入设备驱动接口,如触摸屏驱动。 - 配置定时器:lvgl需要定时器来进行刷新和动画效果的处理,需要配置定时器中断。 - 配置内存管理:lvgl需要内存管理来进行图形对象的创建和销毁,需要配置内存管理接口。 4. 编写应用程序:在FreeRTOS的任务中,使用lvgl的API来创建图形界面和处理用户交互。可以使用lvgl提供的控件、样式和动画效果来设计界面。 5. 编译和调试:将移植好的代码编译生成可执行文件,并下载到目标硬件平台上进行调试和测试。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZC·Shou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值