/* * Trace Recorder for Tracealyzer v4.6.0 * Copyright 2021 Percepio AB * www.percepio.com * * SPDX-License-Identifier: Apache-2.0 * * Supporting functions for trace streaming, used by the "stream ports" * for reading and writing data to the interface. * This "stream port" sets up the recorder to stream to a Ring Buffer. */ #include #if (TRC_USE_TRACEALYZER_RECORDER == 1) #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) /* Backwards compatibility with plugins */ typedef TraceRingBuffer_t RecorderData; RecorderData* RecorderDataPtr = 0; TraceStreamPortData_t* pxStreamPortData; traceResult xTraceStreamPortInitialize(TraceStreamPortBuffer_t* pxBuffer) { TraceRingBuffer_t* pxRingBuffer; TRC_ASSERT_EQUAL_SIZE(TraceStreamPortBuffer_t, TraceStreamPortData_t); if (pxBuffer == 0) { return TRC_FAIL; } pxStreamPortData = (TraceStreamPortData_t*)pxBuffer; RecorderDataPtr = pxRingBuffer = &pxStreamPortData->xRingBuffer; pxRingBuffer->xEventBuffer.uiSize = sizeof(pxRingBuffer->xEventBuffer.uiBuffer); #if (TRC_CFG_STREAM_PORT_RINGBUFFER_MODE == TRC_STREAM_PORT_RINGBUFFER_MODE_OVERWRITE_WHEN_FULL) if (xTraceMultiCoreEventBufferInitialize(&pxStreamPortData->xMultiCoreEventBuffer, TRC_EVENT_BUFFER_OPTION_OVERWRITE, pxRingBuffer->xEventBuffer.uiBuffer, sizeof(pxRingBuffer->xEventBuffer.uiBuffer)) == TRC_FAIL) { return TRC_FAIL; } #else if (xTraceMultiCoreEventBufferInitialize(&pxStreamPortData->xMultiCoreEventBuffer, TRC_EVENT_BUFFER_OPTION_SKIP, pxRingBuffer->xEventBuffer.uiBuffer, sizeof(pxRingBuffer->xEventBuffer.uiBuffer)) == TRC_FAIL) { return TRC_FAIL; } #endif if (xTraceHeaderInitialize(&pxRingBuffer->xHeaderBuffer) == TRC_FAIL) { return TRC_FAIL; } if (xTraceEntryTableInitialize(&pxRingBuffer->xEntryTableBuffer) == TRC_FAIL) { return TRC_FAIL; } if (xTraceTimestampInitialize(&pxRingBuffer->xTimestampInfo) == TRC_FAIL) { return TRC_FAIL; } pxRingBuffer->END_MARKERS[0] = 0x0A; pxRingBuffer->END_MARKERS[1] = 0x0B; pxRingBuffer->END_MARKERS[2] = 0x0C; pxRingBuffer->END_MARKERS[3] = 0x0D; pxRingBuffer->END_MARKERS[4] = 0x71; pxRingBuffer->END_MARKERS[5] = 0x72; pxRingBuffer->END_MARKERS[6] = 0x73; pxRingBuffer->END_MARKERS[7] = 0x74; pxRingBuffer->END_MARKERS[8] = 0xF1; pxRingBuffer->END_MARKERS[9] = 0xF2; pxRingBuffer->END_MARKERS[10] = 0xF3; pxRingBuffer->END_MARKERS[11] = 0xF4; pxRingBuffer->START_MARKERS[0] = 0x05; pxRingBuffer->START_MARKERS[1] = 0x06; pxRingBuffer->START_MARKERS[2] = 0x07; pxRingBuffer->START_MARKERS[3] = 0x08; pxRingBuffer->START_MARKERS[4] = 0x75; pxRingBuffer->START_MARKERS[5] = 0x76; pxRingBuffer->START_MARKERS[6] = 0x77; pxRingBuffer->START_MARKERS[7] = 0x78; pxRingBuffer->START_MARKERS[8] = 0xF5; pxRingBuffer->START_MARKERS[9] = 0xF6; pxRingBuffer->START_MARKERS[10] = 0xF7; pxRingBuffer->START_MARKERS[11] = 0xF8; return TRC_SUCCESS; } traceResult xTraceStreamPortCommit(void* pvData, uint32_t uiSize, int32_t* piBytesCommitted) { if (pvData == 0) { return TRC_FAIL; } xTraceMultiCoreEventBufferPush(&pxStreamPortData->xMultiCoreEventBuffer, pvData, uiSize, piBytesCommitted); #if (TRC_CFG_STREAM_PORT_RINGBUFFER_MODE == TRC_STREAM_PORT_RINGBUFFER_MODE_STOP_WHEN_FULL) /* If no bytes was written it means that the buffer is full and we should stop * tracing. */ if (uiSize > 0 && *piBytesCommitted == 0) { xTraceDisable(); return TRC_FAIL; } #endif return TRC_SUCCESS; } traceResult xTraceStreamPortOnTraceBegin() { return xTraceMultiCoreEventBufferClear(&pxStreamPortData->xMultiCoreEventBuffer); } #endif /*(TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)*/ #endif /*(TRC_USE_TRACEALYZER_RECORDER == 1)*/