你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于SEGGER SystemView的功能介绍与使用

[复制链接]
sjtu_zhang 发布时间:2018-6-7 13:09
本帖最后由 sjtu_zhang 于 2018-6-7 14:04 编辑
( d/ S5 T) [2 ~' ~4 Z) w
5 f7 L( ?% p# n4 B

前几天浏览网页看到有关于SystemView的介绍,觉得很有用,花了点时间研究了一下,效果还不错。在论坛里搜索了一下已经有朋友在FreeRTOS用上了,我这里是用在UCOS上的,分享给大家。

首先什么是SystemView?

“SystemView 是一个用于虚拟分析嵌入式系统的工具包。SystemView 可以完整的深入观察一个应用程序的运行时行为,这远远超出一个调试器所能提供的。这在开发和处理具有多个线程和事件的复杂系统时尤其有效。”
' T# l% J& {- v: m4 g+ L( }官方的介绍在这里http://www.segger.com/products/development-tools/systemview/,感兴趣的朋友可以去看英文的说明。另外有位朋友的博客上有中文翻译,链接在这里http://blog.csdn.net/bjr2016,非常感谢。

SystemView的原理简单来讲是这样的:首先上位机PC端有一个处理程序,下位机ARM上需增加部分代码,用于记录嵌入式系统的一些数据,通过连接的仿真器接口将数据传输到上位机,然后PC端的处理程序处理这些数据,由于数据传输使用的是SEGGER J-link的实时传输技术(RTT),所以SystemView可以实时分析和展示数据。分析的内容包括中断、任务、软件定时器执行的时间,切换的时间,以及发生的事件等,这些分析都是实时的,丝毫不影响下位机的运行。这样就可以验证我们设计的整个嵌入式系统是否按照我们的预期在工作,比如任务的切换逻辑,中断的触发等。它可以应用于带有RTOS的系统,也支持裸机,对于下位机资源的消耗量也是比较少的。

使用方法:

由于我自己的项目是基于UCOS,所以这里我仅给出UCOS下的实现方法。Micrium官方也有介绍以及使用指导,地址:http://doc.micrium.com/display/osiiidoc/Including+SystemView,可以参照这个网页的介绍,如果不想阅读英文文档的朋友,那就按照我写的步骤来吧。

准备工作:UCOSIII(内核版本3.06.00以上,原因是从这个版本开始UCOSIII内部就集成了SystemView的功能,移植起来很方便)。PC端SystemView安装包(当前版本2.52),下位机SystemView源码包(当前版本2.52),下载地址:http://www.segger.com/products/development-tools/systemview/

说明:Micirum官方还没有放出UCOSIII内核版本3.06.00以上的源码包,我是从Micirum网站上提供的移植好的其他开发板工程里面提取的,比如这个:http://www.micrium.com/download/stm32f746g-disco_flash-drive/,内核是3.06.00,我自己用的是3.06.02的内核。另外官方并没有给出3.06.00版本的UCOSIII对应Keil的port移植文件。这个就用以前版本内核的移植文件就好了。

步骤:

(1)将SystemView源码包拷贝至项目工程中,添加对应操作系统的文件(SEGGER_SYSVIEW_Config_uCOSIII.c 和SEGGER_SYSVIEW_uCOSIII.c )以及SEGGER_RTT.c和SEGGER_SYSVIEW.c。

(2)配置os_cfg.h

  1. #define OS_CFG_TRACE_EN                      DEF_ENABLED8 T& I4 P# G3 u4 B0 M
  2. #define OS_CFG_TRACE_API_ENTER_EN    DEF_ENABLED
    0 N* N, }7 L/ `* f( ?' n6 _; j
  3. #define OS_CFG_TRACE_API_EXIT_EN       DEF_ENABLED
复制代码

注:打开API_ENTER和API_EXIT之后会增加触发的SystemView事件数量,这可能导致SystemView出现overflow的问题。如果这样的话disable这两个宏定义。

(3)配置os_cfg_trace.h

  1. #define OS_CFG_TRACE_MAX_TASK                      32u9 H8 l3 f* X  m. ^) B2 M2 c
  2. #define OS_CFG_TRACE_MAX_RESOURCES            256u
复制代码

(4)配置SEGGER_RTT_Conf.h

  1. #define BUFFER_SIZE_UP                                     4096u
复制代码

(5)配置SEGGER_SYSVIEW_Conf.h

  1. #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE       4096u
复制代码

(6)修改SEGGER_SYSVIEW_Config_uCOSIII.c

在这个文件中有两个宏函数:

SYSVIEW_TIMESTAMP_FREQ

SYSVIEW_CPU_FREQ

原始文件两个函数都定义为BSP_ClkFreqGet(BSP_CLK_ID_SYSCLK),这个需要根据使用的具体ARM型号实现,这里给出STM32F429的实现函数:


0 o1 P. h. m3 Q* V% E+ V& ^5 XHAL_RCC_GetSysClockFreq(); (这个是基于ST的HAL库函数)
8 c# |5 P4 g! Q8 z  i& z$ |* p; g* e

另外定义:

  1. #define SYSVIEW_RAM_BASE       0x20000000
复制代码

这个是F429的RAM起始地址。

Tips:如果希望在SystemView中显示具体的中断名称,而不是单调的中断号,可以修改 _cbSendSystemDeesc()函数中对于中断号的描述,比如这样:

  1.   SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick");
    0 D' S) C* ?3 N. U# \- y; W* G
  2.   SEGGER_SYSVIEW_SendSysDesc("I#27=SPI3 RX)");
    # E: G- F; R( V; f- z/ v" m
  3.   SEGGER_SYSVIEW_SendSysDesc("I#32=SPI3 TX");
复制代码

(7)初始化SystemView

在应用程序中增加os_trace.h头文件引用以及调用OS_TRACE_INIT()初始化函数。

(8)修改应用程序代码

在每个中断服务函数的开头和结尾分别加入如下代码:

开头:

  1. CPU_SR_ALLOC();
    ; W! }# ?% c+ K. G# F" q  _( B
  2. CPU_CRITICAL_ENTER();
      i, j( c' l  f( B1 Y2 ]
  3. OSINTEnter();' t9 C) m( o' D) H0 H
  4. CPU_CRITICAL_EXIT();
复制代码

结尾:

  1. OSIntExit();
复制代码

添加了如上所示的代码之后,操作系统的内核就可以记录中断的信息了。

(9)关于UCOS

以上八个步骤完成后,就可以在SystemView中观察到中断的信息,但是看不到我们创建的任务的信息,原因是UCOS的移植port文件,这里需要修改os_cpu_c.c这个文件,注释掉以下代码:

  1. //#if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u))
    3 f% f& B- A% M! |
  2. //      TRACE_OS_TASK_SWITCHED_IN(OSTCBHighRdyPtr);
    # o6 c: U& T+ [" S& d/ h5 y( [
  3. //#endif
复制代码

添加:

  1. #if (defined(OS_CFG_TRACE_EN) && (OS_CFG_TRACE_EN > 0u)), e5 g- F: Z: h! n2 a. I7 B
  2.       OS_TRACE_TASK_SWITCHED_IN(OSTCBHighRdyPtr);
    / m6 x- m% h( f( ?1 W+ [4 `+ R
  3. #endif
复制代码

到这里实际上细心的朋友应该看出来了,UCOSIII之前的版本应该也是支持SystemView的,具体怎么做留给有兴趣的朋友尝试吧。

以上就是详细的使用步骤了,贴一张我自己的结果:

最后说明一下SystemView的免费版本是有记录上限的为100万个,大约可以记录十几秒的信息,一般的调试足够了,pro版本没有限制,可以一直记录,这对于那些偶现的Bug查错很有帮助,当然价钱也很棒。

最后:转载请注明出处。

clipboard.png
收藏 2 评论6 发布时间:2018-6-7 13:09

举报

6个回答
roguebear2012 回答时间:2018-6-7 21:10:00
LZ很屌。 我按照你的教程也跑起来了。 ucosiii stm32f767.  就是信息太多了看不过来,感觉浪费了这么强大的功能。另外这个软件的和谐现在有了,不过要自己修改exe里面的一个字节即可,可以自己百度。希望再接再厉继续挖掘一下深度功能我们跟着学习一下。
roguebear2012 回答时间:2018-6-7 21:39:43
本帖最后由 roguebear2012 于 2018-6-7 22:00 编辑
  H5 x+ {( T' h* _9 t
% ?/ X! X8 ]9 \  B! F0 U目前用着没问题。啥也不动可以一直抓下去。只要按下触摸屏的任意位置,就会出现一个小框
9 W! |0 ^2 n; V% }4 |/ ?+ r7 ]Invalid packet received. Rcording stopped. google了下发现http://forum.segger.com/index.ph ... OS-start-recording/
, N  ~: r$ J7 u% a1 t1 j9 n这个问题是9 ?4 r  p5 A8 b. ^
Problem has been solved via mail. For completeness:
$ s1 o2 s+ \7 {The invalid packets where caused by a locking problem.
; G' x. k9 H, E, [In the SEGGER_SYSVIEW_LOCK() / SEGGER_RTT_LOCK() all interrupts which could create SystemView events should be disabled (masked).) u8 T* d& Z+ g2 j7 Q6 @% M$ M

: M/ r2 N2 K; CFor FreeRTOS and Cortex-M3/4 use either following macro or redirect lock and unlock to the FreeRTOS functions./ f- P* ?# q3 U4 A0 B
2 c: h0 E" L; P7 ]) n6 z2 g
但是这个是针对freertos的。而且2.52a版本里面的freertos里面已经fix了这个bug。
# C' b' h( Y! E/ {不知道ucos keil如何弄?  在keil环境下是这样的:   
- {7 f- E$ H% f& R% Y                #define SEGGER_RTT_LOCK()   {                                                                   \
8 B1 U; M7 X9 i; Q( l                                  unsigned int LockState;                                           \
8 [# r  ~$ h6 k# @: W! _                                  register unsigned char BASEPRI __asm( "basepri");                 \/ ^) z1 Z6 [) f
                                  LockState = BASEPRI;                                              \' D$ `$ e- T1 Y# }& s$ s5 B
                                  BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY;                      \8 j, N' f$ |1 Z- g
                                  __schedule_barrier();        % a- ]4 I2 S$ l) f$ L) e1 y$ U( A
                       
9 p+ I+ C. i) c+ A7 ?  J
7 U9 @! D; N; @0 Z    #define SEGGER_RTT_UNLOCK()   BASEPRI = LockState;                                              \
, |5 t+ n# b: e( [; X+ n                                  __schedule_barrier();                                             \3 J  X+ z  [  Y
                                 }) o; Y- }7 p4 u

7 a( j2 s% e  |* n
sjtu_zhang 回答时间:2018-6-11 08:59:35
roguebear2012 发表于 2018-6-7 21:103 ]1 J( {/ q8 e+ E. }* ]' V
LZ很屌。 我按照你的教程也跑起来了。 ucosiii stm32f767.  就是信息太多了看不过来,感觉浪费了这么强大的 ...
/ w9 D3 P) d, M: D- h- P+ T3 I
多谢,我去找找和谐版。
aimejia 回答时间:2018-6-14 14:44:53
谢谢分享!
何昌昕 回答时间:2018-7-15 20:47:14
楼主,我按照你的步骤移植到F407的时候,能显示出来,不过线程的一些名字和优先级显示不对,调度时间到对的,还有中断也显示不出来
wdliming-222461 回答时间:2019-12-23 11:10:18
能否共享一下工程啊~~~

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版