在没有实时操作系统(RTOS)的情况下通过UART使用SEGGER SystemView——函数名未显示
我正在使用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,而不是函数名。

我已经验证的事项:
- UART通信正常工作
- SystemView已接收到事件
- 描述文件已加载
- 修改文件后已重新开始采集
- 事件ID与固件中使用的ID相符
有人在使用SystemView无 RTOS且通过UART时遇到过这个问题吗?
我是不是还漏掉了一个额外的配置步骤?
顺便说一句,我在通过UART启用这段通信方面花了很多功夫,因此如果有人仅遇到这个通信相关的问题来到此问答,欢迎提问(等完成并可运行后,我会把仓库公开到GitHub)。
解决方案
部分解决方案
我找到了一个部分解决方案。
有几个重要的细节:
.txt描述文件必须以一个空行结尾。否则,SystemView的解析可能无法正确读取最后一个条目。- 描述文件名必须遵循以下格式:
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
- 模块必须在
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
重要:确保文件在最后一行之后有一个最终的空行。