本帖最后由 DKENNY 于 2024-8-16 17:29 编辑
#申请原创# @21小跑堂
前言
实时操作系统(RTOS)的分析可能会很复杂,特别是当涉及大量任务和任务间通信时,保持程序的稳定性可能会成为一个挑战。幸运的是,我们有许多工具可以帮助我们分析RTOS的运行情况。比如,SystemView、Tracealyzer和TIRTOS的ROV(Runtime Object Viewer),这些都是常见的分析工具。ROV甚至已经集成在CCS(Code Composer Studio)中了。这篇文章,我会以Segger的SystemView为例,讨论如何在ucos3环境中移植和使用SystemView。
1、什么是SystemView?
SystemView,顾名思义,一种系统层的可视化调试工具,它就像一个放大镜,帮助我们看清和理解复杂的系统。
也可以这么理解,假设我们正在搭建一个大型乐高模型,有成百上千的零件,如果没有说明书,我们可能会感到困惑,不知道如何开始,或者在搭建过程中可能会遇到问题。SystemView就像是乐高模型的说明书,它通过图形和模型的方式,展示系统的各个部分是如何组合在一起的,以及他们是如何互动的。这样,无论我们是乐高新手还是专家,都可以更好地理解和搭建你的乐高模型。同样,无论我们是软件工程师、系统设计师还是其他角色,都可以通过SystemView更好地理解和设计我们的系统。
2、移植前的准备工作
(1)一个jlink,用于调试、下载
(2)APM32F4系列开发板
(3)SystenView的PC端软件(下载地址:https://www.segger.com/downloads/systemview)
注意:我下载最新版的3.54后,实际使用时有点问题,实际trace的时候总是会莫名其妙的闪退,这里推荐用其他的版本,比如我使用的是3.10版本的。
3、移植过程
由于我原来已经在APM32F407上移植过了UCOS3,这里就不在赘述了,没有UCOS3例程的可以去看我发过的这篇帖子《APM32F4 移植ucos-iii》,当然,文章最后我也把这个模板例程弄过来了,可以直接用。
(1)下载完SystemView软件后,双击安装。打开软件后,会弹出以下提示,直接点击Continue即可。
出现以下界面,则说明安装成功。
(2)打开SystemView软件安装目录,把src文件复制到ucos工程的目录下,我这里只是又封装了一层,其内部的内容就是Src文件夹中的内容。
如下是ucos工程目录下SystemView的内容。
(3)打开工程,添加必要的头文件以及源文件。
(4)配置os_cfg.h文件,修改相关宏,开启DEBUG以及TRACE功能。
#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
(5)配置os_cfg_trace.h
#define OS_CFG_TRACE_MAX_TASK 32u //可根据创建任务的实际情况修改
#define OS_CFG_TRACE_MAX_RESOURCES 256u//可根据创建任务的实际情况修改
(6)配置SEGGER_RTT_Conf.h
#define BUFFER_SIZE_UP 4096u//可根据创建任务的实际情况修改
(7)配置SEGGER_SYSVIEW_Conf.h
#define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 4096u//可根据创建任务的实际情况修改
(8)修改SEGGER_SYSVIEW_Config_uCOSIII.c
这个文件里面有两个宏函数:
#define SYSVIEW_TIMESTAMP_FREQ (BSP_ClkFreqGet(BSP_CLK_ID_SYSCLK))
#define SYSVIEW_CPU_FREQ (BSP_ClkFreqGet(BSP_CLK_ID_SYSCLK))
这两个宏函数需要我们手动实现,不过实际的功能就是获取系统时钟以及时钟戳。
这里面还包含了一个bsp_clock.h文件,这个文件是需要我们自己定义编写的,我们也可以直接注释掉该头文件的包含,或者自定义这个文件,在这个文件中实现这两个宏函数。我采用的就是重新实现这个头文件,并新建了一个同名的源文件添加到了该工程内部。
编写bsp_clock.h
#include "apm32f4xx.h"
#include "apm32f4xx_rcm.h"
#define BSP_CLK_ID_SYSCLK 0
uint32_t BSP_ClkFreqGet(uint32_t type);
编写bsp_clock.c
#include "bsp_clock.h"
uint32_t BSP_ClkFreqGet(uint32_t type)
{
(void)type;
return RCM_ReadSYSCLKFreq();
}
实现的内容特别简单,就是返回了当前系统时钟频率。
(9)main函数修改。
#include <os.h>
#include <app_cfg.h>
#include "os_trace.h" //包含trace头文件
……
int main(void)
{
……
OS_TRACE_INIT(); //在OS初始化之前开启TRACE功能
OS_ERR err;
OSInit(&err);
……
}
这样,整个工程就移植完成了。
4、SystemView使用
(1)下载代码至开发板,打开SystemView工具,一定要在jlink的连接的前提下,然后按照如下操作开始配置trace的芯片型号。
(2)点击Start Recording,开始trace。
(3)点击Stop Recording,停止trace。
(4)查看记录的任务运行情况。
如上图,在程序中,我们开启了SysTick中断,可以在Timeline窗口看到SysTick中断执行的时间,并且创建了LED和Serail两个Task,我们可以非常直观地看到两个Task的执行时间,以及ucos3在在运行时,具体干了什么事,执行了哪些Task,都是非常直观的。
结语
通过本次对SystemView与uCOS3的移植过程的分享,希望能够为正在进行类似工作的开发者们提供一些参考与借鉴。SystemView的强大功能为实时系统的调试与性能优化提供了有力支持,更好地帮助我们理解系统运行时的状态。虽然移植过程中遇到了一些挑战,但通过合理的配置与调整,我们成功实现了SystemView与uCOS3的结合。
附件
1. APM32移植ucos3例程
APM32F4移植uCOSIII.zip
(2.15 MB)
2.SystemView+ucos3移植工程
SystemView_ucos3.zip
(2.48 MB)
3.SystemView V3.10版本(Windows)
SystemView_V310_Windows_x64.zip
(6.26 MB)
4.SystemView说明文档
UM08027_SystemView.pdf
(1.44 MB)
|
我用不闪退的版本是3.52a 3.54 3.56 都会闪退,应该是上位机的bug
使用Systemview,使RTOS更好用更易用,图形化界面,使得开发人员对整个系统的任务调度理解更为直观,作者的移植过程详细完整,值得参考借鉴