第5章 Tracealyzer集成和配置指南 5.1Tracealyzer实验1Tracealyzer介绍 本节是一个安装指南,帮助用户在运行FreeRTOS的STM32F4微控制器上集成和配置Tracealyzer。这部分内容能够让项目正常运行起来。 首先,下载和安装Tracealyzer for FreeRTOS版本,请访问: https://percepio.com/tz/freertostrace/和https://percepio.com/downloads/。 译者注: Tracealyzer新版本安装程序不划分RTOS。本书实验作者和译者使用的是Tracealyzer v4.3.4版本。 软件安装完成之后,需要执行4个关键操作,以确保工具配置成功。 (1) 将Percepio 跟踪记录器库(Trace Recorder Library)加入项目。 (2) 将FreeRTOS与Tracealyzer记录器集成。 (3) 配置CubeMX项目以满足Tracealyzer工具要求。 (4) 修改项目源码来初始化并启动跟踪记录。 可以在下面的网址找到详细资料: https://percepio.com/docs/FreeRTOS/manual。 如果手册的内容与本书有出入,请以手册的信息为准。此外,对Tracealyzer工具升级也可能造成内容冲突。注意: Tracealyzer实验相关的代码文件及Tracealyzer捕获截图文件将发布在www.hexiaoqing.net图书栏目,读者可以参考。 5.2集成跟踪记录器库 5.2.1将记录器库添加到项目 记录器库的详细资料载于: https://percepio.com/docs/FreeRTOS/manual/Recorder.html#。 图5.1跟踪记录器库的内容 记录器库作为Tracealyzer的一部分,存在于独立的文件夹中,如图5.1所示,通常安装在C:\Program Files\Percepio\Tracealyzer 4\FreeRTOS。 从图5.1中可以看到,记录器库包含3个关键源文件,另外2个关键的目录是config和include (暂时忽略streamports文件夹),其详细内容如图5.2所示。 需要将config、include目录,以及源文件添加到项目适当的位置,这没有统一的操作方法,取决于个人的选择和项目使用的IDE。不过,在项目中必须看得到所有的记录库文件。同样地,具体的实现依赖于特定的项目。图5.3给出了Lab2项目的文件目录结构,该项目使用Keil μVision IDE。 图5.2详细的跟踪记录器库内容 图5.3示例项目文件结构 5.2.2为应用配置库文件 如图5.2所示,config目录下有3个配置文件。在第一部分实验中,我们会使用快照模式。因此,暂时忽略trcStreamingConfig.h。对于trcSnapshotConfig.h文件,使用默认设置即可,目前不需要修改。但是,需要根据特定的项目修改trcConfig.h。 请阅读以下文档,了解相关的配置信息: https://percepio.com/docs/FreeRTOS/manual/Recorder.html#config; https://percepio.com/docs/FreeRTOS/manual/Recorder.html#tracedetails。 作为一个快速参考,下面列出的项目1、2和3需要在trcConfig.h中更新。 项目 1 - 配置前 /******************************************************************** * 包含处理器头文件 * * 这里可能需要包含处理器的头文件,至少对于使用ARM CMSIS API的ARM Cortex-M 的移植 * 需要,在遇到构建问题时可以尝试,否则,移除下面的#error行 ******************************************************************/ #error "Trace Recorder: Please include your processor's header file here and remove this line." /******************************************************************* 项目 1 - 配置后 ******************************************************************/ //#error "Trace Recorder: Please include your processor's header file here and remove this line." #include "stm32f4xx.h" /****************************************************************** 项目 2 - 配置前 /******************************************************************* Configuration Macro: TRC_CFG_HARDWARE_PORT *******************************************************************/ #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_NOT_SET /******************************************************************* 项目2 - 配置后 *******************************************************************/ //#define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_NOT_SET #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_ARM_Cortex_M /******************************************************************* 项目3配置系统使用FreeRTOS版本。你需要确认使用的FreeRTOS版本,到Middlewares(见图5.4)目录中的FreeRTOS下的include文件夹,打开task.h,并找到MACROS AND DEFINITIONS,确认FreeRTOS的版本来配置项目3。 项目 3 - 配置前 /******************************************************************* * TRC_CFG_FREERTOS_VERSION * *指定使用哪个版本的 FreeRTOS,不用更改,除非使用老版本的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 /******************************************************************* 项目 3 - 配置后 *******************************************************************/ #define TRC_CFG_FREERTOS_VERSION TRC_FREERTOS_VERSION_10_0_1 图5.4Middlewares文件(部分) 5.3在FreeRTOS中启用Tracealyzer记录器 在FreeRTOSConfig.h文件中有一个用于跟踪记录器的主开关。为了确保启用记录器,请检查是否包含以下设置: #define configUSE_TRACE_FACILITY 1 注意: 如果此设置为0,则跟踪记录器将完全被禁用并从构建中排除。 检查下面的内容是否已经插入FreeRTOSConfig.h文件最后的用户定义部分。 ////////////////////////////////// /*将 Tracealyzer 记录器与FreeRTOS 集成*/ #if(configUSE_TRACE_FACILITY == 1) #include "trcRecorder.h" #endif //////////////////////////////////// /* USER CODE END Defines */ 5.4配置CubeMX项目以符合工具需求 在CubeMX的FREERTOS Mode and Configuration区域的Config Parameters面板做以下设置: (1) 将每个任务的最小堆栈大小设置为512。 (2) 将heap的大小设置为32000。 (3) 将USE_TRACE_FACILITY设置为Enabled。 5.5初始化/启动跟踪记录 Tracealyzer有两种记录模式: 快照(Snapshot)和数据流(Streaming)模式。具体信息参见下面的网址: https://percepio.com/docs/FreeRTOS/manual/Recorder.html#Trace_Recorder_Library_Snapshot_Mode; https://percepio.com/docs/FreeRTOS/manual/Recorder.html#Trace_Recorder_Library_Streaming_Mode。 5.5.1快照跟踪模式 本节简要说明如何配置源代码使用快照模式。这个过程很简单,首先初始化系统,然后启动跟踪记录器。 (1) 初始化并开始记录。 在main函数中调用vTraceEnable(TRC_START)。 (2) 初始化记录器,稍后开始跟踪。 首先在main函数中调用vTraceEnable(TRC_INIT); 初始化记录器。然后在代码中需要的位置调用vTraceEnable(TRC_START),启动跟踪。 注意: TRC_INIT调用必须在初始硬件设置之后,在创建任何RTOS对象(任务等)之前执行。初始化和跟踪的详细说明可以参考Tracealyzer手册中相应的内容,Tracealyzer for FreeRTOS链接为https://percepio.com/docs/FreeRTOS/manual/Recorder.html#vtraceenab。 int main(void) { /* 重置所有外设, 初始化Flash接口和Systick */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /*用户代码开始- 系统初始化*/ vTraceEnable(TRC_INIT); vTraceEnable(TRC_START); /* 用户代码结束- 系统初始化 */ /* 初始化所有已配置的外设 */ MX_GPIO_Init(); /* 创建任务 */ /* 定义并创建LedFlashing任务 */ osThreadDef(LedFlashingTask, StartLedFlashingTask, osPriorityNormal, 0, 512); LedFlashingTaskHandle = osThreadCreate(osThread(LedFlashingTask), NULL); /* 启动调度器 */ osKernelStart(); 如果在应用测试期间复位开发板,启动Tracealyzer记录,将捕获TraceEnable调用之后发生的事件。每当你想重新记录时,请执行复位操作。 若在某些情况下希望从任务中选定的点开始记录,推荐的方法是首先初始化记录器,之后再开始记录,如下面的代码片段所示: myBoardInit(); /*仅初始化,之后再开始记录*/ vTraceEnable(TRC_INIT); ... /* RTOS 调度器启动 */ vTaskStartScheduler(); ... /* 在任务或者中断中 */ vTraceEnable(TRC_START); 5.5.2流跟踪模式 在源代码中插入如下调用: vTraceEnable(TRC_START_AWAIT_HOST); 由此,在运行时(在记录器初始化之后),目标系统在此等待来自主机系统的开始命令。 示例代码片段如下: myBoardInit(); ... /* 启动之后阻塞,等待主机开始命令 */ vTraceEnable(TRC_START_AWAIT_HOST); ... /* RTOS调度器启动 */ vTaskStartScheduler(); 稍后将在第7章的Tracealyzer实验7中详细地讨论这个话题。 5.6附加检查 1. 跟踪时间控制 在trcConfig.h中设置TRC_CFG_INCLUDE_OSTICK_EVENTS宏,确定记录多少事件。如果是1,每当OS时钟增加时,都会产生事件。如果是0,不会生成OS Tick事件,允许在相同的RAM中记录更长时间的跟踪。默认值是1,在接下来的大多数实验中,它被设置为0。 2. 设置快照模式中可以存储的事件数量 在trcSnapshotConfig.h中,TRC_CFG_EVENT_BUFFER_SIZE宏定义事件缓冲区的容量。默认值是1000(单位为字),意味着为事件缓冲区分配了4000字节。 #define TRC_CFG_EVENT_BUFFER_SIZE 1000 如果希望记录更长的跟踪,请增大此值(可设置的最大值取决于下载的应用程序代码所使用的内存空间)。