HPM SDK SEGGER SystemView 使用指南

HPM SDK SEGGER SystemView 使用指南

目录

  1. 概述
  2. SystemView 简介
  3. HPM SDK 中的 SystemView 支持
  4. 快速开始
  5. HPM_SDK示例详解
  6. 工程调试
  7. 在现有工程中使能 SystemView
  8. 技术细节
  9. SystemView API 使用
  10. 常见问题
  11. 参考资源

概述

本文档介绍如何在 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软件使用介绍。

  1. 编译示例工程
    • 打开start_gui.exe软件,选择hpm5300evk开发板
    • 选择segger_sysview/freertos示例
    • Generate生成代码工程
    • 选择Open with IDE(SES)通过SEGGER Embedded Studio打开代码工程
    • SEGGER Embedded Studio编译工程
    • 获取编译后RTT Control Block运行时地址,以备后续步骤使用
  1. 启动 SystemView 软件
    • 启动SystemView软件
    • File->New Project新建工程并保存,Next进入下一步
    • 选择SYSVIEW使用的通信设备
    • 选择目标芯片配置及RTT Control Block,点击Finihs完成工程撞见
  2. 开始记录
    • 确保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()必须被执行完成
  • 出现同时调试失败的情况
    1. 确认RTT Control Block发否正确
    2. 关闭在线调试,重新下载程序并复位,确保Soc程序正确运行,关闭SEGGER Embedded Studio时SystemView软件可以正常记录。
    3. 保证步骤2正常的情况下,保持SystemView软件记录开启状态,启动SEGGER Embedded Studio启动调试
    4. 如果仍然存在问题,关闭所有软件,重新插拔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 进行数据传输,对系统性能的影响非常小。主要影响包括:

  1. CPU 开销:每次记录事件约需几十个时钟周期
  2. 内存占用:RTT 缓冲区默认占用约 1KB RAM
  3. 中断延迟:使用 RTT 时中断响应几乎不受影响

在大多数实时应用中,这些开销可以忽略不计。

常见调试场景

场景 1:任务调度延迟

现象:高优先级任务响应慢

分析方法: 1. 观察任务切换时序图 2. 检查是否有中断长时间阻塞任务 3. 查看 CPU 负载分布

调试建议: - 使用 Marker 标记任务关键路径 - 观察是否存在任务优先级反转 - 检查是否有高频率中断抢占

场景 2:中断响应超时

现象:中断处理时间过长

分析方法: 1. 查看中断进入和退出时间 2. 观察中断嵌套情况 3. 对比中断频率与任务执行

调试建议: - 在中断处理函数中使用 Mark 标记各阶段 - 避免在中断中做耗时操作 - 将复杂处理移至任务中

参考资源

文档版本:1.0 适用于 HPM SDK v1.12.0 及以上版本

0
0

订阅

发表回复 0

Your email address will not be published. Required fields are marked *

captcha
Enter the characters shown in the image:
Reload

This CAPTCHA helps ensure that you are human. Please enter the requested characters.