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中如下

CubeMx FreeRTOS Trace

二、部署SystemView下位机代码

1.下载资源

接下来下载SystemView上位机软件和下位机代码

下位机代码下载链接

Windows64位上位机下载链接

原下载页

2.为项目添加代码

下位机源码目录主要分为三部分,config配置相关头文件,sample根据目标系统自行选择,SEGGER实现Segger RTT技术的核心代码

在项目根目录下新建Analyze文件夹,并将如上三个文件夹复制到其中,因为我们的目标系统是FreeRTOS,所以sample目录中可以只保留FreeRTOSV10文件夹

目录示意

这里我们在Keil中为项目新建一个组任意命名,并向其中添加如下文件

keil项目组织示意

前两个文件位于SEGGER文件夹中,后两个文件可以在sample/FreeRTOSV10和sample/FreeRTOSV10/config文件夹内找到

3.为项目添加Include路径

keil设置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

录制设置

如下设置一般无需改动即可使用

Jlink设置

启动录制后即可观测到数据

开始录制数据

四、参考内容

FreeRTOS with SystemView

Configuring FreeRTOS for SystemView

文章作者:四文鱼Max

本文链接:https://blog.awolon.fun/archives/stm32-cubemx-freertos-systemview.html

许可协议:CC BY-SA 4.0

标签: none

已有 2 条评论

  1. Keten

    我想问的就是可不可以换成cmsis dap 进行调试而不是使用j-link,因为我打开软件时发现它说我没有cmsis -dap 的license ,所以我想是不是可以去得到它的 license ,就可以用 cmsis dap调试了

    1. 四文鱼Max

      systemview使用的底层技术是segger rtt,该技术只支持jlink,如果使用dap可以尝试下pyocd

添加新评论