STM32 为CubeMX FreeRTOS项目添加Segger SystemView支持
SystemView是Segger官方出品的嵌入式操作系统观测软件,仅需使用JLink与嵌入式设备连接,在目标设备上添加下位机代码即可监视包括但不限于FreeRTOS等操作系统,同时也支持裸机程序,最终能够实现观测系统运行事件,任务时间线,任务详细信息统计(阻塞,运行时间,CPU占用率,栈使用信息)等等非常丰富的监控内容。
系统环境:
- 目标芯片:STM32F103RCT6
- CubeMX版本:6.7.0
- Keil版本:5.36
- FreeRTOS版本:10.0.1
- SystemView版本:3.50a
本文目标为Segger SysteView自动监测的配置,即打开软件开始监测,监测时长受限与本地计算机磁盘大小,另外两种方式分别为single-shot和持续录制的模式,前者需要手动指定segger事件记录缓冲区大小,记录满后会停止记录,后者也需要指定缓冲区大小,但是区别在于记录满后会覆写旧数据,该循环覆写模式特别适合记录系统死机、崩溃、异常等问题发生前的系统活动,但在本文中不再详细讲解如何配置。
一、CubeMX FreeRTOS项目设置
为了能让SystemView使用FreeRTOS相关API,需要开启FreeRTOS Trace功能,该功能位于CubeMX中如下
二、部署SystemView下位机代码
1.下载资源
接下来下载SystemView上位机软件和下位机代码
2.为项目添加代码
下位机源码目录主要分为三部分,config配置相关头文件,sample根据目标系统自行选择,SEGGER实现Segger RTT技术的核心代码
在项目根目录下新建Analyze文件夹,并将如上三个文件夹复制到其中,因为我们的目标系统是FreeRTOS,所以sample目录中可以只保留FreeRTOSV10文件夹
这里我们在Keil中为项目新建一个组任意命名,并向其中添加如下文件
前两个文件位于SEGGER文件夹中,后两个文件可以在sample/FreeRTOSV10和sample/FreeRTOSV10/config文件夹内找到
3.为项目添加Include路径
根据个人文件夹命名添加最后三个路径,至此所有文件已经添加完成。
4.Patch文件应用(可选)
针对FreeRTOS Segger下位机软件包内还包含了可额外跟踪调度器调度时间监测的patch文件,需要改动两个头文件和一个c文件,据我在STMF103RCT6平台上72Mhz速度运行测试FreeRTOS调度器耗时一般在几十微秒内,如无需跟踪该数据可以不用使用该Patch文件。
使用CubeMX生成项目使用FreeRTOSV10_Core.patch文件
需要更改的文件路径如下
Middlewares\Third_Party\FreeRTOS\Source\include
|-FreeRTOS.h
|-task.h
Middlewares\Third_Party\FreeRTOS\Source
|-tasks.c
请自行按照该Patch文件内增删内容修改
5.代码配置
(可选项)在SEGGER_SYSVIEW_Config_FreeRTOS.c文件中可以配置APP name,device name
/*********************************************************************
*
* Defines, configurable
*
**********************************************************************
*/
// The application name to be displayed in SystemViewer
#define SYSVIEW_APP_NAME "FreeRTOS Sysview"
// The target device name
#define SYSVIEW_DEVICE_NAME "Cortex-M3"
// Frequency of the timestamp. Must match SEGGER_SYSVIEW_GET_TIMESTAMP in SEGGER_SYSVIEW_Conf.h
#define SYSVIEW_TIMESTAMP_FREQ (configCPU_CLOCK_HZ)
// System Frequency. SystemcoreClock is used in most CMSIS compatible projects.
#define SYSVIEW_CPU_FREQ configCPU_CLOCK_HZ
// The lowest RAM address used for IDs (pointers)
#define SYSVIEW_RAM_BASE (0x10000000)
在FreeRTOSConfig.h文件内添加SEGGER_SYSVIEW_FreeRTOS.h头文件
/* USER CODE BEGIN Includes */
/* Section where include file can be added */
#include "SEGGER_SYSVIEW_FreeRTOS.h"
/* USER CODE END Includes */
/* Ensure definitions are only used by the compiler, and not by the assembler. */
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
在main.c内添加SEGGER_SYSVIEW.h头文件并在osKernelInitialize()操作系统初始化之前调用SEGGER_SYSVIEW_Conf()函数
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h" // Printf功能
#include "SEGGER_SYSVIEW.h" // 初始化SEGGER_SYSVIEW_Conf系统观测
#include "lcd.h" // 初始化LCD
#include "uart.h" // 初始化串口空闲中断接收
#include "light.h" // 初始化PWM输出
/* USER CODE END Includes */
.
.
.
/* USER CODE BEGIN 2 */
SEGGER_SYSVIEW_Conf();
uartIdleRecv();
lcdInit();
lightOn();
/* USER CODE END 2 */
/* Init scheduler */
osKernelInitialize(); /* Call init function for freertos objects (in freertos.c) */
MX_FREERTOS_Init();
6.(2023/3/31日更新)跟踪系统ISR进出事件
只需在使用了中断回调函数的文件中包含SEGGER_SYSVIEW.h头文件
并在中断回调函数的开头和结尾分别放置如下代码,即可跟踪中断事件,用来统计进中断次数,时长等特别方便。
SEGGER_SYSVIEW_RecordEnterISR();
SEGGER_SYSVIEW_RecordExitISR();
SEGGER_SYSVIEW.h头文件中还有很多可跟踪的事件项,以下例举一部分例如定时器等,请自行查看注释
void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString);
void SEGGER_SYSVIEW_RecordSystime (void);
void SEGGER_SYSVIEW_RecordEnterISR (void);
void SEGGER_SYSVIEW_RecordExitISR (void);
void SEGGER_SYSVIEW_RecordExitISRToScheduler (void);
void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId);
void SEGGER_SYSVIEW_RecordExitTimer (void);
三、使用SystemView上位机观测操作系统
在上位机软件中设置录制工具,选择Jlink
如下设置一般无需改动即可使用
启动录制后即可观测到数据
四、参考内容
文章作者:四文鱼Max
本文链接:https://blog.awolon.fun/archives/stm32-cubemx-freertos-systemview.html
许可协议:CC BY-SA 4.0
我想问的就是可不可以换成cmsis dap 进行调试而不是使用j-link,因为我打开软件时发现它说我没有cmsis -dap 的license ,所以我想是不是可以去得到它的 license ,就可以用 cmsis dap调试了
systemview使用的底层技术是segger rtt,该技术只支持jlink,如果使用dap可以尝试下pyocd