HPM SDK SEGGER SystemView 使用指南
HPM SDK SEGGER SystemView 使用指南
目录
- 概述
- SystemView 简介
- HPM SDK 中的 SystemView 支持
- 快速开始
- HPM_SDK示例详解
- 工程调试
- 在现有工程中使能 SystemView
- 技术细节
- SystemView API 使用
- 常见问题
- 参考资源
概述
本文档介绍如何在 HPM SDK 中使用 SEGGER SystemView 进行实时系统分析和调试。SystemView 是一款强大的实时系统分析工具,可以帮助开发者深入了解嵌入式系统的运行状态,优化系统性能。
SystemView 简介
什么是 SystemView
SEGGER SystemView 是一款针对嵌入式系统的实时可视化分析工具。它通过 J-Link 调试器与目标设备通信,实时采集并显示系统运行时的各种事件,包括:
- 任务调度信息
- 中断处理过程
- RTOS API 调用
- 用户自定义事件
- 内存使用情况
SystemView 通过 RTT(Real Time Transfer)技术与目标设备通信,对系统性能的影响极小,非常适合实时系统的性能分析和调试。
主要功能
| 功能 | 描述 |
|---|---|
| 任务分析 | 显示任务执行时间、状态变化、优先级等信息 |
| 中断分析 | 记录中断发生、执行时间、中断嵌套等 |
| 时序图 | 以时间线方式展示任务切换、中断和用户事件 |
| CPU 负载 | 统计各任务和中断的 CPU 使用率 |
| 用户事件 | 支持用户自定义消息和标记 |
| 标记(Marker) | 用于测量代码执行时间 |
应用场景
- 实时性能分析:找出系统中的性能瓶颈
- 任务调度优化:分析任务优先级设置是否合理
- 中断延迟分析:测量中断响应时间和执行时间
- 死锁和优先级反转:定位 RTOS 同步问题
- 代码执行时间测量:精确测量关键代码段的执行时间
HPM SDK 中的 SystemView 支持
支持的操作系统
HPM SDK 的 SystemView 中间件支持以下系统:
| 系统 | 描述 |
|---|---|
| FreeRTOS | 支持 FreeRTOS V10/V11 版本 |
| uC/OS-III | 支持 Micrium uC/OS-III |
| Baremetal | 支持无操作系统的裸机程序 |
目录结构
HPM SDK 中 SystemView 相关的源码和示例组织结构如下:
hpm_sdk/
├── middleware/
│ └── segger_sysview/ # SystemView 中间件
│ ├── SYSVIEW/ # SystemView 核心源码
│ │ ├── SEGGER_SYSVIEW.c
│ │ ├── SEGGER_SYSVIEW.h
│ │ └── ...
│ ├── Config/ # 配置文件
│ │ ├── Baremetal/ # 裸机配置
│ │ ├── FreeRTOS/ # FreeRTOS 配置
│ │ ├── uCOS-III/ # uC/OS-III 配置
│ │ ├── SEGGER_SYSVIEW_Config.c
│ │ └── SEGGER_SYSVIEW_Conf_Def.h
│ └── README.md
│
└── samples/
└── segger_sysview/ # SystemView 示例
├── baremetal/ # 裸机示例
├── freertos/ # FreeRTOS 示例
└── ucos_iii/ # uC/OS-III 示例
快速开始
硬件要求
- HPM 开发板
- J-Link 调试器(如果开发板没有板载 J-Link,需要外接)
- 如有板载调试器且非 J-Link,需要将其断开(TRST/TCK/TMS/TDI/TDO
软件要求
- HPM SDK v1.11.0 或更高版本
- SEGGER J-Link 软件(V7.50 或更高版本)
- SEGGER SystemView 软件(V3.62 或更高版本)
- 下载地址:https://www.segger.com/downloads/systemview
- SEGGER Embedded Studio 软件
工程示例演示
目前HPM_SDK共提供3个SYSVIEW使用的示例:
- samples/segger_sysview/freertos
- samples/segger_sysview/ucos_iii
- samples/segger_sysview/baremetal
分别用于演示freeRTOS/uCOS-III/Bare和MetalSYSVIEW的使用,本文档基于HPM5300EVK开发板和freeRTOS系统进行基本的编译和SYSVIEW软件使用介绍。
- 编译示例工程
- 打开start_gui.exe软件,选择hpm5300evk开发板
- 选择segger_sysview/freertos示例
- Generate生成代码工程
- 选择Open with IDE(SES)通过SEGGER Embedded Studio打开代码工程
- SEGGER Embedded Studio编译工程
- 获取编译后RTT Control Block运行时地址,以备后续步骤使用

- 启动 SystemView 软件
- 启动SystemView软件
- File->New Project新建工程并保存,Next进入下一步

- 选择SYSVIEW使用的通信设备

- 选择目标芯片配置及RTT Control Block,点击Finihs完成工程撞见

- 开始记录
- 确保Target上已经启动并执行了SystemView相关功能
- SystemView是基于SEGGER RTT获取Trace数据的,所以打开SystemView开始记录时,SystemView会通过j-link在芯片RAM中寻找RTT Control Block的信息。这样就要求芯片内的运行程序已经启动Sysview功能,比如下面代码必须已经执行完成,这样就相当于Target在RAM构建了完整的RTT Control Block和SystemView运行时,SystemView软件才能通过J-link从RAM中获取相关信息:
SEGGER_SYSVIEW_Conf();
SEGGER_SYSVIEW_Start();
- 在SystemView软件启动并记录

- 正确启动后,Sysview软件显示获取到的事件列表

工程调试
SystemView和SEGGER Embedded Studio软件可以同时运行,即SEGGER Embedded Studio进行debug的时候, SystemView软件可以实时记录事件。
正常下载并运行
使能了SystemView功能的程序,编译后已通过任意下载工具进行下载,如:
- HPMicro_Manufacturing_Tool
- J-link flash
下载后复位开发板程序运行,程序运行后会初始化SYSVIEW相关的功能,即会在Soc的RAM或者板载的SDRAM上构建RTT Control Block,这样SystemView可以通过J-link连接到Soc。
带有SYSVIEW功能的程序,可以通过GCC/IAR/SEGGER Embedded Studio任意工具进行编译,编译后的固件正常下载并运行即可。
SEGGER Embedded Studio在线调试
相比于直接下载固件,使用SEGGER Embedded Studio可以在SystemView打开记录的的情况在线调试程序。

同时调试注意事项
- 确保Soc中SysView初始化程序已经执行,即SEGGER_SYSVIEW_Start()必须被执行完成
- 出现同时调试失败的情况
- 确认RTT Control Block发否正确
- 关闭在线调试,重新下载程序并复位,确保Soc程序正确运行,关闭SEGGER Embedded Studio时SystemView软件可以正常记录。
- 保证步骤2正常的情况下,保持SystemView软件记录开启状态,启动SEGGER Embedded Studio启动调试
- 如果仍然存在问题,关闭所有软件,重新插拔J-Link
HPM_SDK示例详解
Baremetal 示例
裸机示例展示了在没有 RTOS 的情况下如何使用 SystemView 进行基本的系统分析。
示例代码说明
include "SEGGER_RTT.h"
include "SEGGER_SYSVIEW.h"
int main(void)
{
board_init();
/ RTT Init (optional) /
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
SEGGER_RTT_printf(0, "RTT: SEGGER SYSVIEW example");
/ SYSVIEW Init /
SEGGER_SYSVIEW_Conf();
SEGGER_SYSVIEW_Start();
SEGGER_SYSVIEW_Print("SYSVIEW: SEGGER SYSVIEW example");
/ System Description (optional) /
char desc[32];
sprintf(desc, "I#%d=GPTMR_IRQ(%d)", APP_BOARD_GPTMR_IRQ, APP_BOARD_GPTMR_IRQ);
SEGGER_SYSVIEW_SendSysDesc(desc);
/ Mark Test - 用于测量代码执行时间 /
SEGGER_SYSVIEW_NameMarker(MARK_ID_HPM_DELAY, "HPM Delay Mark");
SEGGER_SYSVIEW_MarkStart(MARK_ID_HPM_DELAY);
board_delay_ms(10);
SEGGER_SYSVIEW_Mark(MARK_ID_HPM_DELAY);
board_delay_ms(5);
SEGGER_SYSVIEW_MarkStop(MARK_ID_HPM_DELAY);
/ Interrupt Test /
output_compare_config();
enable_mchtmr_irq();
mchtmr_delay(HPM_MCHTMR, 1);
while (1) {
}
return 0;
}
关键 API 说明
| API | 功能 |
|---|---|
| SEGGER_SYSVIEW_Conf() | 初始化 SystemView |
| SEGGER_SYSVIEW_Start() | 开始记录事件 |
| SEGGER_SYSVIEW_Print() | 发送字符串消息到主机 |
| SEGGER_SYSVIEW_SendSysDesc() | 发送系统描述信息 |
| SEGGER_SYSVIEW_NameMarker() | 命名一个标记 |
| SEGGER_SYSVIEW_MarkStart/Mark/MarkStop() | 标记操作,用于测量时间 |
CMakeLists.txt 配置
set(CONFIG_SEGGER_RTT 1)
set(CONFIG_SEGGER_SYSVIEW 1)

FreeRTOS 示例
FreeRTOS 示例展示了如何在 FreeRTOS 项目中使用 SystemView 进行任务调度分析和中断跟踪。
示例代码说明
include "FreeRTOS.h"
include "task.h"
include "semphr.h"
include "SEGGER_RTT.h"
include "SEGGER_SYSVIEW.h"
static void task1(void *pvParameters)
{
for (;;) {
SEGGER_SYSVIEW_PrintfHostEx("task1", SEGGER_SYSVIEW_LOG);
vTaskDelay(100);
}
}
static void task2(void *pvParameters)
{
for (;;) {
gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
SEGGER_SYSVIEW_PrintfHostEx("Toggle the led pin level.", SEGGER_SYSVIEW_LOG);
vTaskDelay(500);
}
}
int main(void)
{
board_init();
/ RTT Init /
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
/ SYSVIEW Init /
SEGGER_SYSVIEW_Conf();
SEGGER_SYSVIEW_Start();
/ Create tasks /
xTaskCreate(task1, "task1", configMINIMAL_STACK_SIZE + 256U, NULL, task1_PRIORITY, NULL);
xTaskCreate(task2, "task2", configMINIMAL_STACK_SIZE + 256U, NULL, task2_PRIORITY, NULL);
vTaskStartScheduler();
for (;;) {
}
return 0;
}
FreeRTOSConfig.h 配置
在 FreeRTOSConfig.h 文件末尾添加以下内容,以启用 SystemView 的任务跟踪功能:
ifdef CONFIG_SEGGER_SYSVIEW
include <SEGGER_SYSVIEW_FreeRTOS.h>
endif
这个头文件定义了一系列 trace 宏,用于在 FreeRTOS 内部记录任务创建、切换、删除等事件。
CMakeLists.txt 配置
set(CONFIG_SEGGER_RTT 1)
set(CONFIG_SEGGER_SYSVIEW 1)
set(CONFIG_FREERTOS 1)
可记录的事件
通过 SystemView,可以看到以下 FreeRTOS 事件:
| 事件类型 | 描述 |
|---|---|
| Task Create/Delete | 任务创建和删除 |
| Task Switch | 任务切换 |
| Task Ready | 任务进入就绪状态 |
| Task Delay | 任务延时 |
| Task Suspend/Resume | 任务挂起和恢复 |
| Queue Send/Receive | 队列发送和接收 |
| Semaphore Give/Take | 信号量操作 |
| Mutex Lock/Unlock | 互斥量操作 |
| ISR Enter/Exit | 中断进入和退出 |


uC/OS-III 示例
uC/OS-III 示例展示了如何在 uC/OS-III 项目中使用 SystemView。
示例代码说明
include "includes.h"
include "SEGGER_RTT.h"
include "SEGGER_SYSVIEW.h"
int main(void)
{
OS_ERR err;
board_init();
/ RTT Init /
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
/ SYSVIEW Init /
SEGGER_SYSVIEW_Conf();
SEGGER_SYSVIEW_Start();
/ Initialize LED GPIO /
board_init_gpio_pins();
OSInit(&err);
/ Create start task /
OSTaskCreate((OS_TCB )&StartTaskTCB,
(CPU_CHAR )"start task",
(OS_TASK_PTR)start_task,
...);
OSStart(&err);
return 0;
}
os_cfg.h 配置
在 os_cfg.h 中启用 Trace 功能:
/ Trace Recorder configuration /
define OS_CFG_TRACE_EN 1u / Enable uC/OS-III Trace instrumentation /
define OS_CFG_TRACE_API_ENTER_EN 1u / Enable Trace API enter instrumentation /
define OS_CFG_TRACE_API_EXIT_EN 1u / Enable Trace API exit instrumentation /
CMakeLists.txt 配置
set(CONFIG_SEGGER_RTT 1)
set(CONFIG_SEGGER_SYSVIEW 1)
set(CONFIG_UCOS_III 1)


在现有工程中使能 SystemView
本节以 samples/rtos/freertos/freertos_hello 工程为例,演示如何在现有的 FreeRTOS 工程中使能 SystemView。
在 FreeRTOS 工程中使能 SystemView
步骤 1:修改 CMakeLists.txt
在 CMakeLists.txt 中添加 SystemView 相关配置:
cmake_minimum_required(VERSION 3.13)
set(CONFIG_FREERTOS 1)
set(CONFIG_SEGGER_RTT 1) # 新增
set(CONFIG_SEGGER_SYSVIEW 1) # 新增
Set CONFIG_FREERTOS_TIMER_RESOURCE_GPTMR to use GPTMR as system's tick source
set(CONFIG_FREERTOS_TIMER_RESOURCE_GPTMR 1)
Set CONFIG_FREERTOS_TIMER_RESOURCE_PWM to use PWM/PWMV2 as system's tick source
set(CONFIG_FREERTOS_TIMER_RESOURCE_PWM 1)
find_package(hpm-sdk REQUIRED HINTS $ENV{HPM_SDK_BASE})
project(freertos_hello)
sdk_compile_definitions(-DCONFIG_NDEBUG_CONSOLE=1) #新增
sdk_ses_opt_lib_io_type(RTT) #新增
sdk_ses_opt_debug_connection(J-Link) #新增
sdk_inc(src)
sdk_compile_definitions(-DUSE_NONVECTOR_MODE=1)
sdk_compile_definitions(-DDISABLE_IRQ_PREEMPTIVE=1)
sdk_app_src(src/freertos_hello.c)
generate_ide_projects()
步骤 2:修改 FreeRTOSConfig.h
在 FreeRTOSConfig.h 文件末尾添加 SystemView 头文件引用:
/ 新增以下代码块 /
ifdef CONFIG_SEGGER_SYSVIEW
include <SEGGER_SYSVIEW_FreeRTOS.h>
endif
endif / FREERTOS_CONFIG_H /
步骤 3:在应用代码中初始化 SystemView
在 main() 函数中添加初始化代码:
include "SEGGER_RTT.h"
include "SEGGER_SYSVIEW.h"
int main(void)
{
board_init();
/ 添加:RTT 初始化 /
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
/ 添加:SystemView 初始化 /
SEGGER_SYSVIEW_Conf();
SEGGER_SYSVIEW_Start();
/ 原有的任务创建代码 /
...
vTaskStartScheduler();
return 0;
}
步骤 4:重新编译并运行
重新编译工程后,使用 SystemView 软件连接开发板即可看到实时系统运行情况。
在 uC/OS-III 工程中使能 SystemView
步骤 1:修改 CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
set(CONFIG_UCOS_III 1)
set(CONFIG_SEGGER_SYSVIEW 1) #新增
set(CONFIG_SEGGER_RTT 1) #新增
set(CONFIG_UCOS_III_TIMER_RESOURCE_GPTMR 1) to use gptmr as system's tick source
set(CONFIG_UCOS_III_TIMER_RESOURCE_GPTMR 1)
find_package(hpm-sdk REQUIRED HINTS $ENV{HPM_SDK_BASE})
project(ucos_iii_hello_world)
sdk_compile_definitions(-DCONFIG_NDEBUG_CONSOLE=1) #新增
sdk_ses_opt_lib_io_type(RTT) #新增
sdk_ses_opt_debug_connection(J-Link) #新增
sdk_compile_definitions(-DDISABLE_IRQ_PREEMPTIVE=1)
sdk_inc(inc)
sdk_inc(../ucos_cfg)
sdk_app_src(src/main.c)
sdk_app_src(src/user_tasks.c)
sdk_app_src(src/start_task.c)
sdk_app_src(../ucos_cfg/os_app_hooks.c)
generate_ide_projects()
步骤 2:修改 os_cfg.h
在 uC/OS-III 的配置文件中启用 Trace 功能:
// samples/rtos/ucos_iii/ucos_cfg/os_cfg.h
define OS_CFG_DBG_EN 1u
define OS_CFG_TRACE_EN 1u
define OS_CFG_TRACE_API_ENTER_EN 1u
define OS_CFG_TRACE_API_EXIT_EN 1u
步骤 3:在应用代码中初始化 SystemView
include "SEGGER_RTT.h"
include "SEGGER_SYSVIEW.h"
int main(void)
{
OS_ERR err;
board_init();
/ RTT Init /
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
/ SYSVIEW Init /
SEGGER_SYSVIEW_Conf();
SEGGER_SYSVIEW_Start();
OSInit(&err);
...
}
步骤 4:重新编译并运行
重新编译工程后,使用 SystemView 软件连接开发板即可看到实时系统运行情况。
技术细节
本节详细介绍 SystemView 的配置参数和技术实现细节,帮助开发者深入理解其工作原理。
RTT 缓冲区配置
RTT(Real Time Transfer)是 SystemView 与目标设备通信的基础。正确配置 RTT 缓冲区对确保数据稳定传输至关重要。
RTT 缓冲区初始化
SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);
参数说明:
| 参数 | 描述 |
|---|---|
| 0 | 缓冲区通道编号(0 为默认通道) |
| NULL | 缓冲区名称(使用默认名称 “Terminal”) |
| NULL | 缓冲区指针(NULL 表示使用默认缓冲区) |
| 0 | 缓冲区大小(0 表示使用默认大小) |
| SEGGER_RTT_MODE_NO_BLOCK_SKIP | 模式:数据溢出时跳过而非阻塞 |
RTT 模式说明
| 模式 | 描述 |
|---|---|
| SEGGER_RTT_MODE_NO_BLOCK_SKIP | 数据溢出时跳过新数据(推荐用于高速数据流) |
| SEGGER_RTT_MODE_NO_BLOCK_TRIM | 数据溢出时裁剪数据以适应缓冲区 |
| SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL | 数据溢出时阻塞等待(可能导致实时性下降) |
自定义缓冲区大小
对于高事件率的场景,可以增大缓冲区以避免数据丢失:
define RTT_UP_BUFFER_SIZE 4096
static char _sRTTBuffer[RTT_UP_BUFFER_SIZE];
SEGGER_RTT_ConfigUpBuffer(0, "SYSVIEW", _sRTTBuffer, sizeof(_sRTT_BUFFER), SEGGER_RTT_MODE_NO_BLOCK_SKIP);
SystemView 配置文件详解
HPM SDK 中的 SEGGER_SYSVIEW_Conf_Def.h 包含以下关键配置:
时钟配置
// 系统 CPU 时钟频率
define SEGGER_SYSVIEW_CPU_FREQ (clock_get_core_clock_ticks_per_ms() * 1000)
// 时间戳频率(微秒级)
define SEGGER_SYSVIEW_TIMESTAMP_FREQ_UINT_US 0
- SEGGER_SYSVIEW_CPU_FREQ:系统核心时钟频率,用于计算时间戳
- SEGGER_SYSVIEW_TIMESTAMP_FREQ_UINT_US:设为 1 时表示时间戳单位为微秒,精度较低默认不使用
RISC-V 中断配置
HPM 芯片基于 RISC-V 架构,预配置了以下标准中断:
| 中断号 | 名称 | 描述 |
|---|---|---|
| 4003 | Software | 软件中断 |
| 4007 | MTimer | 机器定时器中断 |
| 4011 | ECall | 环境调用中断 |
时间戳获取
define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp()
HPM SDK 提供了 SEGGER_SYSVIEW_X_GetTimestamp() 函数,使用芯片的硬件计数器获取高精度时间戳。
中断 ID 获取
define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId()
SDK 自动处理中断 ID 的获取,用户无需手动配置。
存储位置建议
对于 HPM 芯片,建议将 RTT 缓冲区放置在: - 快速 SRAM:获取最佳性能 - 非缓存内存:确保数据一致性
可以打开SEGGER_SYSVIEW_SECTION_FAST宏,将SYSVIEW缓冲区放置在".fast_ram.init"中,但是此方法不适用HPM67系列芯片,因为HPM67系列芯片本地地址和系统总线地址不同。
同样可以修改middleware\segger_rtt\Config\SEGGER_RTT_Conf.h文件中的内存配置,让RTT Control Block也存放在".fast_ram.init"中,同样HPM67系列不适用:
define SEGGER_RTT_SECTION ".noncacheable.bss"
define SEGGER_RTT_BUFFER_SECTION ".noncacheable.bss"
//修改为:
define SEGGER_RTT_SECTION ".fast_ram.init"
define SEGGER_RTT_BUFFER_SECTION ".fast_ram.init"
SystemView API 使用
常用 API 列表
初始化和控制
| API | 描述 |
|---|---|
| SEGGER_SYSVIEW_Conf() | 初始化 SystemView |
| SEGGER_SYSVIEW_Start() | 开始记录事件 |
| SEGGER_SYSVIEW_Stop() | 停止记录事件 |
日志输出
| API | 描述 |
|---|---|
| SEGGER_SYSVIEW_Print(s) | 发送字符串消息 |
| SEGGER_SYSVIEW_PrintfHost(fmt, ...) | 格式化输出到主机 |
| SEGGER_SYSVIEW_PrintfHostEx(fmt, type, ...) | 带类型的格式化输出 |
日志类型: - SEGGER_SYSVIEW_LOG:普通日志 - SEGGER_SYSVIEW_WARNING:警告 - SEGGER_SYSVIEW_ERROR:错误
标记(Marker)操作
| API | 描述 |
|---|---|
| SEGGER_SYSVIEW_NameMarker(id, name) | 命名标记 |
| SEGGER_SYSVIEW_Mark(id) | 记录标记点 |
| SEGGER_SYSVIEW_MarkStart(id) | 开始标记(用于测量时间间隔) |
| SEGGER_SYSVIEW_MarkStop(id) | 停止标记 |
系统描述
| API | 描述 |
|---|---|
| SEGGER_SYSVIEW_SendSysDesc(s) | 发送系统描述 |
格式示例: - 任务描述:"T=<task_id>=<task_name>" - 中断描述:"I#<irq_num>=<irq_name>"
中断跟踪
| API | 描述 |
|---|---|
| SEGGER_SYSVIEW_SendSysDesc(s) | 发送中断描述信息(如中断名称) |
注意:HPM SDK 已经在内部自动处理了中断进入和退出的跟踪,用户无需手动调用中断跟踪相关函数。如果希望给中断号添加一个易读的名称,可以使用 SEGGER_SYSVIEW_SendSysDesc() 函数。
使用示例
自定义事件记录
define MY_EVENT_ID (100)
void my_function(void)
{
/ 记录函数开始 /
SEGGER_SYSVIEW_RecordU32(MY_EVENT_ID, 0);
/ ... 业务代码 ... /
/ 记录函数结束 /
SEGGER_SYSVIEW_RecordU32(MY_EVENT_ID, 1);
}
测量代码执行时间
define MARK_ID_CRITICAL_SECTION 10
void critical_operation(void)
{
SEGGER_SYSVIEW_NameMarker(MARK_ID_CRITICAL_SECTION, "Critical Section");
SEGGER_SYSVIEW_MarkStart(MARK_ID_CRITICAL_SECTION);
/ 关键代码段 /
perform_critical_task();
SEGGER_SYSVIEW_MarkStop(MARK_ID_CRITICAL_SECTION);
}
添加中断描述信息
/ 在 main 函数中添加中断描述,使 SystemView 显示更友好的中断名称 /
char desc[32];
sprintf(desc, "I#%d=GPTMR_IRQ", APP_BOARD_GPTMR_IRQ);
SEGGER_SYSVIEW_SendSysDesc(desc);
常见问题
Q1: SystemView 无法连接开发板
可能原因: 1. J-Link 连接问题 2. RTT Control Block 地址配置错误 3. 波特率设置过高
解决方法: 1. 检查 J-Link 连接是否正常 2. 在 .map 文件中确认 _SEGGER_RTT 符号地址 3. 降低 J-Link 连接速度
Q2: SystemView 显示无数据
可能原因: 1. 程序未调用 SEGGER_SYSVIEW_Conf() 和 SEGGER_SYSVIEW_Start() 2. 程序未运行或被暂停
解决方法: 1. 确认代码中已正确初始化 SystemView 2. 在 SystemView 中点击 Start Recording 后复位开发板
Q3: FreeRTOS 任务信息不显示
可能原因: FreeRTOSConfig.h 中未包含 SEGGER_SYSVIEW_FreeRTOS.h
解决方法: 在 FreeRTOSConfig.h 末尾添加:
ifdef CONFIG_SEGGER_SYSVIEW
include <SEGGER_SYSVIEW_FreeRTOS.h>
endif
Q4: 中断名称显示为数字
可能原因: 未使用 SEGGER_SYSVIEW_SendSysDesc() 添加中断描述信息
解决方法: 在初始化代码中添加中断描述:
char desc[32];
sprintf(desc, "I#%d=My_Interrupt_Name", IRQ_NUM);
SEGGER_SYSVIEW_SendSysDesc(desc);
HPM SDK 已经自动处理了中断进入和退出的跟踪,无需用户手动调用相关 API。
Q5: SystemView 对系统性能的影响
SystemView 使用 RTT 进行数据传输,对系统性能的影响非常小。主要影响包括:
- CPU 开销:每次记录事件约需几十个时钟周期
- 内存占用:RTT 缓冲区默认占用约 1KB RAM
- 中断延迟:使用 RTT 时中断响应几乎不受影响
在大多数实时应用中,这些开销可以忽略不计。
常见调试场景
场景 1:任务调度延迟
现象:高优先级任务响应慢
分析方法: 1. 观察任务切换时序图 2. 检查是否有中断长时间阻塞任务 3. 查看 CPU 负载分布
调试建议: - 使用 Marker 标记任务关键路径 - 观察是否存在任务优先级反转 - 检查是否有高频率中断抢占
场景 2:中断响应超时
现象:中断处理时间过长
分析方法: 1. 查看中断进入和退出时间 2. 观察中断嵌套情况 3. 对比中断频率与任务执行
调试建议: - 在中断处理函数中使用 Mark 标记各阶段 - 避免在中断中做耗时操作 - 将复杂处理移至任务中
参考资源
文档版本:1.0 适用于 HPM SDK v1.12.0 及以上版本

