在没有实时操作系统(RTOS)的情况下通过UART使用SEGGER SystemView——函数名未显示

编程语言 2026-07-09

我正在使用STM32H503RB Nucleo开发板,搭配SEGGER SystemView,尝试搭建一个裸机(无RTOS)的项目。

该开发板不支持J-Link转换,因此我改用UART通信接口。经过数小时的配置,我终于让SystemView工作,并且可以成功看到事件被记录。

然而,在SystemView应用中,我无法显示函数名称。

我正在遵循SEGGER官方关于在无RTOS的情况下使用SystemView的指南:

https://kb.segger.com/Use_SystemView_without_RTOS

据指南,我创建了 SYSVIEW_NoOS.txt 文件,从33开始添加我的函数ID,并将文件放在正确的目录中。我还更新固件以记录事件,方式如下:

SEGGER_SYSVIEW_RecordVoid(33);
SEGGER_SYSVIEW_RecordEndCall(33);

我的 SYSVIEW_NoOS.txt 文件包含:

33 toogleLed

问题在于SystemView仍然只显示数字事件ID,而不是函数名。 SEGGER SystemView

我已经验证的事项:

  • UART通信正常工作
  • SystemView已接收到事件
  • 描述文件已加载
  • 修改文件后已重新开始采集
  • 事件ID与固件中使用的ID相符

有人在使用SystemView无 RTOS且通过UART时遇到过这个问题吗?

我是不是还漏掉了一个额外的配置步骤?

顺便说一句,我在通过UART启用这段通信方面花了很多功夫,因此如果有人仅遇到这个通信相关的问题来到此问答,欢迎提问(等完成并可运行后,我会把仓库公开到GitHub)。

解决方案

部分解决方案

我找到了一个部分解决方案。

有几个重要的细节:

  1. .txt 描述文件必须以一个空行结尾。否则,SystemView的解析可能无法正确读取最后一个条目。
  2. 描述文件名必须遵循以下格式:
SYSVIEW_<registered module or used OS>.txt

SystemView使用的操作系统名称由 SEGGER_SYSVIEW_Config_<OS>.c 注册并发送给SystemView应用程序。

例如:

static void _cbSendSystemDesc(void) {
  SEGGER_SYSVIEW_SendSysDesc("N=" SYSVIEW_APP_NAME ",O=NoOS,D=" SYSVIEW_DEVICE_NAME);
  SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick");
}

在这种情况下,O=NoOS 字段定义了报告给SystemView的 OS名称。因此,如果没有注册自定义模块,相应的描述文件应命名为:

SYSVIEW_NoOS.txt

在我的情況中,模块注册为 NoOSModule,因此文件名必须是:

SYSVIEW_NoOSModule.txt
  1. 模块必须在 sModule 字符串中包含模块名和事件描述。

例如,模块通过填充 SEGGER_SYSVIEW_MODULE 结构来注册:

SEGGER_SYSVIEW_MODULE NoOSModule = {
  "M=NoOSModule, 0 ToggleLED void=%u",
  1,
  0,
  NULL,
  NULL
};

根据SEGGER SystemView手册,第一個结构成员称为 sModule。它是一个指向包含模块名和事件描述的字符串的指针,长度不应超过128个字符。还有一个选项是通过设置第四个结构成员 pfSendModuleDesc,它是一个指向回调的指针,通过使用函数 SEGGER_SYSVIEW_RecordModuleDescription()SEGGER_SYSVIEW_NameResource() 发送剩余信息。我还没有尝试过这个,我会尝试并更新本回答。

我发现的一点在手册中似乎没有明确提及的是,即使被记录的函数没有输入参数,我仍然需要在描述中包含 void=%u 参数描述。否则,SystemView工具不会正确显示事件信息。至少,在我的情况是如此。

然后通过以下方式注册模块:

SEGGER_SYSVIEW_RegisterModule(&NoOSModule);

以及函数的记录方式如下:

void ToggleLED(uint8_t input) {
  (void)input;

  SEGGER_SYSVIEW_RecordVoid(NoOSModule.EventOffset + 0);

  HAL_GPIO_TogglePin(GrenLED_GPIO_Port, GrenLED_Pin);

  SEGGER_SYSVIEW_RecordEndCall(NoOSModule.EventOffset + 0);
}

文件 SYSVIEW_NoOSModule.txt 包含:

0 ToggleLED

重要:确保文件在最后一行之后有一个最终的空行。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章