[先楫RT-Thread BSP的misc系列] systemview可视化RTOS调试
一 前言
五一劳动节快乐!!!
先楫在2024年4月底发布了RT-Thread BSP v1.5.0版本,传送门如下:
RT-Thread BSP v1.5.0 发布 | 优化生态
先楫对于RT-Thread BSP目录结构相对清晰,可以在rtthread studio下载相关board的bsp,本文主要下载阐述HPM6800EVK的bsp,在rtthread studio下载好之后,可以在该软件的安装目录下的repo找到bsp包,如下:
在BSP v1.5.0上新增一个比较大的更新就是加入了misc,在common下的misc目录,目前包含了主要三个项目,目前主要支持 RTOS可视化调试进、RTOS中的中断向量模式和可抢占中断支持。
misc全称Miscellaneous(杂项),正如字面意思,用来描述不便于归类到特定类别中的元素、组件或配置,不直接属于系统的主要功能模块,但又不可或缺,如配置参数、辅助调试工具等用途。
对于systemview在riscv平台的使用,特别是在RT-Thread平台下,在以往的文章中已经做了大概的移植工作阐述,传送门如下:
[hpm_application] RT-Thread应用执行可视化分析:SystemView来啦!
刚好先楫在BSP V1.5.0支持了该组件,在发布的时候也体验了一把,把相关的使用的经验进行阐述,对于官方的移植思路不在本文的阐述范围内,可自行配合上述文章和官方的代码进行分析,特别是中断处理上,会在后续的文章中补充阐述。
效果:
二、操作流程
主要操作常用的配置,其他配置应用可参考segger的systemview手册。
(一)新建工程
可以在BSPv1.5.0中新建任意一个示例,本文以以太网示例ethernet_demo为例子,需要注意的是,systemview属于segger的产品,需要配合Jlink进行调试,所以调试器最好选择jlink。
(二)menuconfig配置
在官方例子中,systemview默认关闭,需要开发者自行根据需求打开。在rtthread studio的setting的位置如下:
对应的env的menuconfig位置如下:
在systemview文件夹中也提供了README.md文档进行简单的使用介绍,本文也是基于该readme进行操作使用。
1、使能segger systemview
如上图所示,如果需要使用systemview,需要开发者自行使能,使能后会出现以下配置也自动使能
2、systemview RTT section
Systemview依赖Jlink的RTT模块,故除了需要设置systemview的section,还需要设置RTT模块的section,官方默认都是放在nocache上,以便数据受cache影响,加之systemview内部并没有提供cache操作的api注册,建议使用官方原本的sction配置
3、MCU相关参数配置
主要是设置应用程序的名字(App name)、device name(jlink支持的设备)、Timestap freq(时间戳频率)、cpu freq(cpu 频率)、system description(系统描述符)。
(1)CPU device config
官方默认使用的是HPM6750xVMx。
而对于其他的先楫型号,可以在jlink的device list查找,当然也可以在应用程序J-flash中查找。
传送门: https://www.segger.com/supported-devices/hpmicro/
对于本文使用的HPM6800EVK板子,使用的MCU是HPM6880IBD1,对应的Jlink的device name是HPM6880xBDx
(2)frequency config
systemview使用的时间戳是CPU的cycle,而频率刚好是CPU的频率。都为500MHz。
(3)system description 0~2
系统描述符,主要描述中断名称,格式为“I#num=name”,num是中断标号,name是中断名称。
比如上述的mchtmr,中断标号在这里是2055。本文实例是以太网,可以起个以太网中断,在um手册中可知,ENET0的中断编号是92
如此以来,HPM6800EVK的配置信息如下:
4、segger RTT config
主要配置RTT模块的通道数量、输入输出通道的字节数等。保持默认即可,通道数量可以设置为3,systemview使用的通道是2,而通道0是作为rtthread的串口设备使用。
5、systemview buffer config
主要配置systermview使用的RTT模块通道和Buffer大小,这里的Buffer大小默认是2048,如果追踪的需求比较大,比如开启rtthread的相关对象信息跟踪,而且多个线程调度,需要进行加大调整。本文例子使用的是以太网,会开启iperf,加之ram空间足够,这里设置为100K大小,也就是102400
6、systemview rtthread hook register
rtthread提供了系统和中断的钩子函数,systemview在钩子函数中进行获取相关信息进行发送从而起到跟踪作用。
而systemview组件也开放了不同hook的注册,监视内核对象和中断情况。这里使用组件默认即可。
三、上位机systemview验证
(一)准备工作
1、修改参数完毕后,保存配置编译,然后烧录。
2、 在segger官网下载systemview软件,版本可最新。
https://www.segger.com/downloads/systemview
3、 将工程中的
libraries\misc\systemview\SystemView_Description\SYSVIEW_RTThread.txt' 复制到systemview安装目录下的Description文件夹
(二)配置
1、查看MCU端打印的log信息,需要记住两个信息,一个是cpu频率,一个是RTT模块的buffer地址。
2、打开systemview软件,选择target中的recorder configuartion
3、弹出的窗口选择默认:J-Link.
4、target connection选择对应板子的soc型号,在上述中可知SOC为HPM6880xBDx, RTT Control Block Detection中选择上述的log信息的address,配置完毕后选择OK
5、点击 左上角提示的recording start按钮,即可开始录制记录
(三)分析系统信息
1、system
(1)主要记录目标MCU的信息,比如SOC型号、SOC频率、时间戳周期频率 。
(2)recording记录运行的时间,事件发生的次数和频率,发生Overflow Buffer溢出的次数。
(3)analysis主要记录已捕获的大小,峰值吞吐量,解析速度。
(4)记录线程的数量,切换次数和时间。中断的数量,发生的次数。
2、events timeline
主要记录每个事件的序号、发生的时间戳、事件的上下文、事件名称、具体事件。
以例子中的 led_th线程为例。线程中会以500ms闪烁LED灯
(1) 在systemview中可看到从上一个led闪烁到下一个闪烁间隔刚好就是500ms。773-272=501ms.
(2) 先来分析下调度进来led_th的前后分析
在这一时刻发生了mchtmr定时器中断,而bsp的rtthread的时钟节拍就是以mchtmr定时的。
进来定时器中断后,会使用rt_tick_increase API时下按时间片轮转调度。
也就是图中的6.9us,在时间片调度到led_th大概花了6.9us。而调度到led_th花了4.3us.
进而就是led_th的task run,也就是执行点灯的事件,花了3.6us后,进而使用delay后让出调度器。
(3)cpu负载率
这里还可以查看cpu的负载分布
更多信息分析可以查看segger的systemview手册。
四、总结
1、先楫适配systemview组件,能够帮助开发者深入理解先楫MCU在rtthread运行的相关行为以及分析运行时的数据,包括任务调度、中断活动、系统事件等,通过查看运行消耗的时间,提升排错效率以及性能。