diff --git a/components/app_trace/sys_view/SEGGER/SEGGER.h b/components/app_trace/sys_view/SEGGER/SEGGER.h index be33c34ca0..f07e946619 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER.h @@ -10,7 +10,7 @@ * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,7 +49,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** ---------------------------------------------------------------------- diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h b/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h index 0fdb2f7177..6e1c758f0d 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_RTT.h @@ -8,7 +8,7 @@ * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -47,7 +47,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** ---------------------------END-OF-HEADER------------------------------ @@ -100,6 +100,10 @@ Revision: $Rev: 25842 $ #define _CORE_HAS_RTT_ASM_SUPPORT 1 #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined(__ARM_ARCH_8_1M_MAIN__)) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); #else #define _CORE_HAS_RTT_ASM_SUPPORT 0 #endif @@ -130,6 +134,10 @@ Revision: $Rev: 25842 $ #define _CORE_HAS_RTT_ASM_SUPPORT 1 #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8_1M_MAIN__) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); @@ -156,6 +164,10 @@ Revision: $Rev: 25842 $ #define _CORE_HAS_RTT_ASM_SUPPORT 1 #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8_1M_MAIN__) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R #define _CORE_NEEDS_DMB 1 #define RTT__DMB() __asm volatile ("dmb\n" : : :); @@ -271,6 +283,7 @@ Revision: $Rev: 25842 $ #ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file #include #include +#include /********************************************************************* * @@ -412,7 +425,7 @@ unsigned SEGGER_RTT_ReadUpBufferNoLock (unsigned BufferIndex, void* pDa unsigned SEGGER_RTT_WriteDownBuffer (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); unsigned SEGGER_RTT_WriteDownBufferNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); -#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly +#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly /********************************************************************* * diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c index 10599986c8..7ce856518f 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.c @@ -3,14 +3,14 @@ * * SPDX-License-Identifier: BSD-1-Clause * - * SPDX-FileContributor: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2023-2025 Espressif Systems (Shanghai) CO LTD */ /********************************************************************* * SEGGER Microcontroller GmbH * * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,14 +49,14 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- File : SEGGER_SYSVIEW.c Purpose : System visualization API implementation. -Revision: $Rev: 28341 $ +Revision: $Rev: 29105 $ Additional information: Packet format: @@ -66,10 +66,10 @@ Additional information: Packets with IDs 24..31 are standard packets with extendible structure and contain a length field. - + Packet ID 31 is used for SystemView extended events. - + Packets with IDs >= 32 always contain a length field. @@ -150,6 +150,7 @@ Additional information: #include #include #include +#include #include "SEGGER_SYSVIEW_Int.h" #include "SEGGER_RTT.h" @@ -188,7 +189,7 @@ Additional information: // Timestamps may be less than full 32-bits, in which case we need to zero // the unused bits to properly handle overflows. // Note that this is a quite common scenario, as a 32-bit time such as -// SysTick might be scaled down to reduce bandwith +// SysTick might be scaled down to reduce bandwidth // or a 16-bit hardware time might be used. #if SEGGER_SYSVIEW_TIMESTAMP_BITS < 32 // Eliminate unused bits in case hardware timestamps are less than 32 bits #define MAKE_DELTA_32BIT(Delta) Delta <<= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; \ @@ -388,8 +389,6 @@ static U8 _NumModules; pDest = pSysviewPointer; \ }; - - #if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; @@ -432,6 +431,9 @@ static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { unsigned int n; const U8* p; + + // Espressif doesn't support larger packages yet. Encode data length must be less than 255. + assert(NumBytes < 255); // n = 0; p = (const U8*)pSrc; @@ -442,8 +444,8 @@ static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { *pPayload++ = (U8)NumBytes; } else { *pPayload++ = 255; - *pPayload++ = (NumBytes & 255); *pPayload++ = ((NumBytes >> 8) & 255); + *pPayload++ = (NumBytes & 255); } while (n < NumBytes) { *pPayload++ = *p++; @@ -452,6 +454,38 @@ static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { return pPayload; } +/********************************************************************* +* +* _EncodeFloat() +* +* Function description +* Encode a float value in variable-length format. +* +* Parameters +* pPayload - Pointer to where value will be encoded. +* Value - Value to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +*/ +static U8* _EncodeFloat(U8* pPayload, float Value) { + float Val = Value; + U8* pSysviewPointer; + U32* SysViewData; + pSysviewPointer = pPayload; + SysViewData = (U32*)&Val; + while((*SysViewData) > 0x7F) { + *pSysviewPointer++ = (U8)((*SysViewData) | 0x80); + (*SysViewData) >>= 7; + }; + *pSysviewPointer++ = (U8)(*SysViewData); + pPayload = pSysviewPointer; + + return pPayload; +} + /********************************************************************* * * _EncodeStr() @@ -475,38 +509,42 @@ static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { * No more than 1 + Limit bytes will be encoded to the payload. */ static U8 *_EncodeStr(U8 *pPayload, const char *pText, unsigned int Limit) { - unsigned int n; - unsigned int Len; - // - // Compute string len - // - Len = 0; - if (pText != NULL) { - while(*(pText + Len) != 0) { - Len++; - } - if (Len > Limit) { - Len = Limit; - } - } - // - // Write Len - // - if (Len < 255) { - *pPayload++ = (U8)Len; + U8* pLen; + const char* sStart; + + if (pText == NULL) { + *pPayload++ = (U8)0; } else { - *pPayload++ = 255; - *pPayload++ = (Len & 255); - *pPayload++ = ((Len >> 8) & 255); + sStart = pText; // Remember start of string. + // + // Save space to store count byte(s). + // + pLen = pPayload++; +#if (SEGGER_SYSVIEW_MAX_STRING_LEN >= 255) // Length always encodes in 3 bytes + pPayload += 2; +#endif + // + // Limit string to maximum length and copy into payload buffer. + // + if (Limit > SEGGER_SYSVIEW_MAX_STRING_LEN) { + Limit = SEGGER_SYSVIEW_MAX_STRING_LEN; + } + while ((Limit-- > 0) && (*pText != '\0')) { + *pPayload++ = *pText++; + } + // + // Save string length to buffer. + // +#if (SEGGER_SYSVIEW_MAX_STRING_LEN >= 255) // Length always encodes in 3 bytes + Limit = (unsigned int)(pText - sStart); + *pLen++ = (U8)255; + *pLen++ = (U8)((Limit >> 8) & 255); + *pLen++ = (U8)(Limit & 255); +#else // Length always encodes in 1 byte + *pLen = (U8)(pText - sStart); +#endif } // - // copy string - // - n = 0; - while (n < Len) { - *pPayload++ = *pText++; - n++; - } return pPayload; } @@ -693,7 +731,6 @@ static void _SendSyncInfo(void) { for (n = 0; n < _NumModules; n++) { SEGGER_SYSVIEW_SendModule(n); } - SEGGER_SYSVIEW_SendModuleDescription(); } } #endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) @@ -1218,6 +1255,7 @@ static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) unsigned int FormatFlags; unsigned int FieldWidth; U8* pPayloadStart; + const char* s; #if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); SEGGER_SYSVIEW_LOCK(); @@ -1322,6 +1360,20 @@ static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) v = va_arg(*pParamList, int); _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, NumDigits, FieldWidth, FormatFlags); break; + case 's': + s = va_arg(*pParamList, const char*); + if (s == NULL) { + s = "(null)"; + } + do { + c = *s; + s++; + if (c == '\0') { + break; + } + _StoreChar(&BufferDesc, c); + } while (BufferDesc.Cnt < SEGGER_SYSVIEW_MAX_STRING_LEN); + break; case 'p': v = va_arg(*pParamList, int); _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, 8u, 8u, 0u); @@ -1954,11 +2006,61 @@ void SEGGER_SYSVIEW_SendTaskInfo(const SEGGER_SYSVIEW_TASKINFO *pInfo) { ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); ENCODE_U32(pPayload, pInfo->StackBase); ENCODE_U32(pPayload, pInfo->StackSize); - ENCODE_U32(pPayload, 0); // Stack End, future use + ENCODE_U32(pPayload, pInfo->StackUsage); _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_STACK_INFO); RECORD_END(); } +/********************************************************************* +* +* SEGGER_SYSVIEW_SendStackInfo() +* +* Function description +* Send a Stack Info Packet, containing TaskId for identification, +* stack base, stack size and stack usage. +* +* +* Parameters +* pInfo - Pointer to stack information to send. +*/ +void SEGGER_SYSVIEW_SendStackInfo(const SEGGER_SYSVIEW_STACKINFO *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); + ENCODE_U32(pPayload, pInfo->StackBase); + ENCODE_U32(pPayload, pInfo->StackSize); + ENCODE_U32(pPayload, pInfo->StackUsage); + + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SampleData() +* +* Function description +* Send a Data Sample Packet, containing the data Id and the value. +* +* +* Parameters +* pInfo - Pointer to data sample struct to send. +*/ +void SEGGER_SYSVIEW_SampleData(const SEGGER_SYSVIEW_DATA_SAMPLE *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, pInfo->ID); + pPayload = _EncodeFloat(pPayload, *(pInfo->pFloat_Value)); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_DATA_SAMPLE); + + RECORD_END(); +} + /********************************************************************* * * SEGGER_SYSVIEW_SendTaskList() @@ -2448,6 +2550,63 @@ void SEGGER_SYSVIEW_NameResource(U32 ResourceId, const char* sName) { RECORD_END(); } +/********************************************************************* +* +* SEGGER_SYSVIEW_RegisterData() +* +* Function description +* Register data to sample the values via SystemView. +* +* Register functions are usually set in the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* pInfo - Struct containing all possible properties that can be sent via this registration event. +*/ +void SEGGER_SYSVIEW_RegisterData(SEGGER_SYSVIEW_DATA_REGISTER* pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 8 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_REGISTER_DATA); + ENCODE_U32(pPayload, pInfo->ID); + pPayload = _EncodeStr(pPayload, pInfo->sName, SEGGER_SYSVIEW_MAX_STRING_LEN); + + if (pInfo->sName != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + pPayload = _EncodeFloat(pPayload, pInfo->ScalingFactor); + pPayload = _EncodeStr(pPayload, pInfo->sUnit, SEGGER_SYSVIEW_MAX_STRING_LEN); + } else if (pInfo->ScalingFactor != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + pPayload = _EncodeFloat(pPayload, pInfo->ScalingFactor); + } else if (pInfo->RangeMax != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + ENCODE_U32(pPayload, pInfo->RangeMax); + } else if (pInfo->RangeMin != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + ENCODE_U32(pPayload, pInfo->RangeMin); + } else if (pInfo->Offset != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + ENCODE_U32(pPayload, pInfo->Offset); + } else if (pInfo->DataType != 0) { + ENCODE_U32(pPayload, pInfo->DataType); + } + + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + /********************************************************************* * * SEGGER_SYSVIEW_HeapDefine() @@ -2820,9 +2979,6 @@ void SEGGER_SYSVIEW_RegisterModule(SEGGER_SYSVIEW_MODULE* pModule) { _NumModules++; } SEGGER_SYSVIEW_SendModule(0); - if (pModule->pfSendModuleDesc) { - pModule->pfSendModuleDesc(); - } SEGGER_SYSVIEW_UNLOCK(); } @@ -2906,6 +3062,9 @@ void SEGGER_SYSVIEW_SendModule(U8 ModuleId) { _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); RECORD_END(); } + if (pModule && pModule->pfSendModuleDesc) { + pModule->pfSendModuleDesc(); + } } } @@ -2986,6 +3145,39 @@ void SEGGER_SYSVIEW_PrintfHostEx(const char* s, U32 Options, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfHostEx() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application +* with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VPrintfHostEx(const char* s, U32 Options, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, Options, pParamList); + + if (r == -1) { + _VPrintTarget(s, Options, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, Options, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_PrintfHost() @@ -3020,6 +3212,37 @@ void SEGGER_SYSVIEW_PrintfHost(const char* s, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfHost() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VPrintfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_LOG, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_LOG, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_WarnfHost() @@ -3055,6 +3278,38 @@ void SEGGER_SYSVIEW_WarnfHost(const char* s, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VWarnfHost() +* +* Function description +* Print a warning string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VWarnfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_WARNING, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_WARNING, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_ErrorfHost() @@ -3090,6 +3345,38 @@ void SEGGER_SYSVIEW_ErrorfHost(const char* s, ...) { #endif } +/********************************************************************* +* +* SEGGER_SYSVIEW_VErrorfHost() +* +* Function description +* Print a warning string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_VErrorfHost(const char* s, va_list *pParamList) { +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + va_list ParamListCopy; + va_copy(ParamListCopy, *pParamList); + + r = _VPrintHost(s, SEGGER_SYSVIEW_ERROR, pParamList); + + if (r == -1) { + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamListCopy); + } + va_end(ParamListCopy); +#else + _VPrintHost(s, SEGGER_SYSVIEW_ERROR, pParamList); +#endif +} + /********************************************************************* * * SEGGER_SYSVIEW_PrintfTargetEx() @@ -3110,6 +3397,23 @@ void SEGGER_SYSVIEW_PrintfTargetEx(const char* s, U32 Options, ...) { va_end(ParamList); } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfTargetEx() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VPrintfTargetEx(const char* s, U32 Options, va_list *pParamList) { + _VPrintTarget(s, Options, pParamList); +} + /********************************************************************* * * SEGGER_SYSVIEW_PrintfTarget() @@ -3129,6 +3433,22 @@ void SEGGER_SYSVIEW_PrintfTarget(const char* s, ...) { va_end(ParamList); } +/********************************************************************* +* +* SEGGER_SYSVIEW_VPrintfTarget() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VPrintfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, pParamList); +} + /********************************************************************* * * SEGGER_SYSVIEW_WarnfTarget() @@ -3148,6 +3468,22 @@ void SEGGER_SYSVIEW_WarnfTarget(const char* s, ...) { va_end(ParamList); } +/********************************************************************* +* +* SEGGER_SYSVIEW_VWarnfTarget() +* +* Function description +* Print a warning string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VWarnfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, pParamList); +} + /********************************************************************* * * SEGGER_SYSVIEW_ErrorfTarget() @@ -3166,6 +3502,22 @@ void SEGGER_SYSVIEW_ErrorfTarget(const char* s, ...) { _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); va_end(ParamList); } + +/********************************************************************* +* +* SEGGER_SYSVIEW_VErrorfTarget() +* +* Function description +* Print an error string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +* pParamList - Pointer to the list of arguments for the format string +*/ +void SEGGER_SYSVIEW_VErrorfTarget(const char* s, va_list* pParamList) { + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, pParamList); +} #endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF /********************************************************************* diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h index b9cbac605b..1f3661d7ee 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW.h @@ -3,14 +3,14 @@ * * SPDX-License-Identifier: BSD-1-Clause * - * SPDX-FileContributor: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2023-2025 Espressif Systems (Shanghai) CO LTD */ /********************************************************************* * SEGGER Microcontroller GmbH * * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,13 +49,13 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- File : SEGGER_SYSVIEW.h Purpose : System visualization API. -Revision: $Rev: 28237 $ +Revision: $Rev: 28768 $ */ #ifndef SEGGER_SYSVIEW_H @@ -123,7 +123,7 @@ extern "C" { #define SYSVIEW_EVTID_TIMER_EXIT 20 #define SYSVIEW_EVTID_STACK_INFO 21 #define SYSVIEW_EVTID_MODULEDESC 22 - +#define SYSVIEW_EVTID_DATA_SAMPLE 23 #define SYSVIEW_EVTID_INIT 24 #define SYSVIEW_EVTID_NAME_RESOURCE 25 #define SYSVIEW_EVTID_PRINT_FORMATTED 26 @@ -135,12 +135,13 @@ extern "C" { // // SystemView extended events. Sent with ID 31. // -#define SYSVIEW_EVTID_EX_MARK 0 -#define SYSVIEW_EVTID_EX_NAME_MARKER 1 -#define SYSVIEW_EVTID_EX_HEAP_DEFINE 2 -#define SYSVIEW_EVTID_EX_HEAP_ALLOC 3 -#define SYSVIEW_EVTID_EX_HEAP_ALLOC_EX 4 -#define SYSVIEW_EVTID_EX_HEAP_FREE 5 +#define SYSVIEW_EVTID_EX_MARK 0 +#define SYSVIEW_EVTID_EX_NAME_MARKER 1 +#define SYSVIEW_EVTID_EX_HEAP_DEFINE 2 +#define SYSVIEW_EVTID_EX_HEAP_ALLOC 3 +#define SYSVIEW_EVTID_EX_HEAP_ALLOC_EX 4 +#define SYSVIEW_EVTID_EX_HEAP_FREE 5 +#define SYSVIEW_EVTID_EX_REGISTER_DATA 6 // // Event masks to disable/enable events // @@ -167,7 +168,7 @@ extern "C" { #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_DATA_SAMPLE (1 << SYSVIEW_EVTID_DATA_SAMPLE) #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) @@ -202,8 +203,42 @@ typedef struct { U32 Prio; U32 StackBase; U32 StackSize; + U32 StackUsage; } SEGGER_SYSVIEW_TASKINFO; +typedef struct { + U32 TaskID; + U32 StackBase; + U32 StackSize; + U32 StackUsage; +} SEGGER_SYSVIEW_STACKINFO; + +typedef struct { + U32 ID; + union { + U32* pU32_Value; + I32* pI32_Value; + float* pFloat_Value; + }; +} SEGGER_SYSVIEW_DATA_SAMPLE; + +typedef enum { + SEGGER_SYSVIEW_TYPE_U32 = 0, + SEGGER_SYSVIEW_TYPE_I32 = 1, + SEGGER_SYSVIEW_TYPE_FLOAT = 2 +} SEGGER_SYSVIEW_DATA_TYPE; + +typedef struct { + U32 ID; + SEGGER_SYSVIEW_DATA_TYPE DataType; + I32 Offset; + I32 RangeMin; + I32 RangeMax; + float ScalingFactor; + const char* sName; + const char* sUnit; +} SEGGER_SYSVIEW_DATA_REGISTER; + typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE; struct SEGGER_SYSVIEW_MODULE_STRUCT { @@ -247,8 +282,8 @@ EXTERN unsigned int SEGGER_SYSVIEW_InterruptId; */ typedef struct { - U64 (*pfGetTime) (void); - void (*pfSendTaskList) (void); + U64 (*pfGetTime) (void); + void (*pfSendTaskList) (void); } SEGGER_SYSVIEW_OS_API; /********************************************************************* @@ -262,9 +297,13 @@ 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_SendStackInfo (const SEGGER_SYSVIEW_STACKINFO* pInfo); void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); int SEGGER_SYSVIEW_IsStarted (void); int SEGGER_SYSVIEW_GetChannelID (void); + +void SEGGER_SYSVIEW_SampleData (const SEGGER_SYSVIEW_DATA_SAMPLE *pInfo); + // Checks whether tracing has been started U8 SEGGER_SYSVIEW_Started(void); @@ -311,6 +350,7 @@ void SEGGER_SYSVIEW_HeapAllocEx (void* pHeap, void* pUserData, void SEGGER_SYSVIEW_HeapFree (void* pHeap, void* pUserData); void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName); +void SEGGER_SYSVIEW_RegisterData ( SEGGER_SYSVIEW_DATA_REGISTER* pInfo); int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId); @@ -341,13 +381,21 @@ void SEGGER_SYSVIEW_SendNumModules (void); */ #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_VPrintfHostEx (const char* s, U32 Options, va_list* pParamList); void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...); +void SEGGER_SYSVIEW_VPrintfTargetEx (const char* s, U32 Options, va_list* pParamList); void SEGGER_SYSVIEW_PrintfHost (const char* s, ...); +void SEGGER_SYSVIEW_VPrintfHost (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VPrintfTarget (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_WarnfHost (const char* s, ...); +void SEGGER_SYSVIEW_VWarnfHost (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VWarnfTarget (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...); +void SEGGER_SYSVIEW_VErrorfHost (const char* s, va_list* pParamList); void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...); +void SEGGER_SYSVIEW_VErrorfTarget (const char* s, va_list* pParamList); #endif void SEGGER_SYSVIEW_Print (const char* s); diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h index c617e0db81..2e7d2f593e 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_ConfDefaults.h @@ -3,14 +3,14 @@ * * SPDX-License-Identifier: BSD-1-Clause * - * SPDX-FileContributor: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileContributor: 2023-2025 Espressif Systems (Shanghai) CO LTD */ /********************************************************************* * SEGGER Microcontroller GmbH * * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -49,7 +49,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- @@ -72,6 +72,8 @@ Revision: $Rev: 26230 $ #include "SEGGER_SYSVIEW_Conf.h" #include "SEGGER_RTT_Conf.h" +#include "esp_assert.h" + #ifdef __cplusplus extern "C" { #endif @@ -370,12 +372,14 @@ extern "C" { #define SEGGER_SYSVIEW_MAX_STRING_LEN 128 #endif +ESP_STATIC_ASSERT(SEGGER_SYSVIEW_MAX_STRING_LEN < 255, "SEGGER Sysview string length must be less than 255."); + /********************************************************************* * * Define: SEGGER_SYSVIEW_SUPPORT_LONG_ID * * Description -* It set, support enconding Evend Ids longer than 14 bit. +* It set, support encoding Evend Ids longer than 14 bit. * Default * 1 */ @@ -388,7 +392,7 @@ extern "C" { * Define: SEGGER_SYSVIEW_SUPPORT_LONG_DATA * * Description -* It set, support enconding event data longer than 14 bit. +* It set, support encoding event data longer than 14 bit. * Default * 0 */ @@ -517,7 +521,7 @@ extern "C" { * Define: SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT * * Description -* Configure how frequently syncronization is sent in post-mortem +* Configure how frequently synchronization is sent in post-mortem * mode. * Default * 8: (1 << 8) = Every 256 Events. diff --git a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h index ded0b96b56..270fd9fc31 100644 --- a/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h +++ b/components/app_trace/sys_view/SEGGER/SEGGER_SYSVIEW_Int.h @@ -8,7 +8,7 @@ * The Embedded Experts * ********************************************************************** * * -* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* (c) 1995 - 2024 SEGGER Microcontroller GmbH * * * * www.segger.com Support: support@segger.com * * * @@ -47,7 +47,7 @@ * * ********************************************************************** * * -* SystemView version: 3.42 * +* SystemView version: 3.56 * * * ********************************************************************** -------------------------- END-OF-HEADER ----------------------------- diff --git a/tools/esp_app_trace/espytrace/sysview.py b/tools/esp_app_trace/espytrace/sysview.py index f2593558d6..a3cb0244bb 100644 --- a/tools/esp_app_trace/espytrace/sysview.py +++ b/tools/esp_app_trace/espytrace/sysview.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import copy import json @@ -30,6 +30,7 @@ SYSVIEW_EVTID_TIMER_ENTER = 19 SYSVIEW_EVTID_TIMER_EXIT = 20 SYSVIEW_EVTID_STACK_INFO = 21 SYSVIEW_EVTID_MODULEDESC = 22 +SYSVIEW_EVTID_DATA_SAMPLE = 23 SYSVIEW_EVTID_INIT = 24 SYSVIEW_EVENT_ID_PREDEF_LEN_MAX = SYSVIEW_EVTID_INIT SYSVIEW_EVTID_NAME_RESOURCE = 25 @@ -66,7 +67,8 @@ _sysview_events_map = { 'SYS_TIMER_ENTER': SYSVIEW_EVTID_TIMER_ENTER, 'SYS_TIMER_EXIT': SYSVIEW_EVTID_TIMER_EXIT, 'SYS_STACK_INFO': SYSVIEW_EVTID_STACK_INFO, - 'SYS_MODULEDESC': SYSVIEW_EVTID_INIT, + 'SYS_MODULEDESC': SYSVIEW_EVTID_MODULEDESC, + 'SYS_DATA_SAMPLE': SYSVIEW_EVTID_DATA_SAMPLE, 'SYS_INIT': SYSVIEW_EVTID_INIT, 'SYS_NAME_RESOURCE': SYSVIEW_EVTID_NAME_RESOURCE, 'SYS_PRINT_FORMATTED': SYSVIEW_EVTID_PRINT_FORMATTED, @@ -263,7 +265,7 @@ def _decode_str(reader): sz, = struct.unpack('