Percepio Trace Recorder  v4.6.6
trcEvent.h
Go to the documentation of this file.
1 /*
2 * Percepio Trace Recorder for Tracealyzer v4.6.6
3 * Copyright 2021 Percepio AB
4 * www.percepio.com
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 */
8 
15 #ifndef TRC_EVENT_H
16 #define TRC_EVENT_H
17 
18 #if (TRC_USE_TRACEALYZER_RECORDER == 1)
19 
20 #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
21 
22 #include <trcTypes.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
37 #define TRC_EVENT_SET_PARAM_COUNT(id, n) (((uint16_t)(id)) | ((((uint16_t)(n)) & 0xF) << 12))
38 
42 #define TRC_EVENT_GET_PARAM_COUNT(id) (((id) >> 12) & 0xF)
43 
44 #if (TRC_CFG_CORE_COUNT > 1)
45 #define TRC_EVENT_SET_EVENT_COUNT(c) (((TRC_CFG_GET_CURRENT_CORE() & 0xF) << 12) | ((uint16_t)(c) & 0xFFF))
46 #else
47 #define TRC_EVENT_SET_EVENT_COUNT(c) (uint16_t)(c)
48 #endif
49 
53 #define SET_BASE_EVENT_DATA(pxEvent, eventId, paramCount, eventCount) \
54  ( \
55  (pxEvent)->EventID = TRC_EVENT_SET_PARAM_COUNT(eventId, paramCount), \
56  (pxEvent)->EventCount = TRC_EVENT_SET_EVENT_COUNT(eventCount), \
57  xTraceTimestampGet(&(pxEvent)->TS) \
58  )
59 
63 #define RESET_EVENT_DATA(p) \
64  ( \
65  (p)->pvBlob = 0, \
66  (p)->size = 0, \
67  (p)->offset = 0 \
68  )
69 
73 #define TRC_EVENT_GET_SIZE(pvAddress, puiSize) (*(uint32_t*)(puiSize) = sizeof(TraceBaseEvent_t) + (TRC_EVENT_GET_PARAM_COUNT(((TraceBaseEvent_t*)(pvAddress))->EventID)) * sizeof(uint32_t), TRC_SUCCESS)
74 
78 #define TRC_EVENT_GET_RAW_DATA(xEventHandle, uiOffset, uiSize, ppvData) ((void)(uiSize), *(void**)(ppvData) = (void*)&((uint8_t*)((TraceEventData_t*)(xEventHandle))->pvBlob)[uiOffset], TRC_SUCCESS)
79 
83 #define TRC_EVENT_GET_PAYLOAD(xEventHandle, uiOffset, uiSize, ppvData) ((void)(uiSize), *(void**)(ppvData) = (void*)&((uint8_t*)((TraceEventData_t*)(xEventHandle))->pvBlob)[sizeof(TraceBaseEvent_t) + (uiOffset)], TRC_SUCCESS)
84 
88 #define TRC_EVENT_PAYLOAD_REMAINING(xEventHandle, puiValue) TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(*(uint32_t*)(puiValue) = ((TraceEventData_t*)(xEventHandle))->size - ((TraceEventData_t*)(xEventHandle))->offset, TRC_SUCCESS)
89 
93 #define TRC_EVENT_PAYLOAD_USED(xEventHandle, puiValue) (*(uint32_t*)(puiValue) = ((TraceEventData_t*)(xEventHandle))->offset - sizeof(TraceBaseEvent_t), TRC_SUCCESS)
94 
98 #define TRC_EVENT_PAYLOAD_SIZE(xEventHandle, puiValue) (*(uint32_t*)(puiValue) = ((TraceEventData_t*)(xEventHandle))->size - sizeof(TraceBaseEvent_t), TRC_SUCCESS)
99 
103 #define TRC_EVENT_ADD_POINTER(xEventHandle, value) \
104  TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3( \
105  ((void**)((TraceEventData_t*)(xEventHandle))->pvBlob)[((TraceEventData_t*)(xEventHandle))->offset / sizeof(void*)] = (value), \
106  ((TraceEventData_t*)(xEventHandle))->offset += sizeof(void*), \
107  TRC_SUCCESS \
108  )
109 
113 #define TRC_EVENT_ADD_UNSIGNED_BASE_TYPE(xEventHandle, value) \
114  TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3( \
115  ((TraceUnsignedBaseType_t*)((TraceEventData_t*)(xEventHandle))->pvBlob)[((TraceEventData_t*)(xEventHandle))->offset / sizeof(TraceUnsignedBaseType_t)] = (value), \
116  ((TraceEventData_t*)(xEventHandle))->offset += sizeof(TraceUnsignedBaseType_t), \
117  TRC_SUCCESS \
118  )
119 
123 #define TRC_EVENT_ADD_32(xEventHandle, value) \
124  TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3( \
125  ((uint32_t*)((TraceEventData_t*)(xEventHandle))->pvBlob)[((TraceEventData_t*)(xEventHandle))->offset / sizeof(uint32_t)] = (value), \
126  ((TraceEventData_t*)(xEventHandle))->offset += sizeof(uint32_t), \
127  TRC_SUCCESS \
128  )
129 
133 #define TRC_EVENT_ADD_16(xEventHandle, value) \
134  TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3( \
135  ((uint16_t*)((TraceEventData_t*)(xEventHandle))->pvBlob)[((TraceEventData_t*)(xEventHandle))->offset / sizeof(uint16_t)] = (value), \
136  ((TraceEventData_t*)(xEventHandle))->offset += sizeof(uint16_t), \
137  TRC_SUCCESS \
138  )
139 
143 #define TRC_EVENT_ADD_8(xEventHandle, value) \
144  TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3( \
145  ((uint8_t*)((TraceEventData_t*)(xEventHandle))->pvBlob)[((TraceEventData_t*)(xEventHandle))->offset / sizeof(uint8_t)] = (value), \
146  ((TraceEventData_t*)(xEventHandle))->offset += sizeof(uint8_t), \
147  TRC_SUCCESS \
148  )
149 
153 #define TRC_EVENT_BEGIN_OFFLINE(uiEventCode, uiPayloadSize, pxEventHandle) \
154  ( \
155  (xTraceEventBeginRawOffline(sizeof(TraceBaseEvent_t) + (uiPayloadSize), pxEventHandle)) == TRC_SUCCESS ? \
156  ( \
157  pxTraceEventDataTable->coreEventData[TRC_CFG_GET_CURRENT_CORE()].eventCounter++, \
158  SET_BASE_EVENT_DATA((TraceBaseEvent_t*)(((TraceEventData_t*)*(pxEventHandle))->pvBlob), \
159  uiEventCode, \
160  (((TraceEventData_t*)*(pxEventHandle))->size - sizeof(TraceBaseEvent_t)) / sizeof(uint32_t), \
161  pxTraceEventDataTable->coreEventData[TRC_CFG_GET_CURRENT_CORE()].eventCounter), \
162  ((TraceEventData_t*)*(pxEventHandle))->offset += sizeof(TraceBaseEvent_t), \
163  TRC_SUCCESS \
164  ) : TRC_FAIL \
165  )
166 
170 #define TRC_EVENT_END_OFFLINE(xEventHandle) \
171  TRC_COMMA_EXPR_TO_STATEMENT_EXPR_4( \
172  xTraceStreamPortCommit(((TraceEventData_t*)(xEventHandle))->pvBlob, \
173  ((TraceEventData_t*)(xEventHandle))->size, &DUMMY_iTraceBytesCommitted), \
174  RESET_EVENT_DATA((TraceEventData_t*)(xEventHandle)), \
175  TRC_SUCCESS \
176  )
177 
181 typedef struct {
182  uint16_t EventID;
183  uint16_t EventCount;
184  uint32_t TS;
185 } TraceBaseEvent_t;
186 
190 typedef struct TraceEventData
191 {
192  void* pvBlob;
193  uint32_t size;
194  uint32_t offset;
195 } TraceEventData_t;
196 
200 typedef struct TraceCoreEventData
201 {
202  TraceEventData_t eventData[(TRC_CFG_MAX_ISR_NESTING)+1];
203  uint32_t eventCounter;
204  TRACE_ALLOC_CRITICAL_SECTION()
205 } TraceCoreEventData_t;
206 
210 typedef struct TraceEventDataTable
211 {
212  TraceCoreEventData_t coreEventData[TRC_CFG_CORE_COUNT];
213 } TraceEventDataTable_t;
214 
215 #define TRC_EVENT_DATA_BUFFER_SIZE (sizeof(TraceEventDataTable_t))
216 
220 typedef struct TraceEventDataBuffer
221 {
222  uint8_t buffer[TRC_EVENT_DATA_BUFFER_SIZE];
223 } TraceEventDataBuffer_t;
224 
225 extern TraceEventDataTable_t* pxTraceEventDataTable;
226 
236 traceResult xTraceEventInitialize(TraceEventDataBuffer_t* pxBuffer);
237 
247 traceResult xTraceEventGetSize(void* pvAddress, uint32_t* puiSize);
248 
261 traceResult xTraceEventBeginRawOffline(uint32_t uiSize, TraceEventHandle_t* pxEventHandle);
262 
275 traceResult xTraceEventBeginRawOfflineBlocking(uint32_t uiSize, TraceEventHandle_t* pxEventHandle);
276 
289 #define xTraceEventBeginOffline TRC_EVENT_BEGIN_OFFLINE
290 
303 #define xTraceEventBegin(uiEventCode, uiTotalPayloadSize, pxEventHandle) \
304  (xTraceIsRecorderEnabled() ? xTraceEventBeginOffline(uiEventCode, uiTotalPayloadSize, pxEventHandle) : TRC_FAIL)
305 
317 traceResult xTraceEventEndOffline(TraceEventHandle_t xEventHandle);
318 
329 traceResult xTraceEventEndOfflineBlocking(TraceEventHandle_t xEventHandle);
330 
342 #define xTraceEventEnd(xEventHandle) \
343  (xTraceIsRecorderEnabled() == 0 ? TRC_FAIL : xTraceEventEndOffline(xEventHandle))
344 
355 traceResult xTraceEventAddData(TraceEventHandle_t xEventHandle, void* pvData, uint32_t uiSize);
356 
357 #if ((TRC_CFG_USE_TRACE_ASSERT) == 1)
358 
373 traceResult xTraceEventGetRawData(TraceEventHandle_t xEventHandle, uint32_t uiOffset, uint32_t uiSize, void** ppvData);
374 
389 traceResult xTraceEventGetPayload(TraceEventHandle_t xEventHandle, uint32_t uiOffset, uint32_t uiSize, void** ppvData);
390 
400 traceResult xTraceEventPayloadRemaining(TraceEventHandle_t xEventHandle, uint32_t* puiValue);
401 
411 traceResult xTraceEventPayloadUsed(TraceEventHandle_t xEventHandle, uint32_t* puiValue);
412 
422 traceResult xTraceEventPayloadSize(TraceEventHandle_t xEventHandle, uint32_t* puiValue);
423 
433 traceResult xTraceEventAddUnsignedBaseType(TraceEventHandle_t xEventHandle, TraceUnsignedBaseType_t uxValue);
434 
444 traceResult xTraceEventAddPointer(TraceEventHandle_t xEventHandle, void *pvAddress);
445 
455 traceResult xTraceEventAdd32(TraceEventHandle_t xEventHandle, uint32_t value);
456 
466 traceResult xTraceEventAdd16(TraceEventHandle_t xEventHandle, uint16_t value);
467 
477 traceResult xTraceEventAdd8(TraceEventHandle_t xEventHandle, uint8_t value);
478 
479 #else /* ((TRC_CFG_USE_TRACE_ASSERT) == 1) */
480 
490 #define xTraceEventGetSize(pvAddress, puiSize) (*(uint32_t*)(puiSize) = sizeof(TraceBaseEvent_t) + (TRC_EVENT_GET_PARAM_COUNT(((TraceBaseEvent_t*)(pvAddress))->EventID)) * sizeof(uint32_t), TRC_SUCCESS)
491 
506 #define xTraceEventGetRawData TRC_EVENT_GET_RAW_DATA
507 
522 #define xTraceEventGetPayload TRC_EVENT_GET_PAYLOAD
523 
533 #define xTraceEventPayloadRemaining TRC_EVENT_PAYLOAD_REMAINING
534 
544 #define xTraceEventPayloadUsed TRC_EVENT_PAYLOAD_USED
545 
555 #define xTraceEventPayloadSize TRC_EVENT_PAYLOAD_SIZE
556 
557 /* Adds a pointer as event payload with no errors checks */
558 #define xTraceEventAddPointer TRC_EVENT_ADD_POINTER
559 
569 #define xTraceEventAddUnsignedBaseType TRC_EVENT_ADD_UNSIGNED_BASE_TYPE
570 
580 #define xTraceEventAdd32 TRC_EVENT_ADD_32
581 
591 #define xTraceEventAdd16 TRC_EVENT_ADD_16
592 
602 #define xTraceEventAdd8 TRC_EVENT_ADD_8
603 
604 #endif /* ((TRC_CFG_USE_TRACE_ASSERT) == 1) */
605 
608 #ifdef __cplusplus
609 }
610 #endif
611 
612 #endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) */
613 
614 #endif /* (TRC_USE_TRACEALYZER_RECORDER == 1) */
615 
616 #endif /* TRC_EVENT_H */
xTraceEventAdd8
#define xTraceEventAdd8
Adds an uint8_t as trace event payload.
Definition: trcEvent.h:602
xTraceEventGetRawData
#define xTraceEventGetRawData
Gets trace event data pointer with an offset.
Definition: trcEvent.h:506
xTraceEventAddUnsignedBaseType
#define xTraceEventAddUnsignedBaseType
Adds an unsigned base type value as trace event payload.
Definition: trcEvent.h:569
xTraceEventAdd32
#define xTraceEventAdd32
Adds an uint32_t as trace event payload.
Definition: trcEvent.h:580
xTraceEventPayloadSize
#define xTraceEventPayloadSize
Gets trace event payload size.
Definition: trcEvent.h:555
xTraceEventAddData
traceResult xTraceEventAddData(TraceEventHandle_t xEventHandle, void *pvData, uint32_t uiSize)
Adds data to event payload.
Definition: trcEvent.c:230
xTraceEventAdd16
#define xTraceEventAdd16
Adds an uint16_t as trace event payload.
Definition: trcEvent.h:591
xTraceEventPayloadRemaining
#define xTraceEventPayloadRemaining
Gets the amount of remaining trace event payload.
Definition: trcEvent.h:533
xTraceEventGetPayload
#define xTraceEventGetPayload
Gets trace event payload pointer with an offset.
Definition: trcEvent.h:522
xTraceEventPayloadUsed
#define xTraceEventPayloadUsed
Gets the amount of used trace event payload.
Definition: trcEvent.h:544
xTraceEventGetSize
#define xTraceEventGetSize(pvAddress, puiSize)
Gets trace event size.
Definition: trcEvent.h:490