HPM_SDK支持Trace Recorder
引言
HPM_SDK从V1.8.0开始,增加了对Trace Recorder的支持。Trace Recorder是运行在嵌入式处理器上的跟踪系统执行调度的软件,通过通信接口将系统的运行调度信息发送到PC端的上位机软件做分析。借助上位机软件中优秀的图形显示和分析功能,可以获得可视化的跟踪调试功能,加速产品的开发。
主要功能
HPM_SDK目前支持了以下功能:
- FreeRTOS跟踪
- JLink流模式
- 快照模式
- RT Thread跟踪
- JLink流模式
HPM_SDK提供了以下例程供开发者参考:
- samples\trace_recorder\freertos
- samples\trace_recorder\rtthread-nano
使用说明
HPM_SDK配置
HPM_SDK中相关的CMakeLists选项功能如下:
- CONFIG_TRACE_RECORDER:配置为非空值,使能Trace Recorder功能,为功能总开关选项
- CONFIG_TRACE_RECORDER_SNAPSHOT_MODE:配置成非空值,使能Trace Recorder快照模式,目前仅支持FreeRTOS
- CONFIG_TRACE_RECORDER_STREAM_MODE:配置成"JLink RTT",使能Trace Recorder流模式,使用JLink RTT接口通信
配置好CMakeList选项后,需要在源代码中做以下几步:
- FreeRTOS
- 在FreeRTOSConfig.h文件的末尾的#endif前,增加#include "trcRecorder.h"
#if (configHSP_ENABLE == 1 && configRECORD_STACK_HIGH_ADDRESS != 1) #define configRECORD_STACK_HIGH_ADDRESS 1 #endif #include "trcRecorder.h" #endif /* FREERTOS_CONFIG_H */
- 在main函数所在文件中添加#include "trcRecorder.h"
#include "FreeRTOS.h" #include "task.h" #include "trcRecorder.h"
- 在main函数初始化代码中添加xTraceInitialize();和xTraceEnable(TRC_START);
... xTraceInitialize(); xTraceEnable(TRC_START); ... while(1);
- 在FreeRTOSConfig.h文件的末尾的#endif前,增加#include "trcRecorder.h"
- RT Thread
- 在rt_hw_board_init函数所在文件中添加#include "trcRecorder.h"
#include #include #include "trcRecorder.h"
- 在rt_hw_board_init函数中添加xTraceInitialize();和xTraceEnable(TRC_START);
xTraceInitialize(); xTraceEnable(TRC_START); board_init(); rtt_base_init();
- 在rt_hw_board_init函数所在文件中添加#include "trcRecorder.h"
上位机软件
推荐使用Percepio Tracealyzer4作为上位机配合Trace Recorder进行系统跟踪。注:商业应用请向Percepio公司申请商业许可
更新Tracealyzer4的JLink设备支持列表
如果在Tracealyzer4的JLink设备支持列表中找不到相应的HPMicro的SOC,那么可能是因为Tracealyzer4中的JLink_x64.dll版本较低。从Segger官网下载最新的JLink软件,并将其中的JLink_x64.dll复制覆盖掉C:\Program Files\Percepio\Tracealyzer 4中的同名文件即可。
JLink软件下载地址:https://www.segger.cn/downloads/jlink/
JLink软件升级指南:https://kb.segger.com/J-Link_DLL_Updater
JLink RTT模式跟踪
获取JLink RTT控制块地址
打开编译生成的.map文件,搜索_SEGGER_RTT变量,即可获取其地址
gcc的map文件:
segger的map文件:
上位机软件配置
打开tracealyzer4软件,打开stream mode,切换到JLink接口,并在JLink配置中选择目标芯片
配置RTT控制块地址,以及RTT的通道序列号(默认为1)
在控制界面中,开启数据抓取: 依次点击Reset, Halt, Reconnect, Start Session。
然后我们应该就可以看到具体的跟踪数据了。
快照模式
快照模式需要大量的内存存储跟踪的数据,所以在一些内存较小的配置下,此模式可能不被支持,例如当构建方式为ram和flash_xip时。
快照模式下,TraceRecorder将数据存储在内存中,需要将数据导出,然后使用上位机工具进行分析。
获取数据存储的地址
- 打开编译生成的.map文件,搜索RecorderData,即可看到其地址和大小
导出快照数据
使用GDB
首先打开GDB Server(openocd/JLink GDB Sever),使用GDB连接目标,并暂停程序的执行
tar remo :2331
mo halt
dump binary memory target_data.bin {start address of RecorderData} {end address of RecorderData}
然后打开tracealyzer4软件,打开target_data.bin文件即可
使用JLink
打开tracealyzer4软件,打开snapshot模式,切换到JLink接口,并在JLink配置中选择目标芯片
在内存配置中配置RecorderData的首地址和大小
暂停目标程序执行,然后读取数据。
除了tracealyzer4软件外,我们还可以将其采集到的psf数据转换为ctf(common trace format),并借由其他跟踪分析软件进行分析。下面推荐一个用于转换格式的开源工程。
https://github.com/jonlamb-gh/trace-recorder-to-ctf
利用这个开源工程,我们可以使用Trace Compass和babeltrace2等分析工具。