章节5 目标板程序SystemView模块的实现 - Segger SystemView使用手册(译文)

本文博客链接:http://blog.csdn.net/bjr2016,作者:bjr2016,未经允许不得转载。

章节5 目标板程序SystemView模块的实现


本节描述了目标应用程序如何添加SEGGER SystemView模块。

5.1 先决条件

想要使用SEGGER SystemView,首先要把SystemView源码文件加到目标应用程序工程中。SEGGER SystemView源码包可以从https://www.segger.com/systemview.html下载。

要实现连续实时跟踪,还有以下几项要求:

  • 一个ARM Cortex-M 或者 Renesas RX 核的目标设备
  • 一个J-Link调试器

要想快速把SystemView用起来,推荐使用embOS V4.12或者更新版本(已经集成在SystemView中了)。

5.1 SEGGER SystemView目标实现模块

以下文件是SEGGER SystemView目标实现的一部分。我们建议将所有文件复制到应用程序工程中,并维持目录结构。

文件 描述
/Config/Global.h SEGGER代码的全局类型定义
/Config/SEGGER_RTT_Conf.h SEGGER RTT配置文件
/Config/SEGGER_SYSVIEW_Conf.h SEGGER SYSTEMVIEW配置文件
/Config/SEGGER_SYSVIEW_Config_[SYSTEM].c [SYSTEM]的SystemView初始化
/OS/SEGGER_SYSVIEW_[OS].c SYSTEMVIEW和[OS]之间的接口
/OS/SEGGER_SYSVIEW_[OS].h 接口头文件
/SEGGER/SEGGER.h 定义了SEGGER全局类型的全局头文件和通用函数
/SEGGER/SEGGER_RTT.c SEGGER RTT模块源码
/SEGGER/SEGGER_RTT.h SEGGER RTT模块头文件
/SEGGER/SEGGER_SYSVIEW.c SEGGER SYSTEMVIEW模块源码
/SEGGER/SEGGER_SYSVIEW.h SEGGER SYSTEMVIEW模块头文件
/SEGGER/SEGGER_SYSVIEW_ConfDefault.h SEGGER SYSTEMVIEW模块默认配置头文件
/SEGGER/SEGGER_SYSVIEW_Int.h 用于SEGGER SYSTEMVIEW模块内部调用的头文件

5.2 在应用程序中引用SEGGER_SystemView

要使用SEGGER SystemView,目标实现模块必须添加到目标程序中。从文件夹/Config/和/SEGGER/中拷贝源码文件,以及复制匹配你程序所使用的系统和OS的SEGGER_SYSVIEW_Config_[SYSTEM].c和SEGGER_SYSVIEW_[OS].c及其头文件,并在工程中引用它们。

示例

例如一个在Cortex-M3芯片上使用了embOS的系统,那么应该引用 SEGGER_SYSVIEW_Config_embOS.c,SEGGER_SYSVIEW_embOS.c和SEGGER_SYSVIEW_embOS.h。

而对于一个在Cortex-M3芯片上的没有操作系统或者no instrumented OS的系统,那么只需要引用 SEGGER_SYSVIEW_NoOS.c。

5.3 初始化SystemView

系统信息是由应用程序发送的。这个信息可以通过SEGGER_SYSVIEW_Config_[SYSTEM]. c中的定义来配置。我们可以在main函数中添加一个调用SEGGER_SYSVIEW_Conf()来初始化SystemView。

#include "SEGGER_SYSVIEW.h"
/*********************************************************************
*
* main()
*
* Function description
* Application entry point
*/
    int main(void) {
    OS_IncDI(); /* Initially disable interrupts */
    OS_InitKern(); /* Initialize OS */
    OS_InitHW(); /* Initialize Hardware for OS */
    BSP_Init(); /* Initialize BSP module */


    /* You need to create at least one task before calling OS_Start() */
    OS_CREATETASK(&TCB0, "MainTask", MainTask, 100, Stack0);
    OS_Start(); /* Start multitasking */
    return 0;
}

SEGGER SystemView的通用部分现在已经准备好监视应用程序了。
当使用启用了分析功能的embOS V4.12或更高版本时,将生成中断、任务和API调用这四种SystemView事件。当不使用embOS时,应用程序必须产生适当的事件。

将应用程序下载到目标板并运行。只要SystemView程序没有连接,并且不调用SEGGER_SYSVIEW_Start(),应用程序就不会生成SystemView事件。当连接了SystemView程序或者调用了SEGGER_SYSVIEW_Start时,它将激活记录SystemView事件。

5.4 启动和停止录制

当使用SystemView连续读取数据时,SystemView自动开始和停止记录。当SystemView没有录制时,目标系统不会生成SystemView事件。
对于single-shot录制,在应用程序中必须调用SEGGER_SYSVIEW_Start,用来激活录制SystemView事件。事件会一直被记录,直到SystemView缓冲区被填满或调用了SEGGER_SYSVIEW_Stop。
对于事后分析,在应用程序中必须调用SEGGER_SYSVIEW_Start,用来激活录制SystemView事件。事件会一直被记录,直到调用了SEGGER_SYSVIEW_Stop。当SystemView缓冲区被填满时,老的事件将被覆盖。

5.5 SystemView系统信息配置**

SEGGER_SYSVIEW_Config_[SYSTEM].c文件提供了SystemView的配置。大多数情况下,不需要修改就可以使用。

/*********************************************************************
*                SEGGER Microcontroller GmbH & Co. KG                *
*                        The Embedded Experts                        *
**********************************************************************
*                                                                    *
*       (c) 2015 - 2017  SEGGER Microcontroller GmbH & Co. KG        *
*                                                                    *
*       www.segger.com     Support: [email protected]               *
*                                                                    *
**********************************************************************
*                                                                    *
*       SEGGER SystemView * Real-time application analysis           *
*                                                                    *
**********************************************************************
*                                                                    *
*       SystemView version: V2.52a                                    *
*                                                                    *
**********************************************************************
-------------------------- END-OF-HEADER -----------------------------

File    : SEGGER_SYSVIEW_Config_embOS.c
Purpose : Sample setup configuration of SystemView with embOS.
Revision: $Rev: 7750 $
*/
#include "RTOS.h"
#include "SEGGER_SYSVIEW.h"
#include "SEGGER_SYSVIEW_Conf.h"
#include "SEGGER_SYSVIEW_embOS.h"

//
// SystemcoreClock can be used in most CMSIS compatible projects.
// In non-CMSIS projects define SYSVIEW_CPU_FREQ.
//
extern unsigned int SystemCoreClock;

/*********************************************************************
*
*       Defines, configurable
*
**********************************************************************
*/
// The application name to be displayed in SystemViewer
#ifndef   SYSVIEW_APP_NAME
  #define SYSVIEW_APP_NAME        "Demo Application"
#endif

// The target device name
#ifndef   SYSVIEW_DEVICE_NAME
  #define SYSVIEW_DEVICE_NAME     "Cortex-M4"
#endif

// Frequency of the timestamp. Must match SEGGER_SYSVIEW_Conf.h
#ifndef   SYSVIEW_TIMESTAMP_FREQ
  #define SYSVIEW_TIMESTAMP_FREQ  (SystemCoreClock)
#endif

// System Frequency. SystemcoreClock is used in most CMSIS compatible projects.
#ifndef   SYSVIEW_CPU_FREQ
  #define SYSVIEW_CPU_FREQ        (SystemCoreClock)
#endif

// The lowest RAM address used for IDs (pointers)
#ifndef   SYSVIEW_RAM_BASE
  #define SYSVIEW_RAM_BASE        (0x20000000)
#endif

#ifndef   SYSVIEW_SYSDESC0
  #define SYSVIEW_SYSDESC0        "I#15=SysTick"
#endif

// Define as 1 if the Cortex-M cycle counter is used as SystemView timestamp. Must match SEGGER_SYSVIEW_Conf.h
#ifndef   USE_CYCCNT_TIMESTAMP
  #define USE_CYCCNT_TIMESTAMP    1
#endif

// Define as 1 if the Cortex-M cycle counter is used and there might be no debugger attached while recording.
#ifndef   ENABLE_DWT_CYCCNT
  #define ENABLE_DWT_CYCCNT       (USE_CYCCNT_TIMESTAMP & SEGGER_SYSVIEW_POST_MORTEM_MODE)
#endif

//#ifndef   SYSVIEW_SYSDESC1
//  #define SYSVIEW_SYSDESC1      ""
//#endif

//#ifndef   SYSVIEW_SYSDESC2
//  #define SYSVIEW_SYSDESC2      ""
//#endif

/*********************************************************************
*
*       Defines, fixed
*
**********************************************************************
*/
#define DEMCR                     (*(volatile OS_U32*) (0xE000EDFCuL))  // Debug Exception and Monitor Control Register
#define TRACEENA_BIT              (1uL << 24)                           // Trace enable bit
#define DWT_CTRL                  (*(volatile OS_U32*) (0xE0001000uL))  // DWT Control Register
#define NOCYCCNT_BIT              (1uL << 25)                           // Cycle counter support bit
#define CYCCNTENA_BIT             (1uL << 0)                            // Cycle counter enable bit

/*********************************************************************
*
*       _cbSendSystemDesc()
*
*  Function description
*    Sends SystemView description strings.
*/
static void _cbSendSystemDesc(void) {
  SEGGER_SYSVIEW_SendSysDesc("N=" SYSVIEW_APP_NAME ",O=embOS,D=" SYSVIEW_DEVICE_NAME);
#ifdef SYSVIEW_SYSDESC0
  SEGGER_SYSVIEW_SendSysDesc(SYSVIEW_SYSDESC0);
#endif
#ifdef SYSVIEW_SYSDESC1
  SEGGER_SYSVIEW_SendSysDesc(SYSVIEW_SYSDESC1);
#endif
#ifdef SYSVIEW_SYSDESC2
  SEGGER_SYSVIEW_SendSysDesc(SYSVIEW_SYSDESC2);
#endif
}

/*********************************************************************
*
*       Global functions
*
**********************************************************************
*/
void SEGGER_SYSVIEW_Conf(void) {
#if USE_CYCCNT_TIMESTAMP
#if ENABLE_DWT_CYCCNT
  //
  // If no debugger is connected, the DWT must be enabled by the application
  //
  if ((DEMCR & TRACEENA_BIT) == 0) {
    DEMCR |= TRACEENA_BIT;
  }
#endif
  //
  //  The cycle counter must be activated in order
  //  to use time related functions.
  //
  if ((DWT_CTRL & NOCYCCNT_BIT) == 0) {       // Cycle counter supported?
    if ((DWT_CTRL & CYCCNTENA_BIT) == 0) {    // Cycle counter not enabled?
      DWT_CTRL |= CYCCNTENA_BIT;              // Enable Cycle counter
    }
  }
#endif
  SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ,
                      &SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc);
  SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);
  OS_SetTraceAPI(&embOS_TraceAPI_SYSVIEW);    // Configure embOS to use SYSVIEW.
}

/*************************** End of file ****************************/

你可能感兴趣的:(segger)