334 lines
17 KiB
C
334 lines
17 KiB
C
/*********************************************************************
|
|
* 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 *
|
|
* *
|
|
**********************************************************************
|
|
* *
|
|
* All rights reserved. *
|
|
* *
|
|
* SEGGER strongly recommends to not make any changes *
|
|
* to or modify the source code of this software in order to stay *
|
|
* compatible with the RTT protocol and J-Link. *
|
|
* *
|
|
* Redistribution and use in source and binary forms, with or *
|
|
* without modification, are permitted provided that the following *
|
|
* conditions are met: *
|
|
* *
|
|
* o Redistributions of source code must retain the above copyright *
|
|
* notice, this list of conditions and the following disclaimer. *
|
|
* *
|
|
* o Redistributions in binary form must reproduce the above *
|
|
* copyright notice, this list of conditions and the following *
|
|
* disclaimer in the documentation and/or other materials provided *
|
|
* with the distribution. *
|
|
* *
|
|
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
|
|
* nor the names of its contributors may be used to endorse or *
|
|
* promote products derived from this software without specific *
|
|
* prior written permission. *
|
|
* *
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
|
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
|
* DAMAGE. *
|
|
* *
|
|
**********************************************************************
|
|
* *
|
|
* SystemView version: V2.42 *
|
|
* *
|
|
**********************************************************************
|
|
-------------------------- END-OF-HEADER -----------------------------
|
|
File : SEGGER_SYSVIEW.h
|
|
Purpose : System visualization API.
|
|
Revision: $Rev: 5626 $
|
|
*/
|
|
|
|
#ifndef SEGGER_SYSVIEW_H
|
|
#define SEGGER_SYSVIEW_H
|
|
|
|
/*********************************************************************
|
|
*
|
|
* #include Section
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#include "SEGGER.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Defines, fixed
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#define SEGGER_SYSVIEW_VERSION 21000
|
|
|
|
#define SEGGER_SYSVIEW_INFO_SIZE 9 // Minimum size, which has to be reserved for a packet. 1-2 byte of message type, 0-2 byte of payload length, 1-5 bytes of timestamp.
|
|
#define SEGGER_SYSVIEW_QUANTA_U32 5 // Maximum number of bytes to encode a U32, should be reserved for each 32-bit value in a packet.
|
|
|
|
#define SEGGER_SYSVIEW_LOG (0u)
|
|
#define SEGGER_SYSVIEW_WARNING (1u)
|
|
#define SEGGER_SYSVIEW_ERROR (2u)
|
|
#define SEGGER_SYSVIEW_FLAG_APPEND (1u << 6)
|
|
|
|
#define SEGGER_SYSVIEW_PREPARE_PACKET(p) (p) + 4
|
|
//
|
|
// SystemView events. First 32 IDs from 0 .. 31 are reserved for these
|
|
//
|
|
#define SYSVIEW_EVTID_NOP 0 // Dummy packet.
|
|
#define SYSVIEW_EVTID_OVERFLOW 1
|
|
#define SYSVIEW_EVTID_ISR_ENTER 2
|
|
#define SYSVIEW_EVTID_ISR_EXIT 3
|
|
#define SYSVIEW_EVTID_TASK_START_EXEC 4
|
|
#define SYSVIEW_EVTID_TASK_STOP_EXEC 5
|
|
#define SYSVIEW_EVTID_TASK_START_READY 6
|
|
#define SYSVIEW_EVTID_TASK_STOP_READY 7
|
|
#define SYSVIEW_EVTID_TASK_CREATE 8
|
|
#define SYSVIEW_EVTID_TASK_INFO 9
|
|
#define SYSVIEW_EVTID_TRACE_START 10
|
|
#define SYSVIEW_EVTID_TRACE_STOP 11
|
|
#define SYSVIEW_EVTID_SYSTIME_CYCLES 12
|
|
#define SYSVIEW_EVTID_SYSTIME_US 13
|
|
#define SYSVIEW_EVTID_SYSDESC 14
|
|
#define SYSVIEW_EVTID_USER_START 15
|
|
#define SYSVIEW_EVTID_USER_STOP 16
|
|
#define SYSVIEW_EVTID_IDLE 17
|
|
#define SYSVIEW_EVTID_ISR_TO_SCHEDULER 18
|
|
#define SYSVIEW_EVTID_TIMER_ENTER 19
|
|
#define SYSVIEW_EVTID_TIMER_EXIT 20
|
|
#define SYSVIEW_EVTID_STACK_INFO 21
|
|
#define SYSVIEW_EVTID_MODULEDESC 22
|
|
|
|
#define SYSVIEW_EVTID_INIT 24
|
|
#define SYSVIEW_EVTID_NAME_RESOURCE 25
|
|
#define SYSVIEW_EVTID_PRINT_FORMATTED 26
|
|
#define SYSVIEW_EVTID_NUMMODULES 27
|
|
#define SYSVIEW_EVTID_END_CALL 28
|
|
#define SYSVIEW_EVTID_TASK_TERMINATE 29
|
|
|
|
#define SYSVIEW_EVTID_EX 31
|
|
//
|
|
// Event masks to disable/enable events
|
|
//
|
|
#define SYSVIEW_EVTMASK_NOP (1 << SYSVIEW_EVTID_NOP)
|
|
#define SYSVIEW_EVTMASK_OVERFLOW (1 << SYSVIEW_EVTID_OVERFLOW)
|
|
#define SYSVIEW_EVTMASK_ISR_ENTER (1 << SYSVIEW_EVTID_ISR_ENTER)
|
|
#define SYSVIEW_EVTMASK_ISR_EXIT (1 << SYSVIEW_EVTID_ISR_EXIT)
|
|
#define SYSVIEW_EVTMASK_TASK_START_EXEC (1 << SYSVIEW_EVTID_TASK_START_EXEC)
|
|
#define SYSVIEW_EVTMASK_TASK_STOP_EXEC (1 << SYSVIEW_EVTID_TASK_STOP_EXEC)
|
|
#define SYSVIEW_EVTMASK_TASK_START_READY (1 << SYSVIEW_EVTID_TASK_START_READY)
|
|
#define SYSVIEW_EVTMASK_TASK_STOP_READY (1 << SYSVIEW_EVTID_TASK_STOP_READY)
|
|
#define SYSVIEW_EVTMASK_TASK_CREATE (1 << SYSVIEW_EVTID_TASK_CREATE)
|
|
#define SYSVIEW_EVTMASK_TASK_INFO (1 << SYSVIEW_EVTID_TASK_INFO)
|
|
#define SYSVIEW_EVTMASK_TRACE_START (1 << SYSVIEW_EVTID_TRACE_START)
|
|
#define SYSVIEW_EVTMASK_TRACE_STOP (1 << SYSVIEW_EVTID_TRACE_STOP)
|
|
#define SYSVIEW_EVTMASK_SYSTIME_CYCLES (1 << SYSVIEW_EVTID_SYSTIME_CYCLES)
|
|
#define SYSVIEW_EVTMASK_SYSTIME_US (1 << SYSVIEW_EVTID_SYSTIME_US)
|
|
#define SYSVIEW_EVTMASK_SYSDESC (1 << SYSVIEW_EVTID_SYSDESC)
|
|
#define SYSVIEW_EVTMASK_USER_START (1 << SYSVIEW_EVTID_USER_START)
|
|
#define SYSVIEW_EVTMASK_USER_STOP (1 << SYSVIEW_EVTID_USER_STOP)
|
|
#define SYSVIEW_EVTMASK_IDLE (1 << SYSVIEW_EVTID_IDLE)
|
|
#define SYSVIEW_EVTMASK_ISR_TO_SCHEDULER (1 << SYSVIEW_EVTID_ISR_TO_SCHEDULER)
|
|
#define SYSVIEW_EVTMASK_TIMER_ENTER (1 << SYSVIEW_EVTID_TIMER_ENTER)
|
|
#define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT)
|
|
#define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO)
|
|
#define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC)
|
|
|
|
#define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT)
|
|
#define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE)
|
|
#define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED)
|
|
#define SYSVIEW_EVTMASK_NUMMODULES (1 << SYSVIEW_EVTID_NUMMODULES)
|
|
#define SYSVIEW_EVTMASK_END_CALL (1 << SYSVIEW_EVTID_END_CALL)
|
|
#define SYSVIEW_EVTMASK_TASK_TERMINATE (1 << SYSVIEW_EVTID_TASK_TERMINATE)
|
|
|
|
#define SYSVIEW_EVTMASK_EX (1 << SYSVIEW_EVTID_EX)
|
|
|
|
#define SYSVIEW_EVTMASK_ALL_INTERRUPTS ( SYSVIEW_EVTMASK_ISR_ENTER \
|
|
| SYSVIEW_EVTMASK_ISR_EXIT \
|
|
| SYSVIEW_EVTMASK_ISR_TO_SCHEDULER)
|
|
#define SYSVIEW_EVTMASK_ALL_TASKS ( SYSVIEW_EVTMASK_TASK_START_EXEC \
|
|
| SYSVIEW_EVTMASK_TASK_STOP_EXEC \
|
|
| SYSVIEW_EVTMASK_TASK_START_READY \
|
|
| SYSVIEW_EVTMASK_TASK_STOP_READY \
|
|
| SYSVIEW_EVTMASK_TASK_CREATE \
|
|
| SYSVIEW_EVTMASK_TASK_INFO \
|
|
| SYSVIEW_EVTMASK_STACK_INFO \
|
|
| SYSVIEW_EVTMASK_TASK_TERMINATE)
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Structures
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
typedef struct {
|
|
U32 TaskID;
|
|
const char* sName;
|
|
U32 Prio;
|
|
U32 StackBase;
|
|
U32 StackSize;
|
|
} SEGGER_SYSVIEW_TASKINFO;
|
|
|
|
typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE;
|
|
|
|
struct SEGGER_SYSVIEW_MODULE_STRUCT {
|
|
const char* sModule;
|
|
U32 NumEvents;
|
|
U32 EventOffset;
|
|
void (*pfSendModuleDesc)(void);
|
|
SEGGER_SYSVIEW_MODULE* pNext;
|
|
};
|
|
|
|
typedef void (SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC)(void);
|
|
|
|
/*********************************************************************
|
|
*
|
|
* API functions
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
typedef struct {
|
|
U64 (*pfGetTime) (void);
|
|
void (*pfSendTaskList) (void);
|
|
} SEGGER_SYSVIEW_OS_API;
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Control and initialization functions
|
|
*/
|
|
void SEGGER_SYSVIEW_Init (U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc);
|
|
void SEGGER_SYSVIEW_SetRAMBase (U32 RAMBaseAddress);
|
|
void SEGGER_SYSVIEW_Start (void);
|
|
void SEGGER_SYSVIEW_Stop (void);
|
|
void SEGGER_SYSVIEW_GetSysDesc (void);
|
|
void SEGGER_SYSVIEW_SendTaskList (void);
|
|
void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo);
|
|
void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc);
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Event recording functions
|
|
*/
|
|
void SEGGER_SYSVIEW_RecordVoid (unsigned int EventId);
|
|
void SEGGER_SYSVIEW_RecordU32 (unsigned int EventId, U32 Para0);
|
|
void SEGGER_SYSVIEW_RecordU32x2 (unsigned int EventId, U32 Para0, U32 Para1);
|
|
void SEGGER_SYSVIEW_RecordU32x3 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2);
|
|
void SEGGER_SYSVIEW_RecordU32x4 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3);
|
|
void SEGGER_SYSVIEW_RecordU32x5 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4);
|
|
void SEGGER_SYSVIEW_RecordU32x6 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5);
|
|
void SEGGER_SYSVIEW_RecordU32x7 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6);
|
|
void SEGGER_SYSVIEW_RecordU32x8 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7);
|
|
void SEGGER_SYSVIEW_RecordU32x9 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8);
|
|
void SEGGER_SYSVIEW_RecordU32x10 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9);
|
|
void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString);
|
|
void SEGGER_SYSVIEW_RecordSystime (void);
|
|
void SEGGER_SYSVIEW_RecordEnterISR (U32 IrqId);
|
|
void SEGGER_SYSVIEW_RecordExitISR (void);
|
|
void SEGGER_SYSVIEW_RecordExitISRToScheduler (void);
|
|
void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId);
|
|
void SEGGER_SYSVIEW_RecordExitTimer (void);
|
|
void SEGGER_SYSVIEW_RecordEndCall (unsigned int EventID);
|
|
void SEGGER_SYSVIEW_RecordEndCallU32 (unsigned int EventID, U32 Para0);
|
|
|
|
void SEGGER_SYSVIEW_OnIdle (void);
|
|
void SEGGER_SYSVIEW_OnTaskCreate (U32 TaskId);
|
|
void SEGGER_SYSVIEW_OnTaskTerminate (U32 TaskId);
|
|
void SEGGER_SYSVIEW_OnTaskStartExec (U32 TaskId);
|
|
void SEGGER_SYSVIEW_OnTaskStopExec (void);
|
|
void SEGGER_SYSVIEW_OnTaskStartReady (U32 TaskId);
|
|
void SEGGER_SYSVIEW_OnTaskStopReady (U32 TaskId, unsigned int Cause);
|
|
void SEGGER_SYSVIEW_OnUserStart (unsigned int UserId); // Start of user defined event (such as a subroutine to profile)
|
|
void SEGGER_SYSVIEW_OnUserStop (unsigned int UserId); // Start of user defined event
|
|
|
|
void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName);
|
|
|
|
int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId);
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Event parameter encoding functions
|
|
*/
|
|
U8* SEGGER_SYSVIEW_EncodeU32 (U8* pPayload, U32 Value);
|
|
U8* SEGGER_SYSVIEW_EncodeData (U8* pPayload, const char* pSrc, unsigned int Len);
|
|
U8* SEGGER_SYSVIEW_EncodeString (U8* pPayload, const char* s, unsigned int MaxLen);
|
|
U8* SEGGER_SYSVIEW_EncodeId (U8* pPayload, U32 Id);
|
|
U32 SEGGER_SYSVIEW_ShrinkId (U32 Id);
|
|
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Middleware module registration
|
|
*/
|
|
void SEGGER_SYSVIEW_RegisterModule (SEGGER_SYSVIEW_MODULE* pModule);
|
|
void SEGGER_SYSVIEW_RecordModuleDescription (const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription);
|
|
void SEGGER_SYSVIEW_SendModule (U8 ModuleId);
|
|
void SEGGER_SYSVIEW_SendModuleDescription (void);
|
|
void SEGGER_SYSVIEW_SendNumModules (void);
|
|
|
|
/*********************************************************************
|
|
*
|
|
* printf-Style functions
|
|
*/
|
|
#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list
|
|
void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...);
|
|
void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...);
|
|
void SEGGER_SYSVIEW_PrintfHost (const char* s, ...);
|
|
void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...);
|
|
void SEGGER_SYSVIEW_WarnfHost (const char* s, ...);
|
|
void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...);
|
|
void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...);
|
|
void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...);
|
|
#endif
|
|
|
|
void SEGGER_SYSVIEW_Print (const char* s);
|
|
void SEGGER_SYSVIEW_Warn (const char* s);
|
|
void SEGGER_SYSVIEW_Error (const char* s);
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Run-time configuration functions
|
|
*/
|
|
void SEGGER_SYSVIEW_EnableEvents (U32 EnableMask);
|
|
void SEGGER_SYSVIEW_DisableEvents (U32 DisableMask);
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Application-provided functions
|
|
*/
|
|
void SEGGER_SYSVIEW_Conf (void);
|
|
U32 SEGGER_SYSVIEW_X_GetTimestamp (void);
|
|
U32 SEGGER_SYSVIEW_X_GetInterruptId (void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/*************************** End of file ****************************/
|