/* * Trace Recorder for Tracealyzer v4.6.0 * Copyright 2021 Percepio AB * www.percepio.com * * SPDX-License-Identifier: Apache-2.0 * * The implementation of the diagnostics. */ #include #if (TRC_USE_TRACEALYZER_RECORDER == 1) #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) typedef struct TraceDiagnostics { TraceBaseType_t metrics[TRC_DIAGNOSTICS_COUNT]; } TraceDiagnostics_t; static TraceDiagnostics_t *pxDiagnostics; traceResult xTraceDiagnosticsInitialize(TraceDiagnosticsBuffer_t *pxBuffer) { uint32_t i; TRC_ASSERT_EQUAL_SIZE(TraceDiagnosticsBuffer_t, TraceDiagnostics_t); /* This should never fail */ TRC_ASSERT(pxBuffer != 0); pxDiagnostics = (TraceDiagnostics_t*)pxBuffer; for (i = 0; i < TRC_DIAGNOSTICS_COUNT; i++) { pxDiagnostics->metrics[i] = 0; } xTraceSetComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS); return TRC_SUCCESS; } traceResult xTraceDiagnosticsGet(TraceDiagnosticsType_t xType, TraceBaseType_t* pxValue) { /* This should never fail */ TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS)); /* This should never fail */ TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT); /* This should never fail */ TRC_ASSERT(pxValue != 0); *pxValue = pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType]; return TRC_SUCCESS; } traceResult xTraceDiagnosticsSet(TraceDiagnosticsType_t xType, TraceBaseType_t xValue) { /* This should never fail */ TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS)); /* This should never fail */ TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT); pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] = xValue; return TRC_SUCCESS; } traceResult xTraceDiagnosticsAdd(TraceDiagnosticsType_t xType, TraceBaseType_t xValue) { /* This should never fail */ TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS)); /* This should never fail */ TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT); pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] += xValue; return TRC_SUCCESS; } traceResult xTraceDiagnosticsIncrease(TraceDiagnosticsType_t xType) { return xTraceDiagnosticsAdd(xType, 1); } traceResult xTraceDiagnosticsDecrease(TraceDiagnosticsType_t xType) { return xTraceDiagnosticsAdd(xType, -1); } traceResult xTraceDiagnosticsSetIfHigher(TraceDiagnosticsType_t xType, TraceBaseType_t xValue) { /* This should never fail */ TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS)); /* This should never fail */ TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT); if (xValue > pxDiagnostics->metrics[xType]) { pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] = xValue; } return TRC_SUCCESS; } traceResult xTraceDiagnosticsSetIfLower(TraceDiagnosticsType_t xType, TraceBaseType_t xValue) { /* This should never fail */ TRC_ASSERT(xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS)); /* This should never fail */ TRC_ASSERT((TraceUnsignedBaseType_t)xType < TRC_DIAGNOSTICS_COUNT); if (xValue < pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType]) { pxDiagnostics->metrics[(TraceUnsignedBaseType_t)xType] = xValue; } return TRC_SUCCESS; } traceResult xTraceDiagnosticsCheckStatus(void) { /* It is probably good if we always check this */ if (!xTraceIsComponentInitialized(TRC_RECORDER_COMPONENT_DIAGNOSTICS)) { return TRC_FAIL; } if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SLOTS_NO_ROOM] > 0) { xTraceWarning(TRC_WARNING_ENTRY_TABLE_SLOTS); pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SLOTS_NO_ROOM] = 0; } if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SYMBOL_LONGEST_LENGTH] > (TRC_CFG_ENTRY_SYMBOL_MAX_LENGTH)) { xTraceWarning(TRC_WARNING_ENTRY_SYMBOL_MAX_LENGTH); pxDiagnostics->metrics[TRC_DIAGNOSTICS_ENTRY_SYMBOL_LONGEST_LENGTH] = 0; } if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_BLOB_MAX_BYTES_TRUNCATED] > 0) { xTraceWarning(TRC_WARNING_EVENT_SIZE_TRUNCATED); pxDiagnostics->metrics[TRC_DIAGNOSTICS_BLOB_MAX_BYTES_TRUNCATED] = 0; } if (pxDiagnostics->metrics[TRC_DIAGNOSTICS_STACK_MONITOR_NO_SLOTS] > 0) { xTraceWarning(TRC_WARNING_STACKMON_NO_SLOTS); pxDiagnostics->metrics[TRC_DIAGNOSTICS_STACK_MONITOR_NO_SLOTS] = 0; } return TRC_SUCCESS; } #endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) */ #endif /* (TRC_USE_TRACEALYZER_RECORDER == 1) */