章节5 目标板程序SystemView模块的实现 - Segger SystemView使用手册(译文)
2017-11-12 22:42
316 查看
本文博客链接:http://blog.csdn.net/bjr2016,作者:bjr2016,未经允许不得转载。
要实现连续实时跟踪,还有以下几项要求:
一个ARM Cortex-M 或者 Renesas RX 核的目标设备
一个J-Link调试器
要想快速把SystemView用起来,推荐使用embOS V4.12或者更新版本(已经集成在SystemView中了)。
示例
例如一个在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。
SEGGER SystemView的通用部分现在已经准备好监视应用程序了。
当使用启用了分析功能的embOS V4.12或更高版本时,将生成中断、任务和API调用这四种SystemView事件。当不使用embOS时,应用程序必须产生适当的事件。
将应用程序下载到目标板并运行。只要SystemView程序没有连接,并且不调用SEGGER_SYSVIEW_Start(),应用程序就不会生成SystemView事件。当连接了SystemView程序或者调用了SEGGER_SYSVIEW_Start时,它将激活记录SystemView事件。
对于single-shot录制,在应用程序中必须调用SEGGER_SYSVIEW_Start,用来激活录制SystemView事件。事件会一直被记录,直到SystemView缓冲区被填满或调用了SEGGER_SYSVIEW_Stop。
对于事后分析,在应用程序中必须调用SEGGER_SYSVIEW_Start,用来激活录制SystemView事件。事件会一直被记录,直到调用了SEGGER_SYSVIEW_Stop。当SystemView缓冲区被填满时,老的事件将被覆盖。
章节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: support@segger.com * * * ********************************************************************** * * * 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 * ******************* 4000 *************************************************** */ // 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 ****************************/
相关文章推荐
- 章节9 性能和资源使用 - Segger SystemView使用手册(译文)
- 章节7 支持的CPU - Segger SystemView使用手册(译文)
- 章节10 集成向导 - Segger SystemView使用手册(译文)
- 章节1 概述 - Segger SystemView使用手册(译文)
- 章节12 常见问题 - Segger SystemView使用手册(译文)
- UIScrollView实现程序启动,使用说明效果
- Netty5用户手册之三:使用netty实现EchoServer程序
- python使用fcntl模块实现程序加锁功能示例
- Android开发使用Viewpager实现程序引导界面
- UIScrollView实现程序启动,使用说明效果
- 微信小程序上拉刷新和下拉加载2种方法实现,onPullDownRefresh,scroll-view使用
- 小程序 使用scroll-view实现上拉加载,下拉刷新
- 微信小程序中使用scroll-view控件实现上拉加载更多遇到的坑
- 转“使用System.Timers.Timer类实现程序定时执行”
- 微信小程序,使用scroll-view实现下拉加载更多(下一页)源码
- 微信小程序例子——如何使用scroll-view组件实现视图垂直滚动
- SilverLight:使用MVVM实现View层在程序运行时自动生成控件并且取得其值 (转)
- iOS程序开发之使用PlaceholderImageView实现优雅的图片加载效果
- Android程序:使用ViewPager实现app引导页效果
- Linux下使用system()和execv()实现对外部程序的调用