type
slug
status
summary
icon
category
date
tags
password

1 RTOS可视化分析工具

嵌入式系统可视化分析工具,提供了时间轴、CPU负载、运行时间信息、上下文运行时信息等可视化窗口。
  • 专门用于分析和监控嵌入式多任务应用程序的软件工具。
  • 两个主要构成部分:一是PC端的应用程序,二是与目标硬件代码相关的库和程序。
  • 该工具能够提供系统级别的运行时信息和图形化视图,帮助开发人员实时监控和分析系统的行为。
notion image
1.数据列表区(上方) 以表格形式展示系统运行的详细参数和事件记录。 2.波形图表区(中间)
通过多色波形动态展示信号变化和任务调度时序。
3.柱状图区(下方) 统计关键指标的分布和占比(如CPU利用率、任务运行时长)

1.1 使用RTOS可视化分析工具的原因

  • 验证RTOS系统的设计
    • 虽然源代码是系统设计的重要部分,但它未必能全面反映多任务系统在运行过程中的实时行为。
    • 多任务系统的表现还受到任务切换、中断、输入操作以及这些元素相互作用的影响,因此需要通过实时监控工具来深入了解系统的实际运行情况。
  • 减少故障排除所需的时间
    • 该工具能够捕捉到一些难以重现的偶发性错误,这些错误可能在常规的调试过程中很难发现。
    • 它有助于快速定位和解决嵌入式系统中的软件问题,大大节省了故障排除的时间和精力。
  • 更高效地优化实时系统
    • 提供精准的时间信息和详细的系统视图,帮助开发者清楚了解每个任务的执行情况。
    • 能够有效识别和定位影响系统性能的瓶颈,帮助开发人员进行有针对性的优化,提升系统的响应能力和稳定性。
  • 提升软件质量
    • 通过对系统行为的全面分析,可以发现并避免潜在的设计缺陷或性能问题。
    • 比如,有助于识别CPU使用不当、调度冲突以及任务间相互作用等问题,从而改善系统的整体质量和可靠性。

1.2 常见的可视化分析工具

  • Tracealyzer
  • SystemView
  • uC/Probe
 

2 Systemview可视化分析工具

  • SystemView 是由 SEGGER 公司开发的一款嵌入式系统可视化分析工具。是一款专为嵌入式系统开发和调试设计的实时事件跟踪与分析工具。它为开发人员提供了一个强大的监控平台,使得能够全面掌握系统的运行状态与性能表现。
  • 通过在嵌入式系统中嵌入轻量级事件记录器,SystemView 可以实时收集和记录系统中各类事件,比如任务切换、中断处理、函数调用等。这样,开发人员就可以通过直观的可视化界面,实时监控系统的运行情况,包括任务的执行顺序、每个任务的运行时间、中断的触发及其处理时间等详细信息。将 SystemView 集成到 uc-osi 操作系统中,能够有效地提升对系统的理解和调试能力,进而优化四轴飞行器系统的性能和稳定性。
  • SEGGER的实时传输技术(Real Time Transfer,RTT)是一种应用于嵌入式的交互式I/O技术,它结合了SWO和半主机的优点,具有很高的性能
    • RTT支持双向多通道,不需要额外的引脚或硬件,通过标准的调试端口连接到目标硬件
    • RTT需要J—Link调试器支持
notion image
  • 功能概述
    • 时间轴:SystemView 提供详细的时间轴视图,帮助开发人员分析系统任务的执行顺序、时间消耗等关键数据。
    • CPU负载:可以显示 CPU的负载情况,帮助开发者优化任务调度,提高系统效率。
    • 运行时信息:通过可视化界面,开发人员能够实时监控操作系统的运行状态,包括任务调度、CPU 使用情况、时钟周期等。
    • 上下文运行时信息:SystemView 支持捕获上下文切换、任务切换和中断服务等运行时事件,并能够以直观的方式展示这些数据,便于开发者分析和调试。
通过使用 SystemView,开发者可以更全面地理解嵌入式系统的行为,发现潜在的性能问题,并进行针对性的优化。此工具使得实时操作系统的调试和性能分析变得更加简单和直观。

2.1 Systemview的工作机制

  • 在目标系统中包含SystemView和RTT软件模块:
    • SystemView 模块用于收集和格式化监视数据,然后将这些数据发送给 RTT(Real-TimeTransfer)。这种机制使得开发人员可以实时获取嵌入式系统中的行为数据,进行在线分析和调试。
  • RTT模块:
    • RTT 模块可以将数据存储在目标板的缓冲区中,使用 J-Link 调试器可以实现连续的记录数据。该模块支持两种记录方式,用户可以选择覆盖模式(即新数据覆盖旧数据)或非覆盖模式(即数据存储不被覆盖,直到空间用完为止)。通过这一机制,开发者可以灵活选择不同的数据存储方式,以便满足不同的应用需求。
  • PC端的分析软件:
    • 分析软件将从目标系统中读取监视数据并进行分析,最后在PC端显示结果。这种设计使得开发人员可以通过图形化界面详细观察和分析系统的运行情况,便于优化系统性能或解决潜在问题。
  • 三种工作模式:
    • 持续记录模式:系统持续不断地记录实时数据,适用于需要长期监控系统的场景。通过这一模式,可以捕获所有的事件数据,进行深度分析。
    • Single-Shot模式:在这种模式下,SystemView会在特定事件发生时仅记录一次数据。这适用于只对某个特定时间段或特定事件的监控需求。
    • Post-Mortem模式:这种模式允许开发人员在系统发生故障后进行数据回溯分析。它可以帮助开发者查看系统崩溃前后的行为,定位故障的根本原因。
 

2.2 Systemview的文件

notion image
notion image
notion image
 

2.3 Systemview的移植

💡
要在项目中成功应用 SystemView,首先需要将官方提供的示例程序引入到工程中。接着,根据 uc-osii操作系统的特点,对 SystemView 进行参数配置和定制。最后,在操作系统的代码中加入 SystemView接口,完成整个集成过程,便可搭建一个完整的 SystemView 测试环境。
notion image
参考Segger的官方例程:
notion image
首先,在项目的工程目录中创建一个名为Trace的新文件夹,用来存放与 SystemView 相关的例程文件。接下来,将 SystemView 官方提供的代码文件中,包含 Config、Sample 和 SEGGER 文件夹里的相关文件,复制并添加到刚刚创建的 SystemView 文件夹中,如下图所示。
notion image
导入成功后如下图所示:
notion image
notion image
需要如图所示,对那几个文件取消编译。
对于 SEGGER SystemView + uC/OS-II 的基本使用,以下几个文件其实是可以不引入编译的:
不需要编译的文件说明:
文件/文件夹
用途
是否必须
SEGGER_RTT_ASM_ARMv7M.S
RTT 底层裸汇编实现,效率高,但 依赖工具链语法匹配,容易报错
❌ 可删
RTT_Printf.c
RTT 的 SEGGER_RTT_printf() 实现,带格式化功能
❌ 如果你没用到 SEGGER_RTT_printf(),可不引
Syscalls_GCC / Syscalls_IAR / Syscalls_KEIL / Syscalls_SES
针对不同工具链的 printf重定向 示例或断点处理
❌ 完全可不引
SEGGER_RTT_Syscalls_KEIL.c
用于将 printf 重定向到 RTT,用不上 OSView 也可不引
❌ 可删
真正需要引入的Systemview文件是:
文件
说明
SEGGER_SYSVIEW.c
SystemView 主实现文件
SEGGER_SYSVIEW.h
SystemView API 头文件
SEGGER_SYSVIEW_Config_ucosii.c
针对 uC/OS-II 的配置适配文件
SEGGER_RTT.c
RTT 主通信接口 C 实现
SEGGER_RTT.h
RTT API 头文件
SEGGER_RTT_Conf.h
RTT 配置头文件(可自定义缓冲区大小等)
最简可运行组合
 
 
 
 
 
 

2.4 修改配置文件

2.4.1 os_cfg.h

notion image
在 os_cfg.h 中启用 uC/0S- 操作系统中的跟踪记录器功能,跟踪 API 的进入和退出事件。
notion image
启用 uC/OS-ii操作系统中的跟踪记录器功能,跟踪 API的进入和退出事件。

2.4.2 os_trace_cfg.h

设置 uC/OS- 操作系统跟踪记录器的配置参数:
  • OS_CFG TRACE MAX TASK 设置最多可以记录的任务数量,最大为 32 个任务。
  • OS_CFG_TRACE_MAX_RESOURCES 设置最多可以记录的内核对象(如信号量、消息队列等)数量,最大为 128 个。
notion image
 

2.4.3 SEGGER_SYSVIEW_Conf.h

1.配置 SystemView 的宏定义,为 SystemView 提供必要的时间戳和中断 ID 信息
  • SEGGER_SYSVIEW_GET_TIMESTAMP()
    • 这是一个宏定义,用于获取事件的时间戳。地址 0xE0001004 是Cortex-M处理器的DWT CYCCNT寄存器(周期计数器)的标准地址。它从地址0xE0001004 读取一个 32 位的值。这通常用于跟踪系统事件的发生时间。
  • SEGGER_SYSVIEW_TIMESTAMP_BITS
    • 定义了时间戳的位数。在此配置中,时间戳的位数为 28 位,表示可以记录的最大时间范围或精度。
  • SEGGER_SYSVIEW_ID_BASE 和 SEGGER_SYSVIEW_ID_SHIFT
    • SEGGER_SYSVIEW_ID_BASE 设置了中断ID 基址, 0x20000000 表示该值作为 ID 的基础地址。
    • SEGGER_SYSVIEW_ID_SHIFT 是一个偏移量,在获取中断 ID 时使用。在此配置中,它被设定为0,意味着不需要额外的偏移。
  • SEGGER_SYSVIEW_GET_INTERRUPT_ID()
    • 这是一个宏定义,用于获取当前中断的ID。它从地址 0xE000ED04 读取一个 32 位的值,并通过与操作符 &0x1FF 保留最低的9位,得到实际的中断ID。这个值通常用于标识正在执行的中断。
  • SEGGER_SYSVIEW_UNLOCK()
    • 解锁操作,通常用于释放对某些资源的访问锁。这里调用了SEGGER_RTT_UNLOCK(),该函数会解除 RTT(Real-Time Transfer)的锁定,以便进一步的操作。
这段代码配置 SystemView 的宏定义,主要用于为 SystemView 提供必要的时间戳和中断 ID 信息。它通过直接读取特定内存地址(如 0xE0001004 和 0xE000ED04)来获取系统的时间和中断状态,以便对实时数据进行准确的分析和记录。
 
2.设置 SystemView 使用的 RTT(Real-Time Transfer)缓冲区的大小
  • 缓存默认是1024字节,根据系统产生事件的多少和记录模式进行设置。
  • 如果所使用的 J-link 速度较低,或者系统较复杂,产生的事件较多,就需要更大的缓存。
  • 对于 Single-Shot 模式应尽可能的加大缓存,以便记录更长的时间。
 

2.4.4 SEGGER_RTT_CONF.h

同样的,增大缓冲区的大小。多方资料都建议这么做。
 
 

2.4.5 SEGGER_SYSVIEW_Config_uCOSII.c

这段代码的目的是为 SystemView 配置相关的设置,特别是关于应用程序信息、时钟频率和 RAM 地址等。下面是对每一行的简要解析:
  • SYSVIEW_APP_NAME
    • 这行代码定义了在 SystemViewer 中显示的应用程序名称。它会显示为 "ARM cortex-M Demo",表示这是一个 Cortex-M 架构的演示程序。
  • SYSVIEW_DEVICE_NAME
    • 这行代码设置了目标设备的名称,即“cortex-n Device",表明这个系统是基于 Cortex-M 处理器的设备。
  • SYSVIEW_TIMESTAMP_FREQ(注释掉的部分)
    • 这行代码原本用于设置时间戳的频率,获取系统定时器的频率(通过cPuTS TmrFregGet 函数)。这个频率需要与 SEGGER_SYSVIEW GET_TIMESTAMP 中的配置相匹配,以确保时间戳正确。
  • SYSVIEW_CPU_FREQ (注释掉的部分)
    • 这行代码原本用于设置 CPU的系统频率,通常会使用Systemcoreclock(适用于大多数CMSIS 兼容的项目)。它表示处理器的时钟频率。
  • SYSVIEW_RAM_BASE
    • 设置用于 ID(指针)的最低 RAM 地址为 0x20000000。这个地址通常是用于嵌入式系统中存放任务控制块(TCB)和其他系统数据的区域。
  • SYSVIEW_TIMESTAMP_FREQ(修改后的部分)
    • 这行代码设置时间戳的频率为 84000000u(84 MHz),这是 STM32F401 微控制器的时钟频率,适用于该硬件平台的时钟设置。
  • SYSVIEW_CPU_FREQ (修改后的部分)
    • 这行代码设置CPU的系统频率为84000000u(即 84 MHz)。这是 STM32F401 微控制器的主时钟频率,用于计算系统的频率。
这里也是需要修改的。
 
💡
总结: 这段代码为 SystemView 配置了应用程序的名称、设备的名称、RAM 地址和时钟频率。在修改后的版本中,注释掉了不适合 STM32F401 的时钟频率代码,改为硬编码的频率 84000000u ,以适应STM32F401 微控制器的时钟设置。这样可以确保 SvstemView 能够正确处理和显示时间戳以及系统的运行状态。同时也避免了引入标准外设库。
 

2.4.6 SEGGER_RTT_ASM_ARMv7M.S

notion image
notion image
 
 

3 Systemview的使用

3.1 初始化Systemview

  • 在main函数中调用SEGGER SYSVIEW Conf()来初始化SystemView
main.c中
  • 设置任务名、中断名,调试更加直观和方便
    • (1)任务名设置(不一定需要)
    • (2)中断名设置
一些命名规则:
notion image
notion image
 

3.2 进行J-Link连接

notion image
 

3.3 记录配置

notion image
 
notion image
7.可视化地进行任务级调试与观察
notion image
8.可根据需要将当前的记录信息导出文件保存下来
notion image
 

3.4 界面介绍

  • 时间轴窗口(TimeLine)
notion image
Timeline窗口在一个界面中集中了所有系统信息。它在系统时间线上显示了系统活动(任务、中断、调度器、定时器和空闲)。它显示在被监视的应用程序中使用的所有上下文项,且每行显示一个上下文项。 存在的任务会被标记为浅色的背景。 任务在执行状态时显示深色背景。 处于ready状态的任务,在开始执行前会被显示在浅灰色的栏中。
notion image
  • 每一行代表一个上下文项目,优先级从高到低排列
 
 
 
  • 缓冲区与红色溢出块
notion image
原因:事件产生速率快于RTT传输速率,导致缓冲区很快被填满导致事件溢出
解决:要么降低事件产生速率,要么加大RTT传输速率
  • Events窗口
notion image
Events窗口显示系统发送的所有事件,并显示它们的信息。每个事件都有以下几项:
  • 在列表中定位事件的ID。
  • 在目标时间或记录时间内的时间戳,可以用微秒或纳秒分辨率显示
  • 创建Events的上下文,即运行的任务。
  • Event描述,和事件类型一起显示,(IRS进入和退出,任务活动,API调用)。
  • Event细节描述事件的参数,即API调用参数。
notion image
notion image
  • Terminal窗口
    • 功能类似串口
    • 终端窗口显示来自目标应用程序的printf输出,以及发出log输出的任务上下文,以及发送消息时的时间戳。
    • notion image
如何使用?
Terminal窗口显示的是输出的指示器。显示的日志级别可以通过View->Message Indicators.. 来配置。
notion image
  • CPU Load窗口
notion image
CPU load窗口显示了一个周期内上下文占用的CPU时间。CPU负载是用一个使用Timeline当前分辨率的bin的宽度来测量的,因此与缩放级别是同步的。 可以通过选择bin的数量用来测量较短或较长时期的负载。使用一个bin,就可以在整个可见的时间轴上测量CPU负载。
  • Context窗口
    • notion image
    • 上下文名称和类型
    • 任务堆栈信息(如果有的话)
    • 上下文的活动计数
    • 总阻塞时间
    • 总的运行时间和最后运行时间
    • CPU负载
    • 每秒当前的、最小和最大允许时间,单位是ms和%
  • 系统信息(System Information)窗口
    • notion image
  • 系统的一些信息,是由应用程序发送用来识别该系统的。
  • 记录属性,可由用户设置。
  • 有关任务、中断、SystemView事件和记录吞吐量的统计信息。
notion image
 

4 My Systemview

第一个点cpu.c 以及使能
第二个点任务的命名以及传递给systemview
main.c
  • SEGGER_SYSVIEW_NameResource((U32)OSTCBPrioTbl[10], (const char *)pname);
    • 这个的第一个参数需要传递这个任务的TCB指针
  • 值得改进的点是,创建任务,设置任务名,获得任务名并将其传递给systemview是不是可以封装成一个函数 main.c
    notion image
    2-5 任务上下文切换2-6-1 uC/OSII 在STM32上的移植
    Loading...
    🐟🐟
    🐟🐟
    在坚冰还盖着北海的时候,我看到了怒放的梅花
    最新发布
    2-6-1 uC/OSII 在STM32上的移植
    2025-6-2
    Chapter2:Kernel of ERTOS
    2025-5-31
    2-2 ARM STM32 事件驱动机制
    2025-5-31
    2-5 任务上下文切换
    2025-5-31
    2-7 Systemview与任务级调试
    2025-5-31
    2-3 ARM STM32 时间驱动机制
    2025-5-29
    公告
    🎉NotionNext 3.15已上线🎉
    -- 感谢您的支持 ---
    👏欢迎更新体验👏