Percepio Trace Recorder v4.8.0.hotfix1
Loading...
Searching...
No Matches
trcKernelPort.h
1/*
2 * Trace Recorder for Tracealyzer v4.8.0.hotfix1
3 * Copyright 2023 Percepio AB
4 * www.percepio.com
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 *
8 * FreeRTOS specific definitions needed by the trace recorder
9 */
10
11#ifndef TRC_KERNEL_PORT_H
12#define TRC_KERNEL_PORT_H
13
14#include <trcDefines.h>
15#include <FreeRTOS.h> /* Defines configUSE_TRACE_FACILITY */
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21#define TRC_USE_TRACEALYZER_RECORDER configUSE_TRACE_FACILITY
22
23/* FreeRTOS version codes */
24#define FREERTOS_VERSION_NOT_SET 0
25#define TRC_FREERTOS_VERSION_7_3_X 1 /* v7.3 is earliest supported.*/
26#define TRC_FREERTOS_VERSION_7_4_X 2
27#define TRC_FREERTOS_VERSION_7_5_X 3
28#define TRC_FREERTOS_VERSION_7_6_X TRC_FREERTOS_VERSION_7_5_X
29#define TRC_FREERTOS_VERSION_8_X_X 4
30#define TRC_FREERTOS_VERSION_9_0_0 5
31#define TRC_FREERTOS_VERSION_9_0_1 6
32#define TRC_FREERTOS_VERSION_9_0_2 7
33#define TRC_FREERTOS_VERSION_10_0_0 8
34#define TRC_FREERTOS_VERSION_10_0_1 TRC_FREERTOS_VERSION_10_0_0
35#define TRC_FREERTOS_VERSION_10_1_0 9
36#define TRC_FREERTOS_VERSION_10_1_1 TRC_FREERTOS_VERSION_10_1_0
37#define TRC_FREERTOS_VERSION_10_2_0 TRC_FREERTOS_VERSION_10_1_0
38#define TRC_FREERTOS_VERSION_10_2_1 TRC_FREERTOS_VERSION_10_1_0
39#define TRC_FREERTOS_VERSION_10_3_0 10
40#define TRC_FREERTOS_VERSION_10_3_1 TRC_FREERTOS_VERSION_10_3_0
41#define TRC_FREERTOS_VERSION_10_4_0 11
42#define TRC_FREERTOS_VERSION_10_4_1 TRC_FREERTOS_VERSION_10_4_0
43#define TRC_FREERTOS_VERSION_10_4_2 TRC_FREERTOS_VERSION_10_4_0
44#define TRC_FREERTOS_VERSION_10_4_3 TRC_FREERTOS_VERSION_10_4_0
45#define TRC_FREERTOS_VERSION_10_5_0 TRC_FREERTOS_VERSION_10_4_0
46#define TRC_FREERTOS_VERSION_10_5_1 TRC_FREERTOS_VERSION_10_4_0
47
48/* Legacy FreeRTOS version codes for backwards compatibility with old trace configurations */
49#define TRC_FREERTOS_VERSION_7_3 TRC_FREERTOS_VERSION_7_3_X
50#define TRC_FREERTOS_VERSION_7_4 TRC_FREERTOS_VERSION_7_4_X
51#define TRC_FREERTOS_VERSION_7_5_OR_7_6 TRC_FREERTOS_VERSION_7_5_X
52#define TRC_FREERTOS_VERSION_8_X TRC_FREERTOS_VERSION_8_X_X
53
54#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
55#define prvGetStreamBufferType(x) ((( StreamBuffer_t * )(x) )->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER)
56#else
57#define prvGetStreamBufferType(x) 0
58#endif
59
60/* Added mainly for our internal testing. This makes it easier to create test applications that
61 runs on multiple FreeRTOS versions. */
62#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X_X)
63 /* FreeRTOS v7.x */
64 #define STRING_CAST(x) ( (signed char*) x )
65 #define TraceKernelPortTickType_t portTickType
66 #define TraceKernelPortTaskHandle_t xTaskHandle
67#else
68 /* FreeRTOS v8.0 and later */
69 #define STRING_CAST(x) x
70 #define TraceKernelPortTickType_t TickType_t
71 #define TraceKernelPortTaskHandle_t TaskHandle_t
72#endif
73
74#if (defined(TRC_USE_TRACEALYZER_RECORDER)) && (TRC_USE_TRACEALYZER_RECORDER == 1)
75
76#define TRC_PLATFORM_CFG "FreeRTOS"
77#define TRC_PLATFORM_CFG_MAJOR 1
78#define TRC_PLATFORM_CFG_MINOR 2
79#define TRC_PLATFORM_CFG_PATCH 0
80
81#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0)
82
88#define TRC_CFG_ALLOW_TASK_DELETE INCLUDE_vTaskDelete
89
90/* Required for stack monitoring */
91#undef INCLUDE_uxTaskGetStackHighWaterMark
92#define INCLUDE_uxTaskGetStackHighWaterMark 1
93
94#endif
95
96/* INCLUDE_xTaskGetCurrentTaskHandle must be set to 1 for tracing to work properly */
97#undef INCLUDE_xTaskGetCurrentTaskHandle
98#define INCLUDE_xTaskGetCurrentTaskHandle 1
99
100#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
101
102#define TRC_KERNEL_PORT_KERNEL_CAN_SWITCH_TO_SAME_TASK 0
103
104#include <trcHeap.h>
105
106#define TRC_KERNEL_PORT_BUFFER_SIZE (sizeof(TraceHeapHandle_t) + sizeof(void*))
107#elif (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT)
108#define TRC_KERNEL_PORT_BUFFER_SIZE (sizeof(TraceUnsignedBaseType_t))
109#endif
110
111#if (TRC_CFG_FREERTOS_VERSION == FREERTOS_VERSION_NOT_SET)
112#error "Please set TRC_CFG_FREERTOS_VERSION in trcKernelPortConfig.h to the FreeRTOS version used."
113#endif
114
118typedef struct TraceKernelPortDataBuffer /* Aligned */
119{
120 uint8_t buffer[TRC_KERNEL_PORT_BUFFER_SIZE];
122
131traceResult xTraceKernelPortInitialize(TraceKernelPortDataBuffer_t* pxBuffer);
132
139traceResult xTraceKernelPortEnable(void);
140
149traceResult xTraceKernelPortDelay(uint32_t uiTicks);
150
157unsigned char xTraceKernelPortIsSchedulerSuspended(void);
158
162#define TRC_KERNEL_PORT_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
163
167#define TRC_KERNEL_PORT_ENTER_CRITICAL_SECTION() TRACE_ALLOC_CRITICAL_SECTION_NAME = 0; portENTER_CRITICAL()
168
172#define TRC_KERNEL_PORT_EXIT_CRITICAL_SECTION() (void)TRACE_ALLOC_CRITICAL_SECTION_NAME; portEXIT_CRITICAL()
173
177#define TRC_KERNEL_PORT_SET_INTERRUPT_MASK() ((TraceBaseType_t)portSET_INTERRUPT_MASK_FROM_ISR())
178
179#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
180
184#define TRC_KERNEL_PORT_CLEAR_INTERRUPT_MASK(xMask) portCLEAR_INTERRUPT_MASK_FROM_ISR((UBaseType_t)(xMask))
185
186#else
187
191#define TRC_KERNEL_PORT_CLEAR_INTERRUPT_MASK(xMask) portCLEAR_INTERRUPT_MASK_FROM_ISR((unsigned portBASE_TYPE)xMask)
192#endif
193
194#if (TRC_CFG_SCHEDULING_ONLY == 0)
195
202void vTraceSetQueueName(void* pvQueue, const char* szName);
203
210void vTraceSetSemaphoreName(void* pvSemaphore, const char* szName);
211
218void vTraceSetMutexName(void* pvMutex, const char* szName);
219
220#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1)
221
228void vTraceSetEventGroupName(void* pvEventGroup, const char* szName);
229
230#else
231
235#define vTraceSetEventGroupName(__pvEventGroup, __szName) ((void)(__pvEventGroup), (void)(__szName))
236
237#endif
238
239#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1)
240
247void vTraceSetStreamBufferName(void* pvStreamBuffer, const char* szName);
248
255void vTraceSetMessageBufferName(void* pvMessageBuffer, const char* szName);
256
257#else
258
262#define vTraceSetStreamBufferName(__pvStreamBuffer, __szName) ((void)(__pvStreamBuffer), (void)(__szName))
263
267#define vTraceSetMessageBufferName(__pvMessageBuffer, __szName) ((void)(__pvMessageBuffer), (void)(__szName))
268
269#endif
270
271#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1)
272
282traceResult xTraceKernelPortGetUnusedStack(void* pvTask, TraceUnsignedBaseType_t *puxUnusedStack);
283
284#endif
285
286#else
287
291#define vTraceSetQueueName(__pvQueue, __szName) ((void)(__pvQueue), (void)(__szName))
292
296#define vTraceSetSemaphoreName(__pvSemaphore, __szName) ((void)(__pvSemaphore), (void)(__szName))
297
301#define vTraceSetMutexName(__pvMutex, __szName) ((void)(__pvMutex), (void)(__szName))
302
306#define vTraceSetEventGroupName(__pvEventGroup, __szName) ((void)(__pvEventGroup), (void)(__szName))
307
311#define vTraceSetStreamBufferName(__pvStreamBuffer, __szName) ((void)(__pvStreamBuffer), (void)(__szName))
312
316#define vTraceSetMessageBufferName(__pvMessageBuffer, __szName) ((void)(__pvMessageBuffer), (void)(__szName))
317
321#define xTraceKernelPortGetUnusedStack(pvTask, puxUnusedStack) ((void)(pvTask), (void)(puxUnusedStack))
322
323#endif
324
325#if (((TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) && (TRC_CFG_INCLUDE_ISR_TRACING == 1)) || (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING))
326
327/* Required for ISR tracing and Streaming */
328#undef INCLUDE_xTaskGetSchedulerState
329#define INCLUDE_xTaskGetSchedulerState 1
330
331#endif
332
336#define TRACE_KERNEL_VERSION 0x1AA1
337
341#define TRC_TICK_RATE_HZ configTICK_RATE_HZ /* Defined in "FreeRTOS.h" */
342
346#define TRACE_CPU_CLOCK_HZ configCPU_CLOCK_HZ /* Defined in "FreeRTOSConfig.h" */
347
348#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC)
352#define TRC_KERNEL_PORT_HEAP_INIT(size)
353
357#define TRC_KERNEL_PORT_HEAP_MALLOC(size) pvPortMalloc(size)
358#endif /* (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC) */
359
360#if (defined(configUSE_TIMERS) && (configUSE_TIMERS == 1))
361
362#undef INCLUDE_xTimerGetTimerDaemonTaskHandle
363#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1
364
365#endif
366
367#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XMOS_XCOREAI)
368
369#undef TRC_CFG_CORE_COUNT
370#define TRC_CFG_CORE_COUNT configNUM_CORES
371
372#undef TRC_CFG_GET_CURRENT_CORE
373#define TRC_CFG_GET_CURRENT_CORE() rtos_core_id_get()
374
375#endif
376
377#ifdef _CMSIS_RP2040_H_
378#undef TRC_CFG_CORE_COUNT
379#define TRC_CFG_CORE_COUNT configNUM_CORES
380
381#undef TRC_CFG_GET_CURRENT_CORE
382#define TRC_CFG_GET_CURRENT_CORE() get_core_num()
383#endif
384
385#if (TRC_CFG_FREERTOS_VERSION == TRC_FREERTOS_VERSION_9_0_1)
386
410#define isQueueReceiveHookActuallyPeek (__LINE__ > 1674) /* Half way between the closes trace points */
411
412#elif (TRC_CFG_FREERTOS_VERSION <= TRC_FREERTOS_VERSION_9_0_0)
413
417#define isQueueReceiveHookActuallyPeek xJustPeeking
418
419#elif (TRC_CFG_FREERTOS_VERSION > TRC_FREERTOS_VERSION_9_0_1)
420
424#define isQueueReceiveHookActuallyPeek (__LINE__ < 0) /* instead of pdFALSE to fix a warning of "constant condition" */
425
426#endif
427
428/* Helpers needed to correctly expand names */
429#define TZ__CAT2(a,b) a ## b
430#define TZ__CAT(a,b) TZ__CAT2(a, b)
431
432/*
433 * The following xQueueGiveFromISR macro hacks make sure xQueueGiveFromISR also has a xCopyPosition parameter
434 */
435
436/* Expands name if this header is included... uxQueueType must be a macro that only exists in queue.c or whatever, and it must expand to nothing or to something that's valid in identifiers */
437#define xQueueGiveFromISR(a,b) TZ__CAT(xQueueGiveFromISR__, uxQueueType) (a,b)
438
439/* If in queue.c, the "uxQueueType" macro expands to "pcHead". queueSEND_TO_BACK is the value we need to send in */
440#define xQueueGiveFromISR__pcHead(__a, __b) MyWrapper_xQueueGiveFromISR(__a, __b, const BaseType_t xCopyPosition); \
441BaseType_t xQueueGiveFromISR(__a, __b) { return MyWrapper_xQueueGiveFromISR(xQueue, pxHigherPriorityTaskWoken, queueSEND_TO_BACK); } \
442BaseType_t MyWrapper_xQueueGiveFromISR(__a, __b, const BaseType_t xCopyPosition)
443
444/* If not in queue.c, "uxQueueType" isn't expanded */
445#define xQueueGiveFromISR__uxQueueType(__a, __b) xQueueGiveFromISR(__a,__b)
446
447#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT)
448
452#define TRACE_GET_CURRENT_TASK() prvTraceGetCurrentTaskHandle()
453
454extern uint16_t CurrentFilterMask;
455extern uint16_t CurrentFilterGroup;
456
464uint8_t prvTraceGetQueueType(void* pvQueue);
465
473uint16_t prvTraceGetTaskNumberLow16(void* pvTask);
474
482uint16_t prvTraceGetTaskNumberHigh16(void* pvTask);
483
490void prvTraceSetTaskNumberLow16(void* pvTask, uint16_t uiValue);
491
498void prvTraceSetTaskNumberHigh16(void* pvTask, uint16_t uiValue);
499
507uint16_t prvTraceGetQueueNumberLow16(void* pvQueue);
508
516uint16_t prvTraceGetQueueNumberHigh16(void* pvQueue);
517
518
525void prvTraceSetQueueNumberLow16(void* pvQueue, uint16_t uiValue);
526
527
534void prvTraceSetQueueNumberHigh16(void* pvQueue, uint16_t uiValue);
535
536#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
537
545uint16_t prvTraceGetTimerNumberLow16(void* pvTimer);
546
554uint16_t prvTraceGetTimerNumberHigh16(void* pvTimer);
555
562void prvTraceSetTimerNumberLow16(void* pvTimer, uint16_t uiValue);
563
570void prvTraceSetTimerNumberHigh16(void* pvTimer, uint16_t uiValue);
571
572#endif
573
574#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
575
583uint16_t prvTraceGetEventGroupNumberLow16(void* pvEventGroup);
584
592uint16_t prvTraceGetEventGroupNumberHigh16(void* pvEventGroup);
593
600void prvTraceSetEventGroupNumberLow16(void* pvEventGroup, uint16_t uiValue);
601
608void prvTraceSetEventGroupNumberHigh16(void* handle, uint16_t value);
609
610#endif
611
612#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
613
621uint16_t prvTraceGetStreamBufferNumberLow16(void* pvStreamBuffer);
622
630uint16_t prvTraceGetStreamBufferNumberHigh16(void* pvStreamBuffer);
631
638void prvTraceSetStreamBufferNumberLow16(void* pvStreamBuffer, uint16_t uiValue);
639
646void prvTraceSetStreamBufferNumberHigh16(void* pvStreamBuffer, uint16_t uiValue);
647
648#endif
649
657#define TRACE_GET_TASK_FILTER(pxTask) prvTraceGetTaskNumberHigh16((void*)pxTask)
658
665#define TRACE_SET_TASK_FILTER(pxTask, group) prvTraceSetTaskNumberHigh16((void*)pxTask, group)
666
674#define TRACE_GET_QUEUE_FILTER(pxQueue) prvTraceGetQueueNumberHigh16((void*)pxQueue)
675
682#define TRACE_SET_QUEUE_FILTER(pxQueue, group) prvTraceSetQueueNumberHigh16((void*)pxQueue, group)
683
684#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
685
693#define TRACE_GET_EVENTGROUP_FILTER(pxEventGroup) prvTraceGetEventGroupNumberHigh16((void*)pxEventGroup)
694
701#define TRACE_SET_EVENTGROUP_FILTER(pxEventGroup, group) prvTraceSetEventGroupNumberHigh16((void*)pxEventGroup, group)
702
703#else
704
708#define TRACE_GET_EVENTGROUP_FILTER(pxEventGroup) ((void)(pxEventGroup), 1)
709
713#define TRACE_SET_EVENTGROUP_FILTER(pxEventGroup, group) ((void)(pxEventGroup), (void)(group))
714
715#endif
716
717#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
718
726#define TRACE_GET_TIMER_FILTER(pxTimer) prvTraceGetTimerNumberHigh16((void*)pxTimer)
727
734#define TRACE_SET_TIMER_FILTER(pxTimer, group) prvTraceSetTimerNumberHigh16((void*)pxTimer, group)
735
736#else
737
741#define TRACE_GET_TIMER_FILTER(pxTimer) ((void)(pxTimer), 1)
742
746#define TRACE_SET_TIMER_FILTER(pxTimer, group) ((void)(pxTimer), (void)(group))
747
748#endif
749
757#define TRACE_GET_STREAMBUFFER_FILTER(pxStreamBuffer) prvTraceGetStreamBufferNumberHigh16((void*)pxStreamBuffer)
758
765#define TRACE_SET_STREAMBUFFER_FILTER(pxStreamBuffer, group) prvTraceSetStreamBufferNumberHigh16((void*)pxStreamBuffer, group)
766
767#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
768
772#define TRACE_GET_OBJECT_FILTER(CLASS, pxObject) TRACE_GET_##CLASS##_FILTER(pxObject)
773
777#define TRACE_SET_OBJECT_FILTER(CLASS, pxObject, group) TRACE_SET_##CLASS##_FILTER(pxObject, group)
778
779#else
780
784#define TRACE_GET_OBJECT_FILTER(CLASS, pxObject) 0xFFFF
785
789#define TRACE_SET_OBJECT_FILTER(CLASS, pxObject, group)
790
791#endif
792
793/* The object classes */
794#define TRACE_NCLASSES 9
795#define TRACE_CLASS_QUEUE ((traceObjectClass)0)
796#define TRACE_CLASS_SEMAPHORE ((traceObjectClass)1)
797#define TRACE_CLASS_MUTEX ((traceObjectClass)2)
798#define TRACE_CLASS_TASK ((traceObjectClass)3)
799#define TRACE_CLASS_ISR ((traceObjectClass)4)
800#define TRACE_CLASS_TIMER ((traceObjectClass)5)
801#define TRACE_CLASS_EVENTGROUP ((traceObjectClass)6)
802#define TRACE_CLASS_STREAMBUFFER ((traceObjectClass)7)
803#define TRACE_CLASS_MESSAGEBUFFER ((traceObjectClass)8)
804
805/* Definitions for Object Table */
806#define TRACE_KERNEL_OBJECT_COUNT ((TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) + (TRC_CFG_NSTREAMBUFFER) + (TRC_CFG_NMESSAGEBUFFER))
807
808/* Queue properties (except name): current number of message in queue */
809#define PropertyTableSizeQueue ((TRC_CFG_NAME_LEN_QUEUE) + 1)
810
811/* Semaphore properties (except name): state (signaled = 1, cleared = 0) */
812#define PropertyTableSizeSemaphore ((TRC_CFG_NAME_LEN_SEMAPHORE) + 1)
813
814/* Mutex properties (except name): owner (task handle, 0 = free) */
815#define PropertyTableSizeMutex ((TRC_CFG_NAME_LEN_MUTEX) + 1)
816
817/* Task properties (except name): Byte 0: Current priority
818 Byte 1: state (if already active)
819 Byte 2: legacy, not used
820 Byte 3: legacy, not used */
821#define PropertyTableSizeTask ((TRC_CFG_NAME_LEN_TASK) + 4)
822
823/* ISR properties: Byte 0: priority
824 Byte 1: state (if already active) */
825#define PropertyTableSizeISR ((TRC_CFG_NAME_LEN_ISR) + 2)
826
827/* TRC_CFG_NTIMER properties: Byte 0: state (unused for now) */
828#define PropertyTableSizeTimer ((TRC_CFG_NAME_LEN_TIMER) + 1)
829
830/* TRC_CFG_NEVENTGROUP properties: Byte 0-3: state (unused for now)*/
831#define PropertyTableSizeEventGroup ((TRC_CFG_NAME_LEN_EVENTGROUP) + 4)
832
833/* TRC_CFG_NSTREAMBUFFER properties: Byte 0-3: state (unused for now)*/
834#define PropertyTableSizeStreamBuffer ((TRC_CFG_NAME_LEN_STREAMBUFFER) + 4)
835
836/* TRC_CFG_NMESSAGEBUFFER properties: Byte 0-3: state (unused for now)*/
837#define PropertyTableSizeMessageBuffer ((TRC_CFG_NAME_LEN_MESSAGEBUFFER) + 4)
838
839
840/* The layout of the byte array representing the Object Property Table */
841#define StartIndexQueue (0)
842#define StartIndexSemaphore (StartIndexQueue + (TRC_CFG_NQUEUE) * PropertyTableSizeQueue)
843#define StartIndexMutex (StartIndexSemaphore + (TRC_CFG_NSEMAPHORE) * PropertyTableSizeSemaphore)
844#define StartIndexTask (StartIndexMutex + (TRC_CFG_NMUTEX) * PropertyTableSizeMutex)
845#define StartIndexISR (StartIndexTask + (TRC_CFG_NTASK) * PropertyTableSizeTask)
846#define StartIndexTimer (StartIndexISR + (TRC_CFG_NISR) * PropertyTableSizeISR)
847#define StartIndexEventGroup (StartIndexTimer + (TRC_CFG_NTIMER) * PropertyTableSizeTimer)
848#define StartIndexStreamBuffer (StartIndexEventGroup + (TRC_CFG_NEVENTGROUP) * PropertyTableSizeEventGroup)
849#define StartIndexMessageBuffer (StartIndexStreamBuffer + (TRC_CFG_NSTREAMBUFFER) * PropertyTableSizeStreamBuffer)
850
851/* Number of bytes used by the object table */
852#define TRACE_OBJECT_TABLE_SIZE (StartIndexMessageBuffer + (TRC_CFG_NMESSAGEBUFFER) * PropertyTableSizeMessageBuffer)
853
854/* Flag to tell the context of tracePEND_FUNC_CALL_FROM_ISR */
855extern int uiInEventGroupSetBitsFromISR;
856
860traceResult xTraceKernelPortInitObjectPropertyTable(void);
861
865traceResult xTraceKernelPortInitObjectHandleStack(void);
866
870const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass);
871
875void* prvTraceGetCurrentTaskHandle(void);
876
877extern traceObjectClass TraceQueueClassTable[5];
878
879
880/*** Event codes for snapshot mode - must match Tracealyzer config files ******/
881
882#define NULL_EVENT (0x00UL)
883
884/*******************************************************************************
885 * EVENTGROUP_DIV
886 *
887 * Miscellaneous events.
888 ******************************************************************************/
889#define EVENTGROUP_DIV (NULL_EVENT + 1UL) /*0x01*/
890#define DIV_XPS (EVENTGROUP_DIV + 0UL) /*0x01*/
891#define DIV_TASK_READY (EVENTGROUP_DIV + 1UL) /*0x02*/
892#define DIV_NEW_TIME (EVENTGROUP_DIV + 2UL) /*0x03*/
893
894/*******************************************************************************
895 * EVENTGROUP_TS
896 *
897 * Events for storing task-switches and interrupts. The RESUME events are
898 * generated if the task/interrupt is already marked active.
899 ******************************************************************************/
900#define EVENTGROUP_TS (EVENTGROUP_DIV + 3UL) /*0x04*/
901#define TS_ISR_BEGIN (EVENTGROUP_TS + 0UL) /*0x04*/
902#define TS_ISR_RESUME (EVENTGROUP_TS + 1UL) /*0x05*/
903#define TS_TASK_BEGIN (EVENTGROUP_TS + 2UL) /*0x06*/
904#define TS_TASK_RESUME (EVENTGROUP_TS + 3UL) /*0x07*/
905
906/*******************************************************************************
907 * EVENTGROUP_OBJCLOSE_NAME
908 *
909 * About Close Events
910 * When an object is evicted from the object property table (object close), two
911 * internal events are stored (EVENTGROUP_OBJCLOSE_NAME and
912 * EVENTGROUP_OBJCLOSE_PROP), containing the handle-name mapping and object
913 * properties valid up to this point.
914 ******************************************************************************/
915#define EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS (EVENTGROUP_TS + 4UL) /*0x08*/
916
917/*******************************************************************************
918 * EVENTGROUP_OBJCLOSE_PROP
919 *
920 * The internal event carrying properties of deleted objects
921 * The handle and object class of the closed object is not stored in this event,
922 * but is assumed to be the same as in the preceding CLOSE event. Thus, these
923 * two events must be generated from within a critical section.
924 * When queues are closed, arg1 is the "state" property (i.e., number of
925 * buffered messages/signals).
926 * When actors are closed, arg1 is priority, arg2 is handle of the "instance
927 * finish" event, and arg3 is event code of the "instance finish" event.
928 * In this case, the lower three bits is the object class of the instance finish
929 * handle. The lower three bits are not used (always zero) when queues are
930 * closed since the queue type is given in the previous OBJCLOSE_NAME event.
931 ******************************************************************************/
932#define EVENTGROUP_OBJCLOSE_PROP_TRCSUCCESS (EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + 8UL) /*0x10*/
933
934/*******************************************************************************
935 * EVENTGROUP_CREATE
936 *
937 * The events in this group are used to log Kernel object creations.
938 * The lower three bits in the event code gives the object class, i.e., type of
939 * create operation (task, queue, semaphore, etc).
940 ******************************************************************************/
941#define EVENTGROUP_CREATE_OBJ_TRCSUCCESS (EVENTGROUP_OBJCLOSE_PROP_TRCSUCCESS + 8UL) /*0x18*/
942
943/*******************************************************************************
944 * EVENTGROUP_SEND
945 *
946 * The events in this group are used to log Send/Give events on queues,
947 * semaphores and mutexes The lower three bits in the event code gives the
948 * object class, i.e., what type of object that is operated on (queue, semaphore
949 * or mutex).
950 ******************************************************************************/
951#define EVENTGROUP_SEND_TRCSUCCESS (EVENTGROUP_CREATE_OBJ_TRCSUCCESS + 8UL) /*0x20*/
952
953/*******************************************************************************
954 * EVENTGROUP_RECEIVE
955 *
956 * The events in this group are used to log Receive/Take events on queues,
957 * semaphores and mutexes. The lower three bits in the event code gives the
958 * object class, i.e., what type of object that is operated on (queue, semaphore
959 * or mutex).
960 ******************************************************************************/
961#define EVENTGROUP_RECEIVE_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 8UL) /*0x28*/
962
963/* Send/Give operations, from ISR */
964#define EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS \
965 (EVENTGROUP_RECEIVE_TRCSUCCESS + 8UL) /*0x30*/
966
967/* Receive/Take operations, from ISR */
968#define EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS \
969 (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 8UL) /*0x38*/
970
971/* "Failed" event type versions of above (timeout, failed allocation, etc) */
972#define EVENTGROUP_KSE_TRCFAILED \
973 (EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS + 8UL) /*0x40*/
974
975/* Failed create calls - memory allocation failed */
976#define EVENTGROUP_CREATE_OBJ_TRCFAILED (EVENTGROUP_KSE_TRCFAILED) /*0x40*/
977
978/* Failed send/give - timeout! */
979#define EVENTGROUP_SEND_TRCFAILED (EVENTGROUP_CREATE_OBJ_TRCFAILED + 8UL) /*0x48*/
980
981/* Failed receive/take - timeout! */
982#define EVENTGROUP_RECEIVE_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 8UL) /*0x50*/
983
984/* Failed non-blocking send/give - queue full */
985#define EVENTGROUP_SEND_FROM_ISR_TRCFAILED (EVENTGROUP_RECEIVE_TRCFAILED + 8UL) /*0x58*/
986
987/* Failed non-blocking receive/take - queue empty */
988#define EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED \
989 (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 8UL) /*0x60*/
990
991/* Events when blocking on receive/take */
992#define EVENTGROUP_RECEIVE_TRCBLOCK \
993 (EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED + 8UL) /*0x68*/
994
995/* Events when blocking on send/give */
996#define EVENTGROUP_SEND_TRCBLOCK (EVENTGROUP_RECEIVE_TRCBLOCK + 8UL) /*0x70*/
997
998/* Events on queue peek (receive) */
999#define EVENTGROUP_PEEK_TRCSUCCESS (EVENTGROUP_SEND_TRCBLOCK + 8UL) /*0x78*/
1000
1001/* Events on object delete (vTaskDelete or vQueueDelete) */
1002#define EVENTGROUP_DELETE_OBJ_TRCSUCCESS (EVENTGROUP_PEEK_TRCSUCCESS + 8UL) /*0x80*/
1003
1004/* Other events - object class is implied: TASK */
1005#define EVENTGROUP_OTHERS (EVENTGROUP_DELETE_OBJ_TRCSUCCESS + 8UL) /*0x88*/
1006#define TASK_DELAY_UNTIL (EVENTGROUP_OTHERS + 0UL) /*0x88*/
1007#define TASK_DELAY (EVENTGROUP_OTHERS + 1UL) /*0x89*/
1008#define TASK_SUSPEND (EVENTGROUP_OTHERS + 2UL) /*0x8A*/
1009#define TASK_RESUME (EVENTGROUP_OTHERS + 3UL) /*0x8B*/
1010#define TASK_RESUME_FROM_ISR (EVENTGROUP_OTHERS + 4UL) /*0x8C*/
1011#define TASK_PRIORITY_SET (EVENTGROUP_OTHERS + 5UL) /*0x8D*/
1012#define TASK_PRIORITY_INHERIT (EVENTGROUP_OTHERS + 6UL) /*0x8E*/
1013#define TASK_PRIORITY_DISINHERIT (EVENTGROUP_OTHERS + 7UL) /*0x8F*/
1014
1015#define EVENTGROUP_MISC_PLACEHOLDER (EVENTGROUP_OTHERS + 8UL) /*0x90*/
1016#define PEND_FUNC_CALL (EVENTGROUP_MISC_PLACEHOLDER+0UL) /*0x90*/
1017#define PEND_FUNC_CALL_FROM_ISR (EVENTGROUP_MISC_PLACEHOLDER+1UL) /*0x91*/
1018#define PEND_FUNC_CALL_TRCFAILED (EVENTGROUP_MISC_PLACEHOLDER+2UL) /*0x92*/
1019#define PEND_FUNC_CALL_FROM_ISR_TRCFAILED (EVENTGROUP_MISC_PLACEHOLDER+3UL) /*0x93*/
1020#define MEM_MALLOC_SIZE (EVENTGROUP_MISC_PLACEHOLDER+4UL) /*0x94*/
1021#define MEM_MALLOC_ADDR (EVENTGROUP_MISC_PLACEHOLDER+5UL) /*0x95*/
1022#define MEM_FREE_SIZE (EVENTGROUP_MISC_PLACEHOLDER+6UL) /*0x96*/
1023#define MEM_FREE_ADDR (EVENTGROUP_MISC_PLACEHOLDER+7UL) /*0x97*/
1024
1025/* User events */
1026#define EVENTGROUP_USEREVENT (EVENTGROUP_MISC_PLACEHOLDER + 8UL) /*0x98*/
1027#define USER_EVENT (EVENTGROUP_USEREVENT + 0UL)
1028
1029/* Allow for 0-15 arguments (the number of args is added to event code) */
1030#define USER_EVENT_LAST (EVENTGROUP_USEREVENT + 15UL) /*0xA7*/
1031
1032/*******************************************************************************
1033 * XTS Event - eXtended TimeStamp events
1034 * The timestamps used in the recorder are "differential timestamps" (DTS), i.e.
1035 * the time since the last stored event. The DTS fields are either 1 or 2 bytes
1036 * in the other events, depending on the bytes available in the event struct.
1037 * If the time since the last event (the DTS) is larger than allowed for by
1038 * the DTS field of the current event, an XTS event is inserted immediately
1039 * before the original event. The XTS event contains up to 3 additional bytes
1040 * of the DTS value - the higher bytes of the true DTS value. The lower 1-2
1041 * bytes are stored in the normal DTS field.
1042 * There are two types of XTS events, XTS8 and XTS16. An XTS8 event is stored
1043 * when there is only room for 1 byte (8 bit) DTS data in the original event,
1044 * which means a limit of 0xFF (255UL). The XTS16 is used when the original event
1045 * has a 16 bit DTS field and thereby can handle values up to 0xFFFF (65535UL).
1046 *
1047 * Using a very high frequency time base can result in many XTS events.
1048 * Preferably, the time between two OS ticks should fit in 16 bits, i.e.,
1049 * at most 65535. If your time base has a higher frequency, you can define
1050 * the TRACE
1051 ******************************************************************************/
1052
1053#define EVENTGROUP_SYS (EVENTGROUP_USEREVENT + 16UL) /*0xA8*/
1054#define XTS8 (EVENTGROUP_SYS + 0UL) /*0xA8*/
1055#define XTS16 (EVENTGROUP_SYS + 1UL) /*0xA9*/
1056#define EVENT_BEING_WRITTEN (EVENTGROUP_SYS + 2UL) /*0xAA*/
1057#define RESERVED_DUMMY_CODE (EVENTGROUP_SYS + 3UL) /*0xAB*/
1058#define LOW_POWER_BEGIN (EVENTGROUP_SYS + 4UL) /*0xAC*/
1059#define LOW_POWER_END (EVENTGROUP_SYS + 5UL) /*0xAD*/
1060#define XID (EVENTGROUP_SYS + 6UL) /*0xAE*/
1061#define XTS16L (EVENTGROUP_SYS + 7UL) /*0xAF*/
1062
1063#define EVENTGROUP_TIMER (EVENTGROUP_SYS + 8UL) /*0xB0*/
1064#define TIMER_CREATE (EVENTGROUP_TIMER + 0UL) /*0xB0*/
1065#define TIMER_START (EVENTGROUP_TIMER + 1UL) /*0xB1*/
1066#define TIMER_RST (EVENTGROUP_TIMER + 2UL) /*0xB2*/
1067#define TIMER_STOP (EVENTGROUP_TIMER + 3UL) /*0xB3*/
1068#define TIMER_CHANGE_PERIOD (EVENTGROUP_TIMER + 4UL) /*0xB4*/
1069#define TIMER_DELETE_OBJ (EVENTGROUP_TIMER + 5UL) /*0xB5*/
1070#define TIMER_START_FROM_ISR (EVENTGROUP_TIMER + 6UL) /*0xB6*/
1071#define TIMER_RESET_FROM_ISR (EVENTGROUP_TIMER + 7UL) /*0xB7*/
1072#define TIMER_STOP_FROM_ISR (EVENTGROUP_TIMER + 8UL) /*0xB8*/
1073
1074#define TIMER_CREATE_TRCFAILED (EVENTGROUP_TIMER + 9UL) /*0xB9*/
1075#define TIMER_START_TRCFAILED (EVENTGROUP_TIMER + 10UL) /*0xBA*/
1076#define TIMER_RESET_TRCFAILED (EVENTGROUP_TIMER + 11UL) /*0xBB*/
1077#define TIMER_STOP_TRCFAILED (EVENTGROUP_TIMER + 12UL) /*0xBC*/
1078#define TIMER_CHANGE_PERIOD_TRCFAILED (EVENTGROUP_TIMER + 13UL) /*0xBD*/
1079#define TIMER_DELETE_TRCFAILED (EVENTGROUP_TIMER + 14UL) /*0xBE*/
1080#define TIMER_START_FROM_ISR_TRCFAILED (EVENTGROUP_TIMER + 15UL) /*0xBF*/
1081#define TIMER_RESET_FROM_ISR_TRCFAILED (EVENTGROUP_TIMER + 16UL) /*0xC0*/
1082#define TIMER_STOP_FROM_ISR_TRCFAILED (EVENTGROUP_TIMER + 17UL) /*0xC1*/
1083
1084#define EVENTGROUP_EG (EVENTGROUP_TIMER + 18UL) /*0xC2*/
1085#define EVENT_GROUP_CREATE (EVENTGROUP_EG + 0UL) /*0xC2*/
1086#define EVENT_GROUP_CREATE_TRCFAILED (EVENTGROUP_EG + 1UL) /*0xC3*/
1087#define EVENT_GROUP_SYNC_TRCBLOCK (EVENTGROUP_EG + 2UL) /*0xC4*/
1088#define EVENT_GROUP_SYNC_END (EVENTGROUP_EG + 3UL) /*0xC5*/
1089#define EVENT_GROUP_WAIT_BITS_TRCBLOCK (EVENTGROUP_EG + 4UL) /*0xC6*/
1090#define EVENT_GROUP_WAIT_BITS_END (EVENTGROUP_EG + 5UL) /*0xC7*/
1091#define EVENT_GROUP_CLEAR_BITS (EVENTGROUP_EG + 6UL) /*0xC8*/
1092#define EVENT_GROUP_CLEAR_BITS_FROM_ISR (EVENTGROUP_EG + 7UL) /*0xC9*/
1093#define EVENT_GROUP_SET_BITS (EVENTGROUP_EG + 8UL) /*0xCA*/
1094#define EVENT_GROUP_DELETE_OBJ (EVENTGROUP_EG + 9UL) /*0xCB*/
1095#define EVENT_GROUP_SYNC_END_TRCFAILED (EVENTGROUP_EG + 10UL) /*0xCC*/
1096#define EVENT_GROUP_WAIT_BITS_END_TRCFAILED (EVENTGROUP_EG + 11UL) /*0xCD*/
1097#define EVENT_GROUP_SET_BITS_FROM_ISR (EVENTGROUP_EG + 12UL) /*0xCE*/
1098#define EVENT_GROUP_SET_BITS_FROM_ISR_TRCFAILED (EVENTGROUP_EG + 13UL) /*0xCF*/
1099
1100#define TASK_INSTANCE_FINISHED_NEXT_KSE (EVENTGROUP_EG + 14UL) /*0xD0*/
1101#define TASK_INSTANCE_FINISHED_DIRECT (EVENTGROUP_EG + 15UL) /*0xD1*/
1102
1103#define TRACE_TASK_NOTIFY_GROUP (EVENTGROUP_EG + 16UL) /*0xD2*/
1104#define TRACE_TASK_NOTIFY (TRACE_TASK_NOTIFY_GROUP + 0UL) /*0xD2*/
1105#define TRACE_TASK_NOTIFY_TAKE (TRACE_TASK_NOTIFY_GROUP + 1UL) /*0xD3*/
1106#define TRACE_TASK_NOTIFY_TAKE_TRCBLOCK (TRACE_TASK_NOTIFY_GROUP + 2UL) /*0xD4*/
1107#define TRACE_TASK_NOTIFY_TAKE_TRCFAILED (TRACE_TASK_NOTIFY_GROUP + 3UL) /*0xD5*/
1108#define TRACE_TASK_NOTIFY_WAIT (TRACE_TASK_NOTIFY_GROUP + 4UL) /*0xD6*/
1109#define TRACE_TASK_NOTIFY_WAIT_TRCBLOCK (TRACE_TASK_NOTIFY_GROUP + 5UL) /*0xD7*/
1110#define TRACE_TASK_NOTIFY_WAIT_TRCFAILED (TRACE_TASK_NOTIFY_GROUP + 6UL) /*0xD8*/
1111#define TRACE_TASK_NOTIFY_FROM_ISR (TRACE_TASK_NOTIFY_GROUP + 7UL) /*0xD9*/
1112#define TRACE_TASK_NOTIFY_GIVE_FROM_ISR (TRACE_TASK_NOTIFY_GROUP + 8UL) /*0xDA*/
1113
1114#define TIMER_EXPIRED (TRACE_TASK_NOTIFY_GROUP + 9UL) /*0xDB*/
1115
1116 /* Events on queue peek (receive) */
1117#define EVENTGROUP_PEEK_TRCBLOCK (TRACE_TASK_NOTIFY_GROUP + 10UL) /*0xDC*/
1118/* peek block on queue: 0xDC */
1119/* peek block on semaphore: 0xDD */
1120/* peek block on mutex: 0xDE */
1121
1122/* Events on queue peek (receive) */
1123#define EVENTGROUP_PEEK_TRCFAILED (EVENTGROUP_PEEK_TRCBLOCK + 3UL) /*0xDF*/
1124/* peek failed on queue: 0xDF */
1125/* peek failed on semaphore: 0xE0 */
1126/* peek failed on mutex: 0xE1 */
1127
1128#define EVENTGROUP_STREAMBUFFER_DIV (EVENTGROUP_PEEK_TRCFAILED + 3UL) /*0xE2*/
1129#define TRACE_STREAMBUFFER_RESET (EVENTGROUP_STREAMBUFFER_DIV + 0) /*0xE2*/
1130#define TRACE_MESSAGEBUFFER_RESET (EVENTGROUP_STREAMBUFFER_DIV + 1UL) /*0xE3*/
1131#define TRACE_STREAMBUFFER_OBJCLOSE_NAME_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 2UL) /*0xE4*/
1132#define TRACE_MESSAGEBUFFER_OBJCLOSE_NAME_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 3UL) /*0xE5*/
1133#define TRACE_STREAMBUFFER_OBJCLOSE_PROP_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 4UL) /*0xE6*/
1134#define TRACE_MESSAGEBUFFER_OBJCLOSE_PROP_TRCSUCCESS (EVENTGROUP_STREAMBUFFER_DIV + 5UL) /*0xE7*/
1135
1136#define EVENTGROUP_MALLOC_FAILED (EVENTGROUP_STREAMBUFFER_DIV + 6UL) /*0xE8*/
1137#define MEM_MALLOC_SIZE_TRCFAILED (EVENTGROUP_MALLOC_FAILED + 0UL) /*0xE8*/
1138#define MEM_MALLOC_ADDR_TRCFAILED (EVENTGROUP_MALLOC_FAILED + 1UL) /*0xE9*/
1139
1140/* The following are using previously "lost" event codes */
1141#define TRACE_STREAMBUFFER_CREATE_OBJ_TRCSUCCESS (EVENTGROUP_CREATE_OBJ_TRCSUCCESS + 4UL) /*0x1C*/
1142#define TRACE_STREAMBUFFER_CREATE_OBJ_TRCFAILED (EVENTGROUP_CREATE_OBJ_TRCFAILED + 4UL) /*0x44*/
1143#define TRACE_STREAMBUFFER_DELETE_OBJ_TRCSUCCESS (EVENTGROUP_DELETE_OBJ_TRCSUCCESS + 4UL) /*0x84*/
1144#define TRACE_STREAMBUFFER_SEND_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 3UL) /*0x23*/
1145#define TRACE_STREAMBUFFER_SEND_TRCBLOCK (EVENTGROUP_SEND_TRCBLOCK + 3UL) /*0x73*/
1146#define TRACE_STREAMBUFFER_SEND_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 3UL) /*0x4B*/
1147#define TRACE_STREAMBUFFER_RECEIVE_TRCSUCCESS (EVENTGROUP_RECEIVE_TRCSUCCESS + 3UL) /*0x2B*/
1148#define TRACE_STREAMBUFFER_RECEIVE_TRCBLOCK (EVENTGROUP_RECEIVE_TRCBLOCK + 3UL) /*0x6B*/
1149#define TRACE_STREAMBUFFER_RECEIVE_TRCFAILED (EVENTGROUP_RECEIVE_TRCFAILED + 3UL) /*0x53*/
1150#define TRACE_STREAMBUFFER_SEND_FROM_ISR_TRCSUCCESS (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 3UL) /*0x33*/
1151#define TRACE_STREAMBUFFER_SEND_FROM_ISR_TRCFAILED (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 3UL) /*0x5B*/
1152#define TRACE_STREAMBUFFER_RECEIVE_FROM_ISR_TRCSUCCESS (EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS + 3UL) /*0x3B*/
1153#define TRACE_STREAMBUFFER_RECEIVE_FROM_ISR_TRCFAILED (EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED + 3UL) /*0x63*/
1154
1155/* The following are using previously "lost" event codes. These macros aren't even directly referenced, instead we do (equivalent STREAMBUFFER code) + 1. */
1156#define TRACE_MESSAGEBUFFER_CREATE_OBJ_TRCSUCCESS (EVENTGROUP_CREATE_OBJ_TRCSUCCESS + 5UL) /*0x1D*/
1157#define TRACE_MESSAGEBUFFER_CREATE_OBJ_TRCFAILED (EVENTGROUP_CREATE_OBJ_TRCFAILED + 5UL) /*0x45*/
1158#define TRACE_MESSAGEBUFFER_DELETE_OBJ_TRCSUCCESS (EVENTGROUP_DELETE_OBJ_TRCSUCCESS + 5UL) /*0x85*/
1159#define TRACE_MESSAGEBUFFER_SEND_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 4UL) /*0x24*/
1160#define TRACE_MESSAGEBUFFER_SEND_TRCBLOCK (EVENTGROUP_SEND_TRCBLOCK + 4UL) /*0x74*/
1161#define TRACE_MESSAGEBUFFER_SEND_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 4UL) /*0x4C*/
1162#define TRACE_MESSAGEBUFFER_RECEIVE_TRCSUCCESS (EVENTGROUP_RECEIVE_TRCSUCCESS + 4UL) /*0x2C*/
1163#define TRACE_MESSAGEBUFFER_RECEIVE_TRCBLOCK (EVENTGROUP_RECEIVE_TRCBLOCK + 4UL) /*0x6C*/
1164#define TRACE_MESSAGEBUFFER_RECEIVE_TRCFAILED (EVENTGROUP_RECEIVE_TRCFAILED + 4UL) /*0x54*/
1165#define TRACE_MESSAGEBUFFER_SEND_FROM_ISR_TRCSUCCESS (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 4UL) /*0x34*/
1166#define TRACE_MESSAGEBUFFER_SEND_FROM_ISR_TRCFAILED (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 4UL) /*0x5C*/
1167#define TRACE_MESSAGEBUFFER_RECEIVE_FROM_ISR_TRCSUCCESS (EVENTGROUP_RECEIVE_FROM_ISR_TRCSUCCESS + 4UL) /*0x3C*/
1168#define TRACE_MESSAGEBUFFER_RECEIVE_FROM_ISR_TRCFAILED (EVENTGROUP_RECEIVE_FROM_ISR_TRCFAILED + 4UL) /*0x64*/
1169
1170#define TRACE_QUEUE_SEND_TO_FRONT_TRCSUCCESS (EVENTGROUP_SEND_TRCSUCCESS + 5UL) /*0x25*/
1171#define TRACE_QUEUE_SEND_TO_FRONT_TRCBLOCK (EVENTGROUP_SEND_TRCBLOCK + 5UL) /*0x75*/
1172#define TRACE_QUEUE_SEND_TO_FRONT_TRCFAILED (EVENTGROUP_SEND_TRCFAILED + 5UL) /*0x4D*/
1173#define TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCSUCCESS (EVENTGROUP_SEND_FROM_ISR_TRCSUCCESS + 5UL) /*0x35*/
1174#define TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCFAILED (EVENTGROUP_SEND_FROM_ISR_TRCFAILED + 5UL) /*0x5D*/
1175
1176#define TRACE_UNUSED_STACK (EVENTGROUP_MALLOC_FAILED + 2UL) /*0xEA*/
1177
1178/* LAST EVENT (0xEA) */
1179
1180/****************************
1181* MACROS TO GET TRACE CLASS *
1182****************************/
1183#define TRACE_GET_TRACE_CLASS_FROM_TASK_CLASS(kernelClass) (TRACE_CLASS_TASK)
1184#define TRACE_GET_TRACE_CLASS_FROM_TASK_OBJECT(pxObject) (TRACE_CLASS_TASK)
1185
1186#define TRACE_GET_TRACE_CLASS_FROM_QUEUE_CLASS(kernelClass) TraceQueueClassTable[kernelClass]
1187#define TRACE_GET_TRACE_CLASS_FROM_QUEUE_OBJECT(pxObject) TRACE_GET_TRACE_CLASS_FROM_QUEUE_CLASS(prvTraceGetQueueType(pxObject))
1188
1189#define TRACE_GET_TRACE_CLASS_FROM_TIMER_CLASS(kernelClass) (TRACE_CLASS_TIMER)
1190#define TRACE_GET_TRACE_CLASS_FROM_TIMER_OBJECT(pxObject) (TRACE_CLASS_TIMER)
1191
1192#define TRACE_GET_TRACE_CLASS_FROM_EVENTGROUP_CLASS(kernelClass) (TRACE_CLASS_EVENTGROUP)
1193#define TRACE_GET_TRACE_CLASS_FROM_EVENTGROUP_OBJECT(pxObject) (TRACE_CLASS_EVENTGROUP)
1194
1195/* TRACE_GET_TRACE_CLASS_FROM_STREAMBUFFER_CLASS can only be accessed with a parameter indicating if it is a MessageBuffer */
1196#define TRACE_GET_TRACE_CLASS_FROM_STREAMBUFFER_CLASS(xIsMessageBuffer) (xIsMessageBuffer == 1 ? TRACE_CLASS_MESSAGEBUFFER : TRACE_CLASS_STREAMBUFFER)
1197#define TRACE_GET_TRACE_CLASS_FROM_STREAMBUFFER_OBJECT(pxObject) (prvGetStreamBufferType(pxObject) == 1 ? TRACE_CLASS_MESSAGEBUFFER : TRACE_CLASS_STREAMBUFFER)
1198
1199/* Generic versions */
1200#define TRACE_GET_CLASS_TRACE_CLASS(CLASS, kernelClass) TRACE_GET_TRACE_CLASS_FROM_##CLASS##_CLASS(kernelClass)
1201#define TRACE_GET_OBJECT_TRACE_CLASS(CLASS, pxObject) TRACE_GET_TRACE_CLASS_FROM_##CLASS##_OBJECT(pxObject)
1202
1203/******************************
1204* MACROS TO GET OBJECT NUMBER *
1205******************************/
1206#define TRACE_GET_TASK_NUMBER(pxTCB) (traceHandle)(prvTraceGetTaskNumberLow16(pxTCB))
1207#define TRACE_SET_TASK_NUMBER(pxTCB) prvTraceSetTaskNumberLow16(pxTCB, prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(TASK, pxTCB)));
1208
1209#define TRACE_GET_QUEUE_NUMBER(queue) ( ( traceHandle ) prvTraceGetQueueNumberLow16(queue) )
1210#define TRACE_SET_QUEUE_NUMBER(queue) prvTraceSetQueueNumberLow16(queue, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, queue)));
1211
1212#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
1213#define TRACE_GET_TIMER_NUMBER(tmr) ( ( traceHandle ) prvTraceGetTimerNumberLow16(tmr) )
1214#define TRACE_SET_TIMER_NUMBER(tmr) prvTraceSetTimerNumberLow16(tmr, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr)));
1215#else /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */
1216#define TRACE_GET_TIMER_NUMBER(tmr) ( ( traceHandle ) ((Timer_t*)tmr)->uxTimerNumber )
1217#define TRACE_SET_TIMER_NUMBER(tmr) ((Timer_t*)tmr)->uxTimerNumber = prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr));
1218#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */
1219
1220#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
1221#define TRACE_GET_EVENTGROUP_NUMBER(eg) ( ( traceHandle ) prvTraceGetEventGroupNumberLow16(eg) )
1222#define TRACE_SET_EVENTGROUP_NUMBER(eg) prvTraceSetEventGroupNumberLow16(eg, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg)));
1223#else /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */
1224#define TRACE_GET_EVENTGROUP_NUMBER(eg) ( ( traceHandle ) uxEventGroupGetNumber(eg) )
1225#define TRACE_SET_EVENTGROUP_NUMBER(eg) ((EventGroup_t*)eg)->uxEventGroupNumber = prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg));
1226#endif /* (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */
1227
1228
1229#define TRACE_GET_STREAMBUFFER_NUMBER(sb) ( ( traceHandle ) prvTraceGetStreamBufferNumberLow16(sb) )
1230#define TRACE_SET_STREAMBUFFER_NUMBER(sb) prvTraceSetStreamBufferNumberLow16(sb, (uint16_t)prvTraceGetObjectHandle(TRACE_GET_OBJECT_TRACE_CLASS(STREAMBUFFER, sb)));
1231
1232/* Generic versions */
1233#define TRACE_GET_OBJECT_NUMBER(CLASS, pxObject) TRACE_GET_##CLASS##_NUMBER(pxObject)
1234#define TRACE_SET_OBJECT_NUMBER(CLASS, pxObject) TRACE_SET_##CLASS##_NUMBER(pxObject)
1235
1236/******************************
1237* MACROS TO GET EVENT CODES *
1238******************************/
1239#define TRACE_GET_TASK_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_GET_CLASS_TRACE_CLASS(TASK, kernelClass))
1240#define TRACE_GET_QUEUE_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_GET_CLASS_TRACE_CLASS(QUEUE, kernelClass))
1241#define TRACE_GET_TIMER_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) -- THIS IS NOT USED --
1242#define TRACE_GET_EVENTGROUP_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass) -- THIS IS NOT USED --
1243#define TRACE_GET_STREAMBUFFER_CLASS_EVENT_CODE(SERVICE, RESULT, isMessageBuffer) (uint8_t)(TRACE_STREAMBUFFER_##SERVICE##_##RESULT + (uint8_t)isMessageBuffer)
1244
1245#define TRACE_GET_TASK_OBJECT_EVENT_CODE(SERVICE, RESULT, pxTCB) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_CLASS_TASK)
1246#define TRACE_GET_QUEUE_OBJECT_EVENT_CODE(SERVICE, RESULT, pxObject) (uint8_t)(EVENTGROUP_##SERVICE##_##RESULT + TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxObject))
1247#define TRACE_GET_TIMER_OBJECT_EVENT_CODE(SERVICE, RESULT, UNUSED) -- THIS IS NOT USED --
1248#define TRACE_GET_EVENTGROUP_OBJECT_EVENT_CODE(SERVICE, RESULT, UNUSED) -- THIS IS NOT USED --
1249#define TRACE_GET_STREAMBUFFER_OBJECT_EVENT_CODE(SERVICE, RESULT, pxObject) (uint8_t)(TRACE_STREAMBUFFER_##SERVICE##_##RESULT + prvGetStreamBufferType(pxObject))
1250
1251/* Generic versions */
1252#define TRACE_GET_CLASS_EVENT_CODE(SERVICE, RESULT, CLASS, kernelClass) TRACE_GET_##CLASS##_CLASS_EVENT_CODE(SERVICE, RESULT, kernelClass)
1253#define TRACE_GET_OBJECT_EVENT_CODE(SERVICE, RESULT, CLASS, pxObject) TRACE_GET_##CLASS##_OBJECT_EVENT_CODE(SERVICE, RESULT, pxObject)
1254
1255/******************************
1256* SPECIAL MACROS FOR TASKS *
1257******************************/
1258#define TRACE_GET_TASK_PRIORITY(pxTCB) ((uint8_t)pxTCB->uxPriority)
1259#define TRACE_GET_TASK_NAME(pxTCB) ((char*)pxTCB->pcTaskName)
1260
1261/*** The trace macros for snapshot mode **************************************/
1262
1263/* A macro that will update the tick count when returning from tickless idle */
1264#undef traceINCREASE_TICK_COUNT
1265#define traceINCREASE_TICK_COUNT( xCount )
1266
1267/* Called for each task that becomes ready */
1268#undef traceMOVED_TASK_TO_READY_STATE
1269#define traceMOVED_TASK_TO_READY_STATE( pxTCB ) \
1270 trcKERNEL_HOOKS_MOVED_TASK_TO_READY_STATE(pxTCB);
1271
1272/* Called on each OS tick. Will call uiPortGetTimestamp to make sure it is called at least once every OS tick. */
1273#undef traceTASK_INCREMENT_TICK
1274
1275#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_3_0)
1276
1277#define traceTASK_INCREMENT_TICK( xTickCount ) \
1278 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || xPendedTicks == 0) { trcKERNEL_HOOKS_INCREMENT_TICK(); } \
1279 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { trcKERNEL_HOOKS_NEW_TIME(DIV_NEW_TIME, xTickCount + 1); }
1280
1281#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X)
1282
1283#define traceTASK_INCREMENT_TICK( xTickCount ) \
1284 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxPendedTicks == 0) { trcKERNEL_HOOKS_INCREMENT_TICK(); } \
1285 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { trcKERNEL_HOOKS_NEW_TIME(DIV_NEW_TIME, xTickCount + 1); }
1286
1287#else
1288
1289#define traceTASK_INCREMENT_TICK( xTickCount ) \
1290 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxMissedTicks == 0) { trcKERNEL_HOOKS_INCREMENT_TICK(); } \
1291 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { trcKERNEL_HOOKS_NEW_TIME(DIV_NEW_TIME, xTickCount + 1); }
1292
1293#endif
1294
1295extern volatile uint32_t uiTraceSystemState;
1296
1297/* Called on each task-switch */
1298#undef traceTASK_SWITCHED_IN
1299#define traceTASK_SWITCHED_IN() \
1300 uiTraceSystemState = TRC_STATE_IN_TASKSWITCH; \
1301 trcKERNEL_HOOKS_TASK_SWITCH(TRACE_GET_CURRENT_TASK()); \
1302 uiTraceSystemState = TRC_STATE_IN_APPLICATION;
1303
1304/* Called on vTaskCreate */
1305#undef traceTASK_CREATE
1306#define traceTASK_CREATE(pxNewTCB) \
1307 if (pxNewTCB != 0) \
1308 { \
1309 trcKERNEL_HOOKS_TASK_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, TASK, pxNewTCB), TASK, pxNewTCB); \
1310 prvAddTaskToStackMonitor(pxNewTCB); \
1311 }
1312
1313/* Called in vTaskCreate, if it fails (typically if the stack can not be allocated) */
1314#undef traceTASK_CREATE_FAILED
1315#define traceTASK_CREATE_FAILED() \
1316 trcKERNEL_HOOKS_OBJECT_CREATE_FAILED(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, TASK, NOT_USED), TRACE_GET_CLASS_TRACE_CLASS(TASK, NOT_USED))
1317
1318/* Called on vTaskDelete */
1319#undef traceTASK_DELETE
1320#define traceTASK_DELETE( pxTaskToDelete ) \
1321 { TRACE_ALLOC_CRITICAL_SECTION(); \
1322 TRACE_ENTER_CRITICAL_SECTION(); \
1323 trcKERNEL_HOOKS_TASK_DELETE(TRACE_GET_OBJECT_EVENT_CODE(DELETE_OBJ, TRCSUCCESS, TASK, pxTaskToDelete), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_NAME, TRCSUCCESS, TASK, pxTaskToDelete), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_PROP, TRCSUCCESS, TASK, pxTaskToDelete), pxTaskToDelete); \
1324 prvRemoveTaskFromStackMonitor(pxTaskToDelete); \
1325 TRACE_EXIT_CRITICAL_SECTION(); }
1326
1327#if (TRC_CFG_SCHEDULING_ONLY == 0)
1328
1329#if defined(configUSE_TICKLESS_IDLE) && (configUSE_TICKLESS_IDLE != 0)
1330
1331#undef traceLOW_POWER_IDLE_BEGIN
1332#define traceLOW_POWER_IDLE_BEGIN() \
1333 { \
1334 extern uint32_t trace_disable_timestamp; \
1335 prvTraceStoreLowPower(0); \
1336 trace_disable_timestamp = 1; \
1337 }
1338
1339#undef traceLOW_POWER_IDLE_END
1340#define traceLOW_POWER_IDLE_END() \
1341 { \
1342 extern uint32_t trace_disable_timestamp; \
1343 trace_disable_timestamp = 0; \
1344 prvTraceStoreLowPower(1); \
1345 }
1346
1347#endif
1348
1349/* Called on vTaskSuspend */
1350#undef traceTASK_SUSPEND
1351#define traceTASK_SUSPEND( pxTaskToSuspend ) \
1352 trcKERNEL_HOOKS_TASK_SUSPEND(TASK_SUSPEND, pxTaskToSuspend);
1353
1354/* Called from special case with timer only */
1355#undef traceTASK_DELAY_SUSPEND
1356#define traceTASK_DELAY_SUSPEND( pxTaskToSuspend ) \
1357 trcKERNEL_HOOKS_TASK_SUSPEND(TASK_SUSPEND, pxTaskToSuspend); \
1358 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1359
1360/* Called on vTaskDelay - note the use of FreeRTOS variable xTicksToDelay */
1361#undef traceTASK_DELAY
1362#define traceTASK_DELAY() \
1363 trcKERNEL_HOOKS_TASK_DELAY(TASK_DELAY, pxCurrentTCB, xTicksToDelay); \
1364 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1365
1366/* Called on vTaskDelayUntil - note the use of FreeRTOS variable xTimeToWake */
1367#undef traceTASK_DELAY_UNTIL
1368#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0)
1369
1370#define traceTASK_DELAY_UNTIL(xTimeToWake) \
1371 trcKERNEL_HOOKS_TASK_DELAY(TASK_DELAY_UNTIL, pxCurrentTCB, xTimeToWake); \
1372 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1373#else
1374
1375#define traceTASK_DELAY_UNTIL() \
1376 trcKERNEL_HOOKS_TASK_DELAY(TASK_DELAY_UNTIL, pxCurrentTCB, xTimeToWake); \
1377 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1378
1379#endif
1380
1381/* Called in xQueueCreate, and thereby for all other object based on queues, such as semaphores. */
1382#undef traceQUEUE_CREATE
1383#define traceQUEUE_CREATE( pxNewQueue ) \
1384 trcKERNEL_HOOKS_OBJECT_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, QUEUE, pxNewQueue), QUEUE, pxNewQueue);
1385
1386/* Called in xQueueCreate, if the queue creation fails */
1387#undef traceQUEUE_CREATE_FAILED
1388#define traceQUEUE_CREATE_FAILED( queueType ) \
1389 trcKERNEL_HOOKS_OBJECT_CREATE_FAILED(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, QUEUE, queueType), TRACE_GET_CLASS_TRACE_CLASS(QUEUE, queueType))
1390
1391/* Called on vQueueDelete */
1392#undef traceQUEUE_DELETE
1393#define traceQUEUE_DELETE( pxQueue ) \
1394 { TRACE_ALLOC_CRITICAL_SECTION(); \
1395 TRACE_ENTER_CRITICAL_SECTION(); \
1396 trcKERNEL_HOOKS_OBJECT_DELETE(TRACE_GET_OBJECT_EVENT_CODE(DELETE_OBJ, TRCSUCCESS, QUEUE, pxQueue), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_NAME, TRCSUCCESS, QUEUE, pxQueue), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_PROP, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \
1397 TRACE_EXIT_CRITICAL_SECTION(); }
1398
1399/* This macro is not necessary as of FreeRTOS v9.0.0 */
1400#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0)
1401
1402/* Called in xQueueCreateMutex, and thereby also from xSemaphoreCreateMutex and xSemaphoreCreateRecursiveMutex */
1403#undef traceCREATE_MUTEX
1404#define traceCREATE_MUTEX( pxNewQueue ) \
1405 trcKERNEL_HOOKS_OBJECT_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, QUEUE, pxNewQueue), QUEUE, pxNewQueue);
1406
1407/* Called in xQueueCreateMutex when the operation fails (when memory allocation fails) */
1408#undef traceCREATE_MUTEX_FAILED
1409#define traceCREATE_MUTEX_FAILED() \
1410 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_NUMERIC_PARAM_ONLY(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, QUEUE, queueQUEUE_TYPE_MUTEX), 0);
1411
1412#endif
1413
1414/* Called when the Mutex can not be given, since not holder */
1415#undef traceGIVE_MUTEX_RECURSIVE_FAILED
1416#define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) \
1417 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCFAILED, QUEUE, pxMutex), QUEUE, pxMutex);
1418
1419/* Called when a message is sent to a queue */ /* CS IS NEW ! */
1420#undef traceQUEUE_SEND
1421#define traceQUEUE_SEND( pxQueue ) \
1422 trcKERNEL_HOOKS_KERNEL_SERVICE(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCSUCCESS, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_TRCSUCCESS, QUEUE, pxQueue); \
1423 trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) == TRACE_CLASS_MUTEX ? (uint8_t)0 : (uint8_t)(pxQueue->uxMessagesWaiting + 1));
1424
1425/* Called when a message is sent to a queue set */
1426#undef traceQUEUE_SET_SEND
1427#define traceQUEUE_SET_SEND( pxQueue ) \
1428 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \
1429 trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, (uint8_t)(pxQueue->uxMessagesWaiting + 1));
1430
1431/* Called when a message failed to be sent to a queue (timeout) */
1432#undef traceQUEUE_SEND_FAILED
1433#define traceQUEUE_SEND_FAILED( pxQueue ) \
1434 trcKERNEL_HOOKS_KERNEL_SERVICE(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCFAILED, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_TRCFAILED, QUEUE, pxQueue);
1435
1436/* Called when the task is blocked due to a send operation on a full queue */
1437#undef traceBLOCKING_ON_QUEUE_SEND
1438#define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) \
1439 trcKERNEL_HOOKS_KERNEL_SERVICE(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCBLOCK, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_TRCBLOCK, QUEUE, pxQueue);
1440
1441/* Called when a message is received from a queue */
1442#undef traceQUEUE_RECEIVE
1443#define traceQUEUE_RECEIVE( pxQueue ) \
1444 if (isQueueReceiveHookActuallyPeek) \
1445 { \
1446 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \
1447 } \
1448 else \
1449 { \
1450 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \
1451 } \
1452 trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) == TRACE_CLASS_MUTEX ? (uint8_t)TRACE_GET_TASK_NUMBER(TRACE_GET_CURRENT_TASK()) : (uint8_t)(pxQueue->uxMessagesWaiting - 1));
1453
1454/* Called when a receive operation on a queue fails (timeout) */
1455#undef traceQUEUE_RECEIVE_FAILED
1456#define traceQUEUE_RECEIVE_FAILED( pxQueue ) \
1457 if (isQueueReceiveHookActuallyPeek) \
1458 { \
1459 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue); \
1460 } \
1461 else \
1462 { \
1463 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue); \
1464 }
1465
1466/* Called when the task is blocked due to a receive operation on an empty queue */
1467#undef traceBLOCKING_ON_QUEUE_RECEIVE
1468#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) \
1469 if (isQueueReceiveHookActuallyPeek) \
1470 { \
1471 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCBLOCK, QUEUE, pxQueue), QUEUE, pxQueue); \
1472 } \
1473 else \
1474 { \
1475 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCBLOCK, QUEUE, pxQueue), QUEUE, pxQueue); \
1476 } \
1477 if (TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) != TRACE_CLASS_MUTEX) \
1478 { \
1479 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); \
1480 }
1481
1482/* Called on xQueuePeek */
1483#undef traceQUEUE_PEEK
1484#define traceQUEUE_PEEK( pxQueue ) \
1485 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue);
1486
1487/* Called on xQueuePeek fail/timeout (added in FreeRTOS v9.0.2) */
1488#undef traceQUEUE_PEEK_FAILED
1489#define traceQUEUE_PEEK_FAILED( pxQueue ) \
1490 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue);
1491
1492/* Called on xQueuePeek blocking (added in FreeRTOS v9.0.2) */
1493#undef traceBLOCKING_ON_QUEUE_PEEK
1494#define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) \
1495 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(PEEK, TRCBLOCK, QUEUE, pxQueue), QUEUE, pxQueue); \
1496 if (TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, pxQueue) != TRACE_CLASS_MUTEX) \
1497 { \
1498 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED(); \
1499 }
1500
1501/* Called when a message is sent from interrupt context, e.g., using xQueueSendFromISR */
1502#undef traceQUEUE_SEND_FROM_ISR
1503#define traceQUEUE_SEND_FROM_ISR( pxQueue ) \
1504 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCSUCCESS, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCSUCCESS, QUEUE, pxQueue); \
1505 trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, (uint8_t)(pxQueue->uxMessagesWaiting + 1));
1506
1507/* Called when a message send from interrupt context fails (since the queue was full) */
1508#undef traceQUEUE_SEND_FROM_ISR_FAILED
1509#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) \
1510 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(xCopyPosition == queueSEND_TO_BACK ? (TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCFAILED, QUEUE, pxQueue)) : TRACE_QUEUE_SEND_TO_FRONT_FROM_ISR_TRCFAILED, QUEUE, pxQueue);
1511
1512/* Called when a message is received in interrupt context, e.g., using xQueueReceiveFromISR */
1513#undef traceQUEUE_RECEIVE_FROM_ISR
1514#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) \
1515 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCSUCCESS, QUEUE, pxQueue), QUEUE, pxQueue); \
1516 trcKERNEL_HOOKS_SET_OBJECT_STATE(QUEUE, pxQueue, (uint8_t)(pxQueue->uxMessagesWaiting - 1));
1517
1518/* Called when a message receive from interrupt context fails (since the queue was empty) */
1519#undef traceQUEUE_RECEIVE_FROM_ISR_FAILED
1520#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) \
1521 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCFAILED, QUEUE, pxQueue), QUEUE, pxQueue);
1522
1523#undef traceQUEUE_REGISTRY_ADD
1524#define traceQUEUE_REGISTRY_ADD(object, name) prvTraceSetObjectName(TRACE_GET_OBJECT_TRACE_CLASS(QUEUE, object), TRACE_GET_OBJECT_NUMBER(QUEUE, object), name);
1525
1526/* Called in vTaskPrioritySet */
1527#undef traceTASK_PRIORITY_SET
1528#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) \
1529 trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE(TASK_PRIORITY_SET, pxTask, uxNewPriority);
1530
1531/* Called in vTaskPriorityInherit, which is called by Mutex operations */
1532#undef traceTASK_PRIORITY_INHERIT
1533#define traceTASK_PRIORITY_INHERIT( pxTask, uxNewPriority ) \
1534 trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE(TASK_PRIORITY_INHERIT, pxTask, uxNewPriority);
1535
1536/* Called in vTaskPriorityDisinherit, which is called by Mutex operations */
1537#undef traceTASK_PRIORITY_DISINHERIT
1538#define traceTASK_PRIORITY_DISINHERIT( pxTask, uxNewPriority ) \
1539 trcKERNEL_HOOKS_TASK_PRIORITY_CHANGE(TASK_PRIORITY_DISINHERIT, pxTask, uxNewPriority);
1540
1541/* Called in vTaskResume */
1542#undef traceTASK_RESUME
1543#define traceTASK_RESUME( pxTaskToResume ) \
1544 trcKERNEL_HOOKS_TASK_RESUME(TASK_RESUME, pxTaskToResume);
1545
1546/* Called in vTaskResumeFromISR */
1547#undef traceTASK_RESUME_FROM_ISR
1548#define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) \
1549 trcKERNEL_HOOKS_TASK_RESUME_FROM_ISR(TASK_RESUME_FROM_ISR, pxTaskToResume);
1550
1551
1552#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
1553
1554#if (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1)
1555
1556extern void vTraceStoreMemMangEvent(uint32_t ecode, uint32_t address, int32_t size);
1557
1558/* MALLOC and FREE are always stored, no matter if they happen inside filtered task */
1559#undef traceMALLOC
1560#define traceMALLOC( pvAddress, uiSize ) \
1561 if (pvAddress != 0) \
1562 { \
1563 vTraceStoreMemMangEvent(MEM_MALLOC_SIZE, ( uint32_t ) pvAddress, (int32_t)uiSize); \
1564 } \
1565 else \
1566 { \
1567 vTraceStoreMemMangEvent(MEM_MALLOC_SIZE_TRCFAILED, ( uint32_t ) pvAddress, (int32_t)uiSize); \
1568 }
1569
1570#undef traceFREE
1571#define traceFREE( pvAddress, uiSize ) \
1572 vTraceStoreMemMangEvent(MEM_FREE_SIZE, ( uint32_t ) pvAddress, -((int32_t)uiSize));
1573
1574#endif
1575
1576#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1)
1577
1578/* Called in timer.c - xTimerCreate */
1579#undef traceTIMER_CREATE
1580#define traceTIMER_CREATE(tmr) \
1581 trcKERNEL_HOOKS_OBJECT_CREATE(TIMER_CREATE, TIMER, tmr);
1582
1583#undef traceTIMER_CREATE_FAILED
1584#define traceTIMER_CREATE_FAILED() \
1585 trcKERNEL_HOOKS_OBJECT_CREATE_FAILED(TIMER_CREATE_TRCFAILED, TRACE_GET_CLASS_TRACE_CLASS(TIMER, NOT_USED))
1586
1587/* Note that xCommandID can never be tmrCOMMAND_EXECUTE_CALLBACK (-1) since the trace macro is not called in that case */
1588#undef traceTIMER_COMMAND_SEND
1589#define traceTIMER_COMMAND_SEND(tmr, xCommandID, xOptionalValue, xReturn) \
1590 if (xCommandID > tmrCOMMAND_START_DONT_TRACE) \
1591 { \
1592 if (xCommandID == tmrCOMMAND_CHANGE_PERIOD) \
1593 { \
1594 if (xReturn == pdPASS) { \
1595 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TIMER_CHANGE_PERIOD, TIMER, tmr, xOptionalValue); \
1596 } \
1597 else \
1598 { \
1599 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TIMER_CHANGE_PERIOD_TRCFAILED, TIMER, tmr, xOptionalValue); \
1600 } \
1601 } \
1602 else if ((xCommandID == tmrCOMMAND_DELETE) && (xReturn == pdPASS)) \
1603 { \
1604 trcKERNEL_HOOKS_OBJECT_DELETE(TIMER_DELETE_OBJ, EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr), EVENTGROUP_OBJCLOSE_PROP_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(TIMER, tmr), TIMER, tmr); \
1605 } \
1606 else \
1607 { \
1608 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENTGROUP_TIMER + (uint32_t)xCommandID + ((xReturn == pdPASS) ? 0 : (TIMER_CREATE_TRCFAILED - TIMER_CREATE)), TIMER, tmr, xOptionalValue); \
1609 }\
1610 }
1611
1612#undef traceTIMER_EXPIRED
1613#define traceTIMER_EXPIRED(tmr) \
1614 trcKERNEL_HOOKS_KERNEL_SERVICE(TIMER_EXPIRED, TIMER, tmr);
1615
1616#endif
1617
1618#if (TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS == 1)
1619
1620#undef tracePEND_FUNC_CALL
1621#define tracePEND_FUNC_CALL(func, arg1, arg2, ret) \
1622 if (ret == pdPASS){ \
1623 trcKERNEL_HOOKS_KERNEL_SERVICE(PEND_FUNC_CALL, TASK, xTimerGetTimerDaemonTaskHandle() ); \
1624 } \
1625 else \
1626 { \
1627 trcKERNEL_HOOKS_KERNEL_SERVICE(PEND_FUNC_CALL_TRCFAILED, TASK, xTimerGetTimerDaemonTaskHandle() ); \
1628 }
1629
1630#undef tracePEND_FUNC_CALL_FROM_ISR
1631#define tracePEND_FUNC_CALL_FROM_ISR(func, arg1, arg2, ret) \
1632 if (! uiInEventGroupSetBitsFromISR) \
1633 prvTraceStoreKernelCall(PEND_FUNC_CALL_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTimerGetTimerDaemonTaskHandle()) ); \
1634 uiInEventGroupSetBitsFromISR = 0;
1635
1636#endif
1637
1638#endif
1639
1640#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1)
1641
1642#undef traceEVENT_GROUP_CREATE
1643#define traceEVENT_GROUP_CREATE(eg) \
1644 trcKERNEL_HOOKS_OBJECT_CREATE(EVENT_GROUP_CREATE, EVENTGROUP, eg)
1645
1646#undef traceEVENT_GROUP_CREATE_FAILED
1647#define traceEVENT_GROUP_CREATE_FAILED() \
1648 trcKERNEL_HOOKS_OBJECT_CREATE_FAILED(EVENT_GROUP_CREATE_TRCFAILED, TRACE_GET_CLASS_TRACE_CLASS(EVENTGROUP, NOT_USED))
1649
1650#undef traceEVENT_GROUP_DELETE
1651#define traceEVENT_GROUP_DELETE(eg) \
1652 { TRACE_ALLOC_CRITICAL_SECTION(); \
1653 TRACE_ENTER_CRITICAL_SECTION(); \
1654 trcKERNEL_HOOKS_OBJECT_DELETE(EVENT_GROUP_DELETE_OBJ, EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg), EVENTGROUP_OBJCLOSE_NAME_TRCSUCCESS + TRACE_GET_OBJECT_TRACE_CLASS(EVENTGROUP, eg), EVENTGROUP, eg); \
1655 TRACE_EXIT_CRITICAL_SECTION(); }
1656
1657#undef traceEVENT_GROUP_SYNC_BLOCK
1658#define traceEVENT_GROUP_SYNC_BLOCK(eg, bitsToSet, bitsToWaitFor) \
1659 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SYNC_TRCBLOCK, EVENTGROUP, eg, bitsToWaitFor);
1660
1661#undef traceEVENT_GROUP_SYNC_END
1662#define traceEVENT_GROUP_SYNC_END(eg, bitsToSet, bitsToWaitFor, wasTimeout) \
1663 if (wasTimeout) \
1664 { \
1665 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SYNC_END_TRCFAILED, EVENTGROUP, eg, bitsToWaitFor); \
1666 } \
1667 else \
1668 { \
1669 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SYNC_END, EVENTGROUP, eg, bitsToWaitFor); \
1670 }
1671
1672#undef traceEVENT_GROUP_WAIT_BITS_BLOCK
1673#define traceEVENT_GROUP_WAIT_BITS_BLOCK(eg, bitsToWaitFor) \
1674 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_WAIT_BITS_TRCBLOCK, EVENTGROUP, eg, bitsToWaitFor); \
1675 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1676
1677#undef traceEVENT_GROUP_WAIT_BITS_END
1678#define traceEVENT_GROUP_WAIT_BITS_END(eg, bitsToWaitFor, wasTimeout) \
1679 if (wasTimeout) \
1680 { \
1681 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_WAIT_BITS_END_TRCFAILED, EVENTGROUP, eg, bitsToWaitFor); \
1682 } \
1683 else \
1684 { \
1685 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_WAIT_BITS_END, EVENTGROUP, eg, bitsToWaitFor); \
1686 }
1687
1688#undef traceEVENT_GROUP_CLEAR_BITS
1689#define traceEVENT_GROUP_CLEAR_BITS(eg, bitsToClear) \
1690 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_CLEAR_BITS, EVENTGROUP, eg, bitsToClear);
1691
1692#undef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR
1693#define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR(eg, bitsToClear) \
1694 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM_FROM_ISR(EVENT_GROUP_CLEAR_BITS_FROM_ISR, EVENTGROUP, eg, bitsToClear);
1695
1696#undef traceEVENT_GROUP_SET_BITS
1697#define traceEVENT_GROUP_SET_BITS(eg, bitsToSet) \
1698 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(EVENT_GROUP_SET_BITS, EVENTGROUP, eg, bitsToSet);
1699
1700#undef traceEVENT_GROUP_SET_BITS_FROM_ISR
1701#define traceEVENT_GROUP_SET_BITS_FROM_ISR(eg, bitsToSet) \
1702 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM_FROM_ISR(EVENT_GROUP_SET_BITS_FROM_ISR, EVENTGROUP, eg, bitsToSet); \
1703 uiInEventGroupSetBitsFromISR = 1;
1704
1705#endif
1706
1707#undef traceTASK_NOTIFY_TAKE
1708#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0)
1709
1710#define traceTASK_NOTIFY_TAKE() \
1711 if (pxCurrentTCB->eNotifyState == eNotified){ \
1712 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE, TASK, pxCurrentTCB, xTicksToWait); \
1713 } \
1714 else{ \
1715 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCFAILED, TASK, pxCurrentTCB, xTicksToWait); \
1716 }
1717
1718#elif (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0)
1719
1720#define traceTASK_NOTIFY_TAKE() \
1721 if (pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED){ \
1722 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE, TASK, pxCurrentTCB, xTicksToWait); \
1723 }else{ \
1724 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCFAILED, TASK, pxCurrentTCB, xTicksToWait);}
1725
1726#else
1727
1728#define traceTASK_NOTIFY_TAKE(index) \
1729 if (pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED){ \
1730 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE, TASK, pxCurrentTCB, xTicksToWait); \
1731 }else{ \
1732 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCFAILED, TASK, pxCurrentTCB, xTicksToWait);}
1733
1734#endif
1735
1736#undef traceTASK_NOTIFY_TAKE_BLOCK
1737#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0)
1738
1739#define traceTASK_NOTIFY_TAKE_BLOCK() \
1740 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCBLOCK, TASK, pxCurrentTCB, xTicksToWait); \
1741 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1742
1743#else
1744
1745#define traceTASK_NOTIFY_TAKE_BLOCK(index) \
1746 trcKERNEL_HOOKS_KERNEL_SERVICE_WITH_PARAM(TRACE_TASK_NOTIFY_TAKE_TRCBLOCK, TASK, pxCurrentTCB, xTicksToWait); \
1747 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1748
1749#endif
1750
1751#undef traceTASK_NOTIFY_WAIT
1752#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0)
1753
1754#define traceTASK_NOTIFY_WAIT() \
1755 if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \
1756 { \
1757 if (pxCurrentTCB->eNotifyState == eNotified) \
1758 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1759 else \
1760 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCFAILED, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1761 }
1762
1763#elif (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0)
1764
1765#define traceTASK_NOTIFY_WAIT() \
1766 if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \
1767 { \
1768 if (pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED) \
1769 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1770 else \
1771 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCFAILED, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1772 }
1773
1774#else
1775
1776#define traceTASK_NOTIFY_WAIT(index) \
1777 if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \
1778 { \
1779 if (pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED) \
1780 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1781 else \
1782 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCFAILED, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1783 }
1784
1785#endif
1786
1787#undef traceTASK_NOTIFY_WAIT_BLOCK
1788#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0)
1789
1790#define traceTASK_NOTIFY_WAIT_BLOCK() \
1791 if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \
1792 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCBLOCK, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1793 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1794
1795#else
1796
1797#define traceTASK_NOTIFY_WAIT_BLOCK(index) \
1798 if (TRACE_GET_OBJECT_FILTER(TASK, pxCurrentTCB) & CurrentFilterMask) \
1799 prvTraceStoreKernelCallWithParam(TRACE_TASK_NOTIFY_WAIT_TRCBLOCK, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(pxCurrentTCB), xTicksToWait); \
1800 trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED();
1801
1802#endif
1803
1804#undef traceTASK_NOTIFY
1805#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0)
1806
1807#define traceTASK_NOTIFY() \
1808 if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \
1809 if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \
1810 prvTraceStoreKernelCall(TRACE_TASK_NOTIFY, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify));
1811
1812#else
1813
1814#define traceTASK_NOTIFY(index) \
1815 if (TRACE_GET_OBJECT_FILTER(TASK, TRACE_GET_CURRENT_TASK()) & CurrentFilterMask) \
1816 if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \
1817 prvTraceStoreKernelCall(TRACE_TASK_NOTIFY, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify));
1818
1819#endif
1820
1821#undef traceTASK_NOTIFY_FROM_ISR
1822#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0)
1823
1824#define traceTASK_NOTIFY_FROM_ISR() \
1825 if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \
1826 prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify));
1827
1828#else
1829
1830#define traceTASK_NOTIFY_FROM_ISR(index) \
1831 if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \
1832 prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify));
1833
1834#endif
1835
1836#undef traceTASK_NOTIFY_GIVE_FROM_ISR
1837#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_10_4_0)
1838
1839#define traceTASK_NOTIFY_GIVE_FROM_ISR() \
1840 if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \
1841 prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_GIVE_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify));
1842
1843#else
1844
1845#define traceTASK_NOTIFY_GIVE_FROM_ISR(index) \
1846 if (TRACE_GET_OBJECT_FILTER(TASK, xTaskToNotify) & CurrentFilterMask) \
1847 prvTraceStoreKernelCall(TRACE_TASK_NOTIFY_GIVE_FROM_ISR, TRACE_CLASS_TASK, TRACE_GET_TASK_NUMBER(xTaskToNotify));
1848
1849#endif
1850
1851#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1)
1852
1853#undef traceSTREAM_BUFFER_CREATE
1854#define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) \
1855 trcKERNEL_HOOKS_OBJECT_CREATE(TRACE_GET_OBJECT_EVENT_CODE(CREATE_OBJ, TRCSUCCESS, STREAMBUFFER, pxStreamBuffer), STREAMBUFFER, pxStreamBuffer);
1856
1857#undef traceSTREAM_BUFFER_CREATE_FAILED
1858#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) \
1859 trcKERNEL_HOOKS_OBJECT_CREATE_FAILED(TRACE_GET_CLASS_EVENT_CODE(CREATE_OBJ, TRCFAILED, STREAMBUFFER, xIsMessageBuffer), TRACE_GET_CLASS_TRACE_CLASS(STREAMBUFFER, xIsMessageBuffer))
1860
1861#undef traceSTREAM_BUFFER_CREATE_STATIC_FAILED
1862#define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) \
1863 traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )
1864
1865#undef traceSTREAM_BUFFER_DELETE
1866#define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) \
1867 trcKERNEL_HOOKS_OBJECT_DELETE(TRACE_GET_OBJECT_EVENT_CODE(DELETE_OBJ, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_NAME, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), TRACE_GET_OBJECT_EVENT_CODE(OBJCLOSE_PROP, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer);
1868
1869#undef traceSTREAM_BUFFER_RESET
1870#define traceSTREAM_BUFFER_RESET( xStreamBuffer ) \
1871 trcKERNEL_HOOKS_KERNEL_SERVICE(prvGetStreamBufferType(xStreamBuffer) > 0 ? TRACE_MESSAGEBUFFER_RESET : TRACE_STREAMBUFFER_RESET, STREAMBUFFER, xStreamBuffer); \
1872 trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, 0);
1873
1874#undef traceSTREAM_BUFFER_SEND
1875#define traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ) \
1876 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \
1877 trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer));
1878
1879#undef traceBLOCKING_ON_STREAM_BUFFER_SEND
1880#define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) \
1881 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCBLOCK, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer);
1882
1883#undef traceSTREAM_BUFFER_SEND_FAILED
1884#define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) \
1885 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(SEND, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer);
1886
1887#undef traceSTREAM_BUFFER_RECEIVE
1888#define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) \
1889 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \
1890 trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer));
1891
1892
1893#undef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE
1894#define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) \
1895 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCBLOCK, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer);
1896
1897#undef traceSTREAM_BUFFER_RECEIVE_FAILED
1898#define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) \
1899 trcKERNEL_HOOKS_KERNEL_SERVICE(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer);
1900
1901#undef traceSTREAM_BUFFER_SEND_FROM_ISR
1902#define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ) \
1903 if( xReturn > ( size_t ) 0 ) \
1904 { \
1905 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \
1906 trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); \
1907 } \
1908 else \
1909 { \
1910 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(SEND_FROM_ISR, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \
1911 }
1912
1913#undef traceSTREAM_BUFFER_RECEIVE_FROM_ISR
1914#define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) \
1915 if( xReceivedLength > ( size_t ) 0 ) \
1916 { \
1917 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCSUCCESS, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \
1918 trcKERNEL_HOOKS_SET_OBJECT_STATE(STREAMBUFFER, xStreamBuffer, prvBytesInBuffer(xStreamBuffer)); \
1919 } \
1920 else \
1921 { \
1922 trcKERNEL_HOOKS_KERNEL_SERVICE_FROM_ISR(TRACE_GET_OBJECT_EVENT_CODE(RECEIVE_FROM_ISR, TRCFAILED, STREAMBUFFER, xStreamBuffer), STREAMBUFFER, xStreamBuffer); \
1923 }
1924
1925#endif
1926
1927#endif
1928
1929#endif
1930
1931#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
1932
1933TraceHeapHandle_t xTraceKernelPortGetSystemHeapHandle(void);
1934
1935/*************************************************************************/
1936/* KERNEL SPECIFIC OBJECT CONFIGURATION */
1937/*************************************************************************/
1938
1939/*******************************************************************************
1940 * The event codes - should match the offline config file.
1941 ******************************************************************************/
1942
1943/*** Event codes for streaming - should match the Tracealyzer config file *****/
1944#define PSF_EVENT_NULL_EVENT 0x00
1945
1946#define PSF_EVENT_TRACE_START 0x01
1947#define PSF_EVENT_TS_CONFIG 0x02
1948#define PSF_EVENT_OBJ_NAME 0x03
1949#define PSF_EVENT_TASK_PRIORITY 0x04
1950#define PSF_EVENT_TASK_PRIO_INHERIT 0x05
1951#define PSF_EVENT_TASK_PRIO_DISINHERIT 0x06
1952#define PSF_EVENT_DEFINE_ISR 0x07
1953
1954#define PSF_EVENT_TASK_CREATE 0x10
1955#define PSF_EVENT_QUEUE_CREATE 0x11
1956#define PSF_EVENT_SEMAPHORE_BINARY_CREATE 0x12
1957#define PSF_EVENT_MUTEX_CREATE 0x13
1958#define PSF_EVENT_TIMER_CREATE 0x14
1959#define PSF_EVENT_EVENTGROUP_CREATE 0x15
1960#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE 0x16
1961#define PSF_EVENT_MUTEX_RECURSIVE_CREATE 0x17
1962#define PSF_EVENT_STREAMBUFFER_CREATE 0x18
1963#define PSF_EVENT_MESSAGEBUFFER_CREATE 0x19
1964
1965#define PSF_EVENT_TASK_DELETE 0x20
1966#define PSF_EVENT_QUEUE_DELETE 0x21
1967#define PSF_EVENT_SEMAPHORE_DELETE 0x22
1968#define PSF_EVENT_MUTEX_DELETE 0x23
1969#define PSF_EVENT_TIMER_DELETE 0x24
1970#define PSF_EVENT_EVENTGROUP_DELETE 0x25
1971#define PSF_EVENT_STREAMBUFFER_DELETE 0x28
1972#define PSF_EVENT_MESSAGEBUFFER_DELETE 0x29
1973
1974#define PSF_EVENT_TASK_READY 0x30
1975#define PSF_EVENT_NEW_TIME 0x31
1976#define PSF_EVENT_NEW_TIME_SCHEDULER_SUSPENDED 0x32
1977#define PSF_EVENT_ISR_BEGIN 0x33
1978#define PSF_EVENT_ISR_RESUME 0x34
1979#define PSF_EVENT_TS_BEGIN 0x35
1980#define PSF_EVENT_TS_RESUME 0x36
1981#define PSF_EVENT_TASK_ACTIVATE 0x37
1982
1983#define PSF_EVENT_MALLOC 0x38
1984#define PSF_EVENT_FREE 0x39
1985
1986#define PSF_EVENT_LOWPOWER_BEGIN 0x3A
1987#define PSF_EVENT_LOWPOWER_END 0x3B
1988
1989#define PSF_EVENT_IFE_NEXT 0x3C
1990#define PSF_EVENT_IFE_DIRECT 0x3D
1991
1992#define PSF_EVENT_TASK_CREATE_FAILED 0x40
1993#define PSF_EVENT_QUEUE_CREATE_FAILED 0x41
1994#define PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED 0x42
1995#define PSF_EVENT_MUTEX_CREATE_FAILED 0x43
1996#define PSF_EVENT_TIMER_CREATE_FAILED 0x44
1997#define PSF_EVENT_EVENTGROUP_CREATE_FAILED 0x45
1998#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED 0x46
1999#define PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED 0x47
2000#define PSF_EVENT_STREAMBUFFER_CREATE_FAILED 0x49
2001#define PSF_EVENT_MESSAGEBUFFER_CREATE_FAILED 0x4A
2002
2003#define PSF_EVENT_TIMER_DELETE_FAILED 0x48
2004
2005#define PSF_EVENT_QUEUE_SEND 0x50
2006#define PSF_EVENT_SEMAPHORE_GIVE 0x51
2007#define PSF_EVENT_MUTEX_GIVE 0x52
2008
2009#define PSF_EVENT_QUEUE_SEND_FAILED 0x53
2010#define PSF_EVENT_SEMAPHORE_GIVE_FAILED 0x54
2011#define PSF_EVENT_MUTEX_GIVE_FAILED 0x55
2012
2013#define PSF_EVENT_QUEUE_SEND_BLOCK 0x56
2014#define PSF_EVENT_SEMAPHORE_GIVE_BLOCK 0x57
2015#define PSF_EVENT_MUTEX_GIVE_BLOCK 0x58
2016
2017#define PSF_EVENT_QUEUE_SEND_FROMISR 0x59
2018#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR 0x5A
2019
2020#define PSF_EVENT_QUEUE_SEND_FROMISR_FAILED 0x5C
2021#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED 0x5D
2022
2023#define PSF_EVENT_QUEUE_RECEIVE 0x60
2024#define PSF_EVENT_SEMAPHORE_TAKE 0x61
2025#define PSF_EVENT_MUTEX_TAKE 0x62
2026
2027#define PSF_EVENT_QUEUE_RECEIVE_FAILED 0x63
2028#define PSF_EVENT_SEMAPHORE_TAKE_FAILED 0x64
2029#define PSF_EVENT_MUTEX_TAKE_FAILED 0x65
2030
2031#define PSF_EVENT_QUEUE_RECEIVE_BLOCK 0x66
2032#define PSF_EVENT_SEMAPHORE_TAKE_BLOCK 0x67
2033#define PSF_EVENT_MUTEX_TAKE_BLOCK 0x68
2034
2035#define PSF_EVENT_QUEUE_RECEIVE_FROMISR 0x69
2036#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR 0x6A
2037
2038#define PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED 0x6C
2039#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED 0x6D
2040
2041#define PSF_EVENT_QUEUE_PEEK 0x70
2042#define PSF_EVENT_SEMAPHORE_PEEK 0x71
2043#define PSF_EVENT_MUTEX_PEEK 0x72
2044
2045#define PSF_EVENT_QUEUE_PEEK_FAILED 0x73
2046#define PSF_EVENT_SEMAPHORE_PEEK_FAILED 0x74
2047#define PSF_EVENT_MUTEX_PEEK_FAILED 0x75
2048
2049#define PSF_EVENT_QUEUE_PEEK_BLOCK 0x76
2050#define PSF_EVENT_SEMAPHORE_PEEK_BLOCK 0x77
2051#define PSF_EVENT_MUTEX_PEEK_BLOCK 0x78
2052
2053#define PSF_EVENT_TASK_DELAY_UNTIL 0x79
2054#define PSF_EVENT_TASK_DELAY 0x7A
2055#define PSF_EVENT_TASK_SUSPEND 0x7B
2056#define PSF_EVENT_TASK_RESUME 0x7C
2057#define PSF_EVENT_TASK_RESUME_FROMISR 0x7D
2058
2059#define PSF_EVENT_TIMER_PENDFUNCCALL 0x80
2060#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR 0x81
2061#define PSF_EVENT_TIMER_PENDFUNCCALL_FAILED 0x82
2062#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED 0x83
2063
2064/* We reserve 0x08 slots for this */
2065#define PSF_EVENT_USER_EVENT 0x90
2066
2067/* We reserve 0x08 slots for this */
2068#define PSF_EVENT_USER_EVENT_FIXED 0x98
2069
2070#define PSF_EVENT_TIMER_START 0xA0
2071#define PSF_EVENT_TIMER_RESET 0xA1
2072#define PSF_EVENT_TIMER_STOP 0xA2
2073#define PSF_EVENT_TIMER_CHANGEPERIOD 0xA3
2074#define PSF_EVENT_TIMER_START_FROMISR 0xA4
2075#define PSF_EVENT_TIMER_RESET_FROMISR 0xA5
2076#define PSF_EVENT_TIMER_STOP_FROMISR 0xA6
2077#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR 0xA7
2078#define PSF_EVENT_TIMER_START_FAILED 0xA8
2079#define PSF_EVENT_TIMER_RESET_FAILED 0xA9
2080#define PSF_EVENT_TIMER_STOP_FAILED 0xAA
2081#define PSF_EVENT_TIMER_CHANGEPERIOD_FAILED 0xAB
2082#define PSF_EVENT_TIMER_START_FROMISR_FAILED 0xAC
2083#define PSF_EVENT_TIMER_RESET_FROMISR_FAILED 0xAD
2084#define PSF_EVENT_TIMER_STOP_FROMISR_FAILED 0xAE
2085#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED 0xAF
2086
2087#define PSF_EVENT_EVENTGROUP_SYNC 0xB0
2088#define PSF_EVENT_EVENTGROUP_WAITBITS 0xB1
2089#define PSF_EVENT_EVENTGROUP_CLEARBITS 0xB2
2090#define PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR 0xB3
2091#define PSF_EVENT_EVENTGROUP_SETBITS 0xB4
2092#define PSF_EVENT_EVENTGROUP_SETBITS_FROMISR 0xB5
2093#define PSF_EVENT_EVENTGROUP_SYNC_BLOCK 0xB6
2094#define PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK 0xB7
2095#define PSF_EVENT_EVENTGROUP_SYNC_FAILED 0xB8
2096#define PSF_EVENT_EVENTGROUP_WAITBITS_FAILED 0xB9
2097
2098#define PSF_EVENT_QUEUE_SEND_FRONT 0xC0
2099#define PSF_EVENT_QUEUE_SEND_FRONT_FAILED 0xC1
2100#define PSF_EVENT_QUEUE_SEND_FRONT_BLOCK 0xC2
2101#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR 0xC3
2102#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED 0xC4
2103#define PSF_EVENT_MUTEX_GIVE_RECURSIVE 0xC5
2104#define PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED 0xC6
2105#define PSF_EVENT_MUTEX_TAKE_RECURSIVE 0xC7
2106#define PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED 0xC8
2107
2108#define PSF_EVENT_TASK_NOTIFY 0xC9
2109#define PSF_EVENT_TASK_NOTIFY_WAIT 0xCA
2110#define PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK 0xCB
2111#define PSF_EVENT_TASK_NOTIFY_WAIT_FAILED 0xCC
2112#define PSF_EVENT_TASK_NOTIFY_FROM_ISR 0xCD
2113
2114#define PSF_EVENT_TIMER_EXPIRED 0xD2
2115
2116#define PSF_EVENT_STREAMBUFFER_SEND 0xD3
2117#define PSF_EVENT_STREAMBUFFER_SEND_BLOCK 0xD4
2118#define PSF_EVENT_STREAMBUFFER_SEND_FAILED 0xD5
2119#define PSF_EVENT_STREAMBUFFER_RECEIVE 0xD6
2120#define PSF_EVENT_STREAMBUFFER_RECEIVE_BLOCK 0xD7
2121#define PSF_EVENT_STREAMBUFFER_RECEIVE_FAILED 0xD8
2122#define PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR 0xD9
2123#define PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR_FAILED 0xDA
2124#define PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR 0xDB
2125#define PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR_FAILED 0xDC
2126#define PSF_EVENT_STREAMBUFFER_RESET 0xDD
2127
2128#define PSF_EVENT_MESSAGEBUFFER_SEND 0xDE
2129#define PSF_EVENT_MESSAGEBUFFER_SEND_BLOCK 0xDF
2130#define PSF_EVENT_MESSAGEBUFFER_SEND_FAILED 0xE0
2131#define PSF_EVENT_MESSAGEBUFFER_RECEIVE 0xE1
2132#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_BLOCK 0xE2
2133#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FAILED 0xE3
2134#define PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR 0xE4
2135#define PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR_FAILED 0xE5
2136#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR 0xE6
2137#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR_FAILED 0xE7
2138#define PSF_EVENT_MESSAGEBUFFER_RESET 0xE8
2139
2140#define PSF_EVENT_MALLOC_FAILED 0xE9
2141#define PSF_EVENT_FREE_FAILED 0xEA
2142
2143#define PSF_EVENT_UNUSED_STACK 0xEB
2144
2145#define PSF_EVENT_STATEMACHINE_STATE_CREATE 0xEC
2146#define PSF_EVENT_STATEMACHINE_CREATE 0xED
2147#define PSF_EVENT_STATEMACHINE_STATECHANGE 0xEE
2148
2149#define PSF_EVENT_INTERVAL_CHANNEL_CREATE 0xEF
2150#define PSF_EVENT_INTERVAL_START 0xF0
2151
2152#define PSF_EVENT_EXTENSION_CREATE 0xF1
2153
2154#define PSF_EVENT_HEAP_CREATE 0xF2
2155
2156#define PSF_EVENT_COUNTER_CREATE 0xF3
2157#define PSF_EVENT_COUNTER_CHANGE 0xF4
2158#define PSF_EVENT_COUNTER_LIMIT_EXCEEDED 0xF5
2159
2160#define PSF_EVENT_MUTEX_TAKE_RECURSIVE_BLOCK 0xF6
2161
2162#define PSF_EVENT_INTERVAL_STOP 0xF7
2163#define PSF_EVENT_INTERVAL_CHANNEL_SET_CREATE 0xF8
2164
2165#define PSF_EVENT_RUNNABLE_REGISTER 0xF9
2166#define PSF_EVENT_RUNNABLE_START 0xFA
2167#define PSF_EVENT_RUNNABLE_STOP 0xFB
2168
2169#define PSF_EVENT_DEPENDENCY_REGISTER 0xFC
2170
2171#define TRC_EVENT_LAST_ID (PSF_EVENT_DEPENDENCY_REGISTER)
2172
2173/*** The trace macros for streaming ******************************************/
2174
2175/* A macro that will update the tick count when returning from tickless idle */
2176#undef traceINCREASE_TICK_COUNT
2177/* Note: This can handle time adjustments of max 2^32 ticks, i.e., 35 seconds at 120 MHz. Thus, tick-less idle periods longer than 2^32 ticks will appear "compressed" on the time line.*/
2178#define traceINCREASE_TICK_COUNT( xCount ) { uint32_t uiTraceTickCount; xTraceTimestampGetOsTickCount(&uiTraceTickCount); xTraceTimestampSetOsTickCount(uiTraceTickCount + (xCount)); }
2179
2180#if (TRC_CFG_INCLUDE_OSTICK_EVENTS == 1)
2181
2182#define OS_TICK_EVENT(uxSchedulerSuspended, xTickCount) if ((uxSchedulerSuspended) == (unsigned portBASE_TYPE) pdFALSE) { prvTraceStoreEvent_Param(PSF_EVENT_NEW_TIME, xTickCount); }
2183
2184#else
2185
2186#define OS_TICK_EVENT(uxSchedulerSuspended, xTickCount)
2187
2188#endif
2189
2190/* Called on each OS tick. Will call uiPortGetTimestamp to make sure it is called at least once every OS tick. */
2191#undef traceTASK_INCREMENT_TICK
2192#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_3_0
2193
2194#define traceTASK_INCREMENT_TICK( xTickCount ) \
2195 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || xPendedTicks == 0) { xTraceTimestampSetOsTickCount((xTickCount) + 1); } \
2196 OS_TICK_EVENT(uxSchedulerSuspended, (xTickCount) + 1)
2197
2198#elif TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X
2199
2200#define traceTASK_INCREMENT_TICK( xTickCount ) \
2201 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxPendedTicks == 0) { xTraceTimestampSetOsTickCount((xTickCount) + 1); } \
2202 OS_TICK_EVENT(uxSchedulerSuspended, (xTickCount) + 1)
2203
2204#else
2205
2206#define traceTASK_INCREMENT_TICK( xTickCount ) \
2207 if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxMissedTicks == 0) { xTraceTimestampSetOsTickCount((xTickCount) + 1); } \
2208 OS_TICK_EVENT(uxSchedulerSuspended, (xTickCount) + 1)
2209
2210#endif
2211
2212/* Called on each task-switch */
2213#undef traceTASK_SWITCHED_IN
2214#define traceTASK_SWITCHED_IN() \
2215 xTraceTaskSwitch(pxCurrentTCB, pxCurrentTCB->uxPriority)
2216
2217/* Called for each task that becomes ready */
2218#undef traceMOVED_TASK_TO_READY_STATE
2219#define traceMOVED_TASK_TO_READY_STATE( pxTCB ) \
2220 xTraceTaskReady(pxTCB);
2221
2222#undef traceTASK_CREATE
2223#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0
2224
2225#define traceTASK_CREATE(pxNewTCB) \
2226 if ((pxNewTCB) != 0) \
2227 { \
2228 xTraceTaskRegisterWithoutHandle((void*)(pxNewTCB), (pxNewTCB)->pcTaskName, (pxNewTCB)->uxPriority); \
2229 }
2230
2231#else
2232
2233#define traceTASK_CREATE(pxNewTCB) \
2234 if (pxNewTCB != 0) \
2235 { \
2236 xTraceTaskRegisterWithoutHandle((void*)pxNewTCB, (const char*)pcName, (uint32_t)uxPriority); \
2237 }
2238
2239#endif
2240
2241/* Called in vTaskCreate, if it fails (typically if the stack can not be allocated) */
2242#undef traceTASK_CREATE_FAILED
2243#define traceTASK_CREATE_FAILED() \
2244 prvTraceStoreEvent_None(PSF_EVENT_TASK_CREATE_FAILED)
2245
2246/* Called on vTaskDelete */
2247#undef traceTASK_DELETE // We don't allow for filtering out "delete" events. They are important and not very frequent. Moreover, we can't exclude create events, so this should be symmetrical.
2248#define traceTASK_DELETE( pxTaskToDelete ) \
2249 xTraceTaskUnregisterWithoutHandle(pxTaskToDelete, (pxTaskToDelete)->uxPriority)
2250
2251#if (TRC_CFG_SCHEDULING_ONLY == 0)
2252
2253#if (defined(configUSE_TICKLESS_IDLE) && configUSE_TICKLESS_IDLE != 0)
2254
2255#undef traceLOW_POWER_IDLE_BEGIN
2256#define traceLOW_POWER_IDLE_BEGIN() \
2257 prvTraceStoreEvent_Param(PSF_EVENT_LOWPOWER_BEGIN, xExpectedIdleTime)
2258
2259#undef traceLOW_POWER_IDLE_END
2260#define traceLOW_POWER_IDLE_END() \
2261 prvTraceStoreEvent_None(PSF_EVENT_LOWPOWER_END)
2262
2263#endif
2264
2265/* Called on vTaskSuspend */
2266#undef traceTASK_SUSPEND
2267#define traceTASK_SUSPEND( pxTaskToSuspend ) \
2268 prvTraceStoreEvent_Handle(PSF_EVENT_TASK_SUSPEND, pxTaskToSuspend)
2269
2270/* Called on vTaskDelay - note the use of FreeRTOS variable xTicksToDelay */
2271#undef traceTASK_DELAY
2272#define traceTASK_DELAY() \
2273 prvTraceStoreEvent_Param(PSF_EVENT_TASK_DELAY, xTicksToDelay)
2274
2275/* Called on vTaskDelayUntil - note the use of FreeRTOS variable xTimeToWake */
2276#undef traceTASK_DELAY_UNTIL
2277#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0
2278
2279#define traceTASK_DELAY_UNTIL(xTimeToWake) \
2280 prvTraceStoreEvent_Param(PSF_EVENT_TASK_DELAY_UNTIL, (xTimeToWake))
2281
2282#else
2283
2284#define traceTASK_DELAY_UNTIL() \
2285 prvTraceStoreEvent_Param(PSF_EVENT_TASK_DELAY_UNTIL, xTimeToWake)
2286
2287#endif
2288
2289#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0)
2290
2291#define traceQUEUE_CREATE_HELPER() \
2292 case queueQUEUE_TYPE_MUTEX: \
2293 xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_CREATE, (void*)pxNewQueue, "", 0); \
2294 break; \
2295 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2296 xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (void*)pxNewQueue, "", 0); \
2297 break;
2298
2299#else
2300
2301#define traceQUEUE_CREATE_HELPER()
2302
2303#endif
2304
2305/* Called in xQueueCreate, and thereby for all other object based on queues, such as semaphores. */
2306#undef traceQUEUE_CREATE
2307#define traceQUEUE_CREATE( pxNewQueue )\
2308 switch ((pxNewQueue)->ucQueueType) \
2309 { \
2310 case queueQUEUE_TYPE_BASE: \
2311 xTraceObjectRegisterWithoutHandle(PSF_EVENT_QUEUE_CREATE, (void*)(pxNewQueue), "", (uint32_t)uxQueueLength); \
2312 break; \
2313 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2314 xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_BINARY_CREATE, (void*)(pxNewQueue), "", 0); \
2315 break; \
2316 traceQUEUE_CREATE_HELPER() \
2317 }
2318
2319#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0)
2320
2321#define traceQUEUE_CREATE_FAILED_HELPER() \
2322 case queueQUEUE_TYPE_MUTEX: \
2323 prvTraceStoreEvent_HandleParam(PSF_EVENT_MUTEX_CREATE_FAILED, 0, 0); \
2324 break; \
2325 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2326 prvTraceStoreEvent_HandleParam(PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED, 0, 0); \
2327 break;
2328
2329#else
2330
2331#define traceQUEUE_CREATE_FAILED_HELPER()
2332
2333#endif
2334
2335/* Called in xQueueCreate, if the queue creation fails */
2336#undef traceQUEUE_CREATE_FAILED
2337#define traceQUEUE_CREATE_FAILED( queueType ) \
2338 switch (queueType) \
2339 { \
2340 case queueQUEUE_TYPE_BASE: \
2341 prvTraceStoreEvent_HandleParam(PSF_EVENT_QUEUE_CREATE_FAILED, 0, uxQueueLength); \
2342 break; \
2343 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2344 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED, 0, 0); \
2345 break; \
2346 traceQUEUE_CREATE_FAILED_HELPER() \
2347 }
2348
2349#undef traceQUEUE_DELETE // We don't allow for filtering out "delete" events. They are important and not very frequent. Moreover, we can't exclude create events, so this should be symmetrical.
2350#define traceQUEUE_DELETE( pxQueue ) \
2351 switch ((pxQueue)->ucQueueType) \
2352 { \
2353 case queueQUEUE_TYPE_BASE: \
2354 xTraceObjectUnregisterWithoutHandle(PSF_EVENT_QUEUE_DELETE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2355 break; \
2356 case queueQUEUE_TYPE_MUTEX: \
2357 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2358 xTraceObjectUnregisterWithoutHandle(PSF_EVENT_MUTEX_DELETE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2359 break; \
2360 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2361 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2362 xTraceObjectUnregisterWithoutHandle(PSF_EVENT_SEMAPHORE_DELETE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2363 break; \
2364 }
2365
2366/* Called in xQueueCreateCountingSemaphore, if the queue creation fails */
2367#undef traceCREATE_COUNTING_SEMAPHORE
2368#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
2369
2370#define traceCREATE_COUNTING_SEMAPHORE() \
2371 xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)xHandle, "", (uint32_t)uxMaxCount)
2372
2373#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X)
2374
2375#define traceCREATE_COUNTING_SEMAPHORE() \
2376 xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)xHandle, "", uxInitialCount)
2377
2378#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_4_X)
2379
2380#define traceCREATE_COUNTING_SEMAPHORE() \
2381 xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)xHandle, "", uxCountValue)
2382
2383#else
2384
2385#define traceCREATE_COUNTING_SEMAPHORE() \
2386 xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)pxHandle, "", uxCountValue)
2387
2388#endif
2389
2390#undef traceCREATE_COUNTING_SEMAPHORE_FAILED
2391#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
2392
2393#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
2394 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxMaxCount)
2395
2396#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X)
2397
2398#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
2399 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxInitialCount)
2400
2401#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_4_X)
2402
2403#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
2404 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxCountValue)
2405
2406#else
2407
2408#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
2409 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxCountValue)
2410
2411#endif
2412
2413
2414/* This macro is not necessary as of FreeRTOS v9.0.0 */
2415#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0)
2416
2417/* Called in xQueueCreateMutex, and thereby also from xSemaphoreCreateMutex and xSemaphoreCreateRecursiveMutex */
2418#undef traceCREATE_MUTEX
2419#define traceCREATE_MUTEX( pxNewQueue ) \
2420 switch (pxNewQueue->ucQueueType) \
2421 { \
2422 case queueQUEUE_TYPE_MUTEX: \
2423 xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_CREATE, (void*)(pxNewQueue), "", 0); \
2424 break; \
2425 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2426 xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (void*)(pxNewQueue), "", 0); \
2427 break; \
2428 }
2429
2430/* Called in xQueueCreateMutex when the operation fails (when memory allocation fails) */
2431#undef traceCREATE_MUTEX_FAILED
2432#define traceCREATE_MUTEX_FAILED() \
2433 prvTraceStoreEvent_HandleParam(PSF_EVENT_MUTEX_CREATE_FAILED, 0, 0)
2434#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) */
2435
2436/* Called when the Mutex can not be given, since not holder */
2437#undef traceGIVE_MUTEX_RECURSIVE_FAILED
2438#define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) \
2439 prvTraceStoreEvent_Handle(PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED, (void*)(pxMutex))
2440
2441/* Called when a message is sent to a queue */ /* CS IS NEW ! */
2442#undef traceQUEUE_SEND
2443#define traceQUEUE_SEND( pxQueue ) \
2444 switch ((pxQueue)->ucQueueType) \
2445 { \
2446 case queueQUEUE_TYPE_BASE: \
2447 prvTraceStoreEvent_HandleParam(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND : PSF_EVENT_QUEUE_SEND_FRONT, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
2448 break; \
2449 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2450 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2451 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_GIVE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
2452 break; \
2453 case queueQUEUE_TYPE_MUTEX: \
2454 prvTraceStoreEvent_Handle(PSF_EVENT_MUTEX_GIVE, (void*)(pxQueue)); \
2455 break; \
2456 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2457 prvTraceStoreEvent_Handle(PSF_EVENT_MUTEX_GIVE_RECURSIVE, (void*)(pxQueue)); \
2458 break; \
2459 }
2460
2461#undef traceQUEUE_SET_SEND
2462#define traceQUEUE_SET_SEND( pxQueue ) \
2463 prvTraceStoreEvent_HandleParam(PSF_EVENT_QUEUE_SEND, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1)
2464
2465/* Called when a message failed to be sent to a queue (timeout) */
2466#undef traceQUEUE_SEND_FAILED
2467#define traceQUEUE_SEND_FAILED( pxQueue ) \
2468 switch ((pxQueue)->ucQueueType) \
2469 { \
2470 case queueQUEUE_TYPE_BASE: \
2471 prvTraceStoreEvent_HandleParam(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2472 break; \
2473 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2474 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2475 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_GIVE_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2476 break; \
2477 case queueQUEUE_TYPE_MUTEX: \
2478 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2479 prvTraceStoreEvent_Handle(PSF_EVENT_MUTEX_GIVE_FAILED, (void*)(pxQueue)); \
2480 break; \
2481 }
2482
2483/* Called when the task is blocked due to a send operation on a full queue */
2484#undef traceBLOCKING_ON_QUEUE_SEND
2485#define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) \
2486 switch ((pxQueue)->ucQueueType) \
2487 { \
2488 case queueQUEUE_TYPE_BASE: \
2489 prvTraceStoreEvent_HandleParam(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_BLOCK : PSF_EVENT_QUEUE_SEND_FRONT_BLOCK, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2490 break; \
2491 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2492 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2493 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_GIVE_BLOCK, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2494 break; \
2495 case queueQUEUE_TYPE_MUTEX: \
2496 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2497 prvTraceStoreEvent_Handle(PSF_EVENT_MUTEX_GIVE_BLOCK, (void*)(pxQueue)); \
2498 break; \
2499 }
2500
2501/* Called when a message is sent from interrupt context, e.g., using xQueueSendFromISR */
2502#undef traceQUEUE_SEND_FROM_ISR
2503#define traceQUEUE_SEND_FROM_ISR( pxQueue ) \
2504 switch ((pxQueue)->ucQueueType) \
2505 { \
2506 case queueQUEUE_TYPE_BASE: \
2507 prvTraceStoreEvent_HandleParam(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
2508 break; \
2509 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2510 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2511 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_GIVE_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
2512 break; \
2513 }
2514
2515/* Called when a message send from interrupt context fails (since the queue was full) */
2516#undef traceQUEUE_SEND_FROM_ISR_FAILED
2517#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) \
2518 switch ((pxQueue)->ucQueueType) \
2519 { \
2520 case queueQUEUE_TYPE_BASE: \
2521 prvTraceStoreEvent_HandleParam(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2522 break; \
2523 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2524 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2525 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2526 break; \
2527 }
2528
2529/* Called when a message is received from a queue */
2530#undef traceQUEUE_RECEIVE
2531#define traceQUEUE_RECEIVE( pxQueue ) \
2532 switch ((pxQueue)->ucQueueType) \
2533 { \
2534 case queueQUEUE_TYPE_BASE: \
2535 if (isQueueReceiveHookActuallyPeek) \
2536 { \
2537 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_QUEUE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
2538 } \
2539 else\
2540 { \
2541 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_QUEUE_RECEIVE, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
2542 } \
2543 break; \
2544 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2545 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2546 if (isQueueReceiveHookActuallyPeek) \
2547 { \
2548 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_SEMAPHORE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
2549 } \
2550 else \
2551 { \
2552 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_SEMAPHORE_TAKE, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
2553 } \
2554 break; \
2555 case queueQUEUE_TYPE_MUTEX: \
2556 prvTraceStoreEvent_HandleParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK : PSF_EVENT_MUTEX_TAKE, (void*)(pxQueue), xTicksToWait); \
2557 break; \
2558 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2559 prvTraceStoreEvent_HandleParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK : PSF_EVENT_MUTEX_TAKE_RECURSIVE, (void*)(pxQueue), xTicksToWait); \
2560 break; \
2561 }
2562
2563/* Called when a receive operation on a queue fails (timeout) */
2564#undef traceQUEUE_RECEIVE_FAILED
2565#define traceQUEUE_RECEIVE_FAILED( pxQueue ) \
2566 switch ((pxQueue)->ucQueueType) \
2567 { \
2568 case queueQUEUE_TYPE_BASE: \
2569 prvTraceStoreEvent_HandleParamParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_QUEUE_PEEK_FAILED : PSF_EVENT_QUEUE_RECEIVE_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2570 break; \
2571 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2572 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2573 prvTraceStoreEvent_HandleParamParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_SEMAPHORE_PEEK_FAILED : PSF_EVENT_SEMAPHORE_TAKE_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2574 break; \
2575 case queueQUEUE_TYPE_MUTEX: \
2576 prvTraceStoreEvent_HandleParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_FAILED : PSF_EVENT_MUTEX_TAKE_FAILED, (void*)(pxQueue), xTicksToWait); \
2577 break; \
2578 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2579 prvTraceStoreEvent_HandleParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_FAILED : PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED, (void*)(pxQueue), xTicksToWait); \
2580 break; \
2581 }
2582
2583/* Called when the task is blocked due to a receive operation on an empty queue */
2584#undef traceBLOCKING_ON_QUEUE_RECEIVE
2585#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) \
2586 switch ((pxQueue)->ucQueueType) \
2587 { \
2588 case queueQUEUE_TYPE_BASE: \
2589 prvTraceStoreEvent_HandleParamParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_QUEUE_PEEK_BLOCK : PSF_EVENT_QUEUE_RECEIVE_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2590 break; \
2591 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2592 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2593 prvTraceStoreEvent_HandleParamParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_SEMAPHORE_PEEK_BLOCK : PSF_EVENT_SEMAPHORE_TAKE_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2594 break; \
2595 case queueQUEUE_TYPE_MUTEX: \
2596 prvTraceStoreEvent_HandleParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_BLOCK : PSF_EVENT_MUTEX_TAKE_BLOCK, (void*)(pxQueue), xTicksToWait); \
2597 break; \
2598 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2599 prvTraceStoreEvent_HandleParam(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_BLOCK : PSF_EVENT_MUTEX_TAKE_RECURSIVE_BLOCK, (void*)(pxQueue), xTicksToWait); \
2600 break; \
2601 }
2602
2603#if (TRC_CFG_FREERTOS_VERSION > TRC_FREERTOS_VERSION_9_0_1)
2604
2605/* Called when a peek operation on a queue fails (timeout) */
2606#undef traceQUEUE_PEEK_FAILED
2607#define traceQUEUE_PEEK_FAILED( pxQueue ) \
2608 switch ((pxQueue)->ucQueueType) \
2609 { \
2610 case queueQUEUE_TYPE_BASE: \
2611 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_QUEUE_PEEK_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2612 break; \
2613 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2614 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2615 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_SEMAPHORE_PEEK_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2616 break; \
2617 case queueQUEUE_TYPE_MUTEX: \
2618 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2619 prvTraceStoreEvent_HandleParam(PSF_EVENT_MUTEX_PEEK_FAILED, (void*)(pxQueue), xTicksToWait); \
2620 break; \
2621 }
2622
2623/* Called when the task is blocked due to a peek operation on an empty queue */
2624#undef traceBLOCKING_ON_QUEUE_PEEK
2625#define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) \
2626 switch ((pxQueue)->ucQueueType) \
2627 { \
2628 case queueQUEUE_TYPE_BASE: \
2629 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_QUEUE_PEEK_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2630 break; \
2631 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2632 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2633 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_SEMAPHORE_PEEK_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2634 break; \
2635 case queueQUEUE_TYPE_MUTEX: \
2636 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2637 prvTraceStoreEvent_HandleParam(PSF_EVENT_MUTEX_PEEK_BLOCK, (void*)(pxQueue), xTicksToWait); \
2638 break; \
2639 }
2640
2641#endif
2642
2643/* Called when a message is received in interrupt context, e.g., using xQueueReceiveFromISR */
2644#undef traceQUEUE_RECEIVE_FROM_ISR
2645#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) \
2646 switch ((pxQueue)->ucQueueType) \
2647 { \
2648 case queueQUEUE_TYPE_BASE: \
2649 prvTraceStoreEvent_HandleParam(PSF_EVENT_QUEUE_RECEIVE_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting - 1); \
2650 break; \
2651 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2652 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2653 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_TAKE_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting - 1); \
2654 break; \
2655 }
2656
2657/* Called when a message receive from interrupt context fails (since the queue was empty) */
2658#undef traceQUEUE_RECEIVE_FROM_ISR_FAILED
2659#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) \
2660 switch ((pxQueue)->ucQueueType) \
2661 { \
2662 case queueQUEUE_TYPE_BASE: \
2663 prvTraceStoreEvent_HandleParam(PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2664 break; \
2665 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2666 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2667 prvTraceStoreEvent_HandleParam(PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
2668 break; \
2669 }
2670
2671/* Called on xQueuePeek */
2672#undef traceQUEUE_PEEK
2673#define traceQUEUE_PEEK( pxQueue ) \
2674 switch ((pxQueue)->ucQueueType) \
2675 { \
2676 case queueQUEUE_TYPE_BASE: \
2677 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_QUEUE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2678 break; \
2679 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
2680 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
2681 prvTraceStoreEvent_HandleParamParam(PSF_EVENT_SEMAPHORE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
2682 break; \
2683 case queueQUEUE_TYPE_MUTEX: \
2684 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
2685 prvTraceStoreEvent_HandleParam(PSF_EVENT_MUTEX_PEEK, (void*)(pxQueue), xTicksToWait); \
2686 break; \
2687 }
2688
2689/* Called in vTaskPrioritySet */
2690#undef traceTASK_PRIORITY_SET
2691#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) \
2692 xTraceTaskSetPriorityWithoutHandle(pxTask, uxNewPriority)
2693
2694/* Called in vTaskPriorityInherit, which is called by Mutex operations */
2695#undef traceTASK_PRIORITY_INHERIT
2696#define traceTASK_PRIORITY_INHERIT( pxTask, uxNewPriority ) \
2697 prvTraceStoreEvent_HandleParam(PSF_EVENT_TASK_PRIO_INHERIT, (void*)(pxTask), uxNewPriority)
2698
2699/* Called in vTaskPriorityDisinherit, which is called by Mutex operations */
2700#undef traceTASK_PRIORITY_DISINHERIT
2701#define traceTASK_PRIORITY_DISINHERIT( pxTask, uxNewPriority ) \
2702 prvTraceStoreEvent_HandleParam(PSF_EVENT_TASK_PRIO_DISINHERIT, (void*)(pxTask), uxNewPriority)
2703
2704/* Called in vTaskResume */
2705#undef traceTASK_RESUME
2706#define traceTASK_RESUME( pxTaskToResume ) \
2707 prvTraceStoreEvent_Handle(PSF_EVENT_TASK_RESUME, (void*)(pxTaskToResume))
2708
2709/* Called in vTaskResumeFromISR */
2710#undef traceTASK_RESUME_FROM_ISR
2711#define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) \
2712 prvTraceStoreEvent_Handle(PSF_EVENT_TASK_RESUME_FROMISR, (void*)(pxTaskToResume))
2713
2714#if (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1)
2715
2716#undef traceMALLOC
2717#define traceMALLOC( pvAddress, uiSize ) \
2718 if (xTraceIsRecorderEnabled()) \
2719 { \
2720 xTraceHeapAlloc(xTraceKernelPortGetSystemHeapHandle(), pvAddress, uiSize); \
2721 }
2722
2723#undef traceFREE
2724#define traceFREE( pvAddress, uiSize ) \
2725 if (xTraceIsRecorderEnabled()) \
2726 { \
2727 xTraceHeapFree(xTraceKernelPortGetSystemHeapHandle(), pvAddress, uiSize); \
2728 }
2729
2730#endif
2731
2732#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1)
2733
2734/* Called in timer.c - xTimerCreate */
2735#undef traceTIMER_CREATE
2736#define traceTIMER_CREATE(tmr) \
2737 xTraceObjectRegisterWithoutHandle(PSF_EVENT_TIMER_CREATE, (void*)(tmr), (const char*)(tmr)->pcTimerName, (uint32_t)(tmr)->xTimerPeriodInTicks)
2738
2739#undef traceTIMER_CREATE_FAILED
2740#define traceTIMER_CREATE_FAILED() \
2741 prvTraceStoreEvent_None(PSF_EVENT_TIMER_CREATE_FAILED);
2742
2743#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
2744
2745#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \
2746 case tmrCOMMAND_RESET: \
2747 prvTraceStoreEvent_HandleParam((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET : PSF_EVENT_TIMER_RESET_FAILED, (void*)(tmr), xOptionalValue); \
2748 break; \
2749 case tmrCOMMAND_START_FROM_ISR: \
2750 prvTraceStoreEvent_HandleParam((xReturn == pdPASS) ? PSF_EVENT_TIMER_START_FROMISR : PSF_EVENT_TIMER_START_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
2751 break; \
2752 case tmrCOMMAND_RESET_FROM_ISR: \
2753 prvTraceStoreEvent_HandleParam((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET_FROMISR : PSF_EVENT_TIMER_RESET_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
2754 break; \
2755 case tmrCOMMAND_STOP_FROM_ISR: \
2756 prvTraceStoreEvent_HandleParam((xReturn == pdPASS) ? PSF_EVENT_TIMER_STOP_FROMISR : PSF_EVENT_TIMER_STOP_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
2757 break; \
2758 case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: \
2759 prvTraceStoreEvent_HandleParam((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR : PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
2760 break;
2761#else
2762
2763#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr)
2764
2765#endif
2766
2767/* Note that xCommandID can never be tmrCOMMAND_EXECUTE_CALLBACK (-1) since the trace macro is not called in that case */
2768#undef traceTIMER_COMMAND_SEND
2769#define traceTIMER_COMMAND_SEND(tmr, xCommandID, xOptionalValue, xReturn) \
2770 switch(xCommandID) \
2771 { \
2772 case tmrCOMMAND_START: \
2773 prvTraceStoreEvent_Handle(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_START : PSF_EVENT_TIMER_START_FAILED, (void*)(tmr)); \
2774 break; \
2775 case tmrCOMMAND_STOP: \
2776 prvTraceStoreEvent_Handle(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_STOP : PSF_EVENT_TIMER_STOP_FAILED, (void*)(tmr)); \
2777 break; \
2778 case tmrCOMMAND_CHANGE_PERIOD: \
2779 prvTraceStoreEvent_HandleParam(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD : PSF_EVENT_TIMER_CHANGEPERIOD_FAILED, (void*)(tmr), xOptionalValue); \
2780 break; \
2781 case tmrCOMMAND_DELETE: \
2782 xTraceObjectUnregisterWithoutHandle(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_DELETE : PSF_EVENT_TIMER_DELETE_FAILED, (void*)(tmr), 0); \
2783 break; \
2784 traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \
2785 }
2786
2787#undef traceTIMER_EXPIRED
2788#define traceTIMER_EXPIRED(tmr) \
2789 prvTraceStoreEvent_HandleParam(PSF_EVENT_TIMER_EXPIRED, (void*)(tmr), (TraceUnsignedBaseType_t)((tmr)->pxCallbackFunction))
2790
2791#endif
2792
2793
2794#if (TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS == 1)
2795
2796#undef tracePEND_FUNC_CALL
2797#define tracePEND_FUNC_CALL(func, arg1, arg2, ret) \
2798 prvTraceStoreEvent_Param(((ret) == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL : PSF_EVENT_TIMER_PENDFUNCCALL_FAILED, (TraceUnsignedBaseType_t)(func))
2799
2800#undef tracePEND_FUNC_CALL_FROM_ISR
2801#define tracePEND_FUNC_CALL_FROM_ISR(func, arg1, arg2, ret) \
2802 prvTraceStoreEvent_Param(((ret) == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR : PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED, (TraceUnsignedBaseType_t)(func))
2803
2804#endif
2805
2806#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1)
2807
2808#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_1_0)
2809#undef traceEVENT_GROUP_CREATE
2810#define traceEVENT_GROUP_CREATE(eg) \
2811 xTraceObjectRegisterWithoutHandle(PSF_EVENT_EVENTGROUP_CREATE, (void*)(eg), 0, (uint32_t)(eg)->uxEventBits)
2812
2813#undef traceEVENT_GROUP_DELETE
2814#define traceEVENT_GROUP_DELETE(eg) \
2815 xTraceObjectUnregisterWithoutHandle(PSF_EVENT_EVENTGROUP_DELETE, (void*)(eg), (uint32_t)(eg)->uxEventBits)
2816#else
2817#undef traceEVENT_GROUP_CREATE
2818#define traceEVENT_GROUP_CREATE(eg) \
2819 xTraceObjectRegisterWithoutHandle(PSF_EVENT_EVENTGROUP_CREATE, (void*)(eg), 0, ((EventGroup_t *)(eg))->uxEventBits)
2820
2821#undef traceEVENT_GROUP_DELETE
2822#define traceEVENT_GROUP_DELETE(eg) \
2823 xTraceObjectUnregisterWithoutHandle(PSF_EVENT_EVENTGROUP_DELETE, (void*)(eg), ((EventGroup_t *)(eg))->uxEventBits)
2824#endif
2825
2826#undef traceEVENT_GROUP_CREATE_FAILED
2827#define traceEVENT_GROUP_CREATE_FAILED() \
2828 prvTraceStoreEvent_None(PSF_EVENT_EVENTGROUP_CREATE_FAILED)
2829
2830#undef traceEVENT_GROUP_SYNC_BLOCK
2831#define traceEVENT_GROUP_SYNC_BLOCK(eg, bitsToSet, bitsToWaitFor) \
2832 prvTraceStoreEvent_HandleParam(PSF_EVENT_EVENTGROUP_SYNC_BLOCK, (void*)(eg), bitsToWaitFor)
2833
2834#undef traceEVENT_GROUP_SYNC_END
2835#define traceEVENT_GROUP_SYNC_END(eg, bitsToSet, bitsToWaitFor, wasTimeout) \
2836 prvTraceStoreEvent_HandleParam(((wasTimeout) != pdTRUE) ? PSF_EVENT_EVENTGROUP_SYNC : PSF_EVENT_EVENTGROUP_SYNC_FAILED, (void*)(eg), bitsToWaitFor)
2837
2838#undef traceEVENT_GROUP_WAIT_BITS_BLOCK
2839#define traceEVENT_GROUP_WAIT_BITS_BLOCK(eg, bitsToWaitFor) \
2840 prvTraceStoreEvent_HandleParam(PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK, (void*)(eg), bitsToWaitFor)
2841
2842#undef traceEVENT_GROUP_WAIT_BITS_END
2843#define traceEVENT_GROUP_WAIT_BITS_END(eg, bitsToWaitFor, wasTimeout) \
2844 prvTraceStoreEvent_HandleParam(((wasTimeout) != pdTRUE) ? PSF_EVENT_EVENTGROUP_WAITBITS : PSF_EVENT_EVENTGROUP_WAITBITS_FAILED, (void*)(eg), bitsToWaitFor)
2845
2846#undef traceEVENT_GROUP_CLEAR_BITS
2847#define traceEVENT_GROUP_CLEAR_BITS(eg, bitsToClear) \
2848 prvTraceStoreEvent_HandleParam(PSF_EVENT_EVENTGROUP_CLEARBITS, (void*)(eg), bitsToClear)
2849
2850#undef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR
2851#define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR(eg, bitsToClear) \
2852 prvTraceStoreEvent_HandleParam(PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR, (void*)(eg), bitsToClear)
2853
2854#undef traceEVENT_GROUP_SET_BITS
2855#define traceEVENT_GROUP_SET_BITS(eg, bitsToSet) \
2856 prvTraceStoreEvent_HandleParam(PSF_EVENT_EVENTGROUP_SETBITS, (void*)(eg), bitsToSet)
2857
2858#undef traceEVENT_GROUP_SET_BITS_FROM_ISR
2859#define traceEVENT_GROUP_SET_BITS_FROM_ISR(eg, bitsToSet) \
2860 prvTraceStoreEvent_HandleParam(PSF_EVENT_EVENTGROUP_SETBITS_FROMISR, (void*)(eg), bitsToSet)
2861
2862#endif
2863
2864#undef traceTASK_NOTIFY
2865#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
2866
2867#define traceTASK_NOTIFY(index) \
2868 prvTraceStoreEvent_Handle(PSF_EVENT_TASK_NOTIFY, (void*)xTaskToNotify)
2869
2870#else
2871
2872#define traceTASK_NOTIFY() \
2873 prvTraceStoreEvent_Handle(PSF_EVENT_TASK_NOTIFY, (void*)xTaskToNotify)
2874
2875#endif
2876
2877#undef traceTASK_NOTIFY_FROM_ISR
2878#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
2879
2880#define traceTASK_NOTIFY_FROM_ISR(index) \
2881 prvTraceStoreEvent_Handle(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (void*)xTaskToNotify)
2882
2883#else
2884
2885#define traceTASK_NOTIFY_FROM_ISR() \
2886 prvTraceStoreEvent_Handle(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (void*)xTaskToNotify)
2887
2888#endif
2889
2890/* NOTIFY and NOTIFY_GIVE will be handled identically */
2891#undef traceTASK_NOTIFY_GIVE_FROM_ISR
2892#define traceTASK_NOTIFY_GIVE_FROM_ISR traceTASK_NOTIFY_FROM_ISR
2893
2894#undef traceTASK_NOTIFY_WAIT
2895#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
2896
2897#define traceTASK_NOTIFY_WAIT(index) \
2898 prvTraceStoreEvent_HandleParam(pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED ? PSF_EVENT_TASK_NOTIFY_WAIT : PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (void*)pxCurrentTCB, xTicksToWait)
2899
2900#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0)
2901
2902#define traceTASK_NOTIFY_WAIT() \
2903 prvTraceStoreEvent_HandleParam(pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ? PSF_EVENT_TASK_NOTIFY_WAIT : PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (void*)pxCurrentTCB, xTicksToWait)
2904
2905#else
2906
2907#define traceTASK_NOTIFY_WAIT() \
2908 prvTraceStoreEvent_HandleParam(pxCurrentTCB->eNotifyState == eNotified ? PSF_EVENT_TASK_NOTIFY_WAIT : PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (void*)pxCurrentTCB, xTicksToWait)
2909
2910#endif
2911
2912/* WAIT and TAKE will be handled identically */
2913#undef traceTASK_NOTIFY_TAKE
2914#define traceTASK_NOTIFY_TAKE traceTASK_NOTIFY_WAIT
2915
2916#undef traceTASK_NOTIFY_WAIT_BLOCK
2917#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
2918
2919#define traceTASK_NOTIFY_WAIT_BLOCK(index) \
2920 prvTraceStoreEvent_HandleParam(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (void*)pxCurrentTCB, xTicksToWait)
2921
2922#else
2923
2924#define traceTASK_NOTIFY_WAIT_BLOCK() \
2925 prvTraceStoreEvent_HandleParam(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (void*)pxCurrentTCB, xTicksToWait)
2926
2927#endif
2928
2929/* WAIT_BLOCK and TAKE_BLOCK will be handled identically */
2930#undef traceTASK_NOTIFY_TAKE_BLOCK
2931#define traceTASK_NOTIFY_TAKE_BLOCK traceTASK_NOTIFY_WAIT_BLOCK
2932
2933#undef traceQUEUE_REGISTRY_ADD
2934#define traceQUEUE_REGISTRY_ADD(object, name) \
2935 xTraceObjectSetNameWithoutHandle(object, (const char*)(name));
2936
2937#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1)
2938
2939#undef traceSTREAM_BUFFER_CREATE
2940#define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) \
2941 xTraceObjectRegisterWithoutHandle((xIsMessageBuffer) == 1 ? PSF_EVENT_MESSAGEBUFFER_CREATE : PSF_EVENT_STREAMBUFFER_CREATE, (void*)(pxStreamBuffer), "", (uint32_t)xBufferSizeBytes)
2942
2943#undef traceSTREAM_BUFFER_CREATE_FAILED
2944#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) \
2945 prvTraceStoreEvent_HandleParam((xIsMessageBuffer) == 1 ? PSF_EVENT_MESSAGEBUFFER_CREATE_FAILED : PSF_EVENT_STREAMBUFFER_CREATE_FAILED, 0 , xBufferSizeBytes)
2946
2947#undef traceSTREAM_BUFFER_CREATE_STATIC_FAILED
2948#define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) \
2949 traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )
2950
2951#undef traceSTREAM_BUFFER_DELETE
2952#define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) \
2953 xTraceObjectUnregisterWithoutHandle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_DELETE : PSF_EVENT_STREAMBUFFER_DELETE, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer));
2954
2955#undef traceSTREAM_BUFFER_RESET
2956#define traceSTREAM_BUFFER_RESET( xStreamBuffer ) \
2957 prvTraceStoreEvent_HandleParam(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RESET : PSF_EVENT_STREAMBUFFER_RESET, (void*)(xStreamBuffer), 0)
2958
2959#undef traceSTREAM_BUFFER_SEND
2960#define traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ) \
2961 prvTraceStoreEvent_HandleParam(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND : PSF_EVENT_STREAMBUFFER_SEND, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer))
2962
2963#undef traceBLOCKING_ON_STREAM_BUFFER_SEND
2964#define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) \
2965 prvTraceStoreEvent_Handle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_BLOCK : PSF_EVENT_STREAMBUFFER_SEND_BLOCK, (void*)(xStreamBuffer))
2966
2967#undef traceSTREAM_BUFFER_SEND_FAILED
2968#define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) \
2969 prvTraceStoreEvent_Handle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FAILED : PSF_EVENT_STREAMBUFFER_SEND_FAILED, (void*)(xStreamBuffer))
2970
2971#undef traceSTREAM_BUFFER_RECEIVE
2972#define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) \
2973 prvTraceStoreEvent_HandleParam(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE: PSF_EVENT_STREAMBUFFER_RECEIVE, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer))
2974
2975#undef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE
2976#define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) \
2977 prvTraceStoreEvent_Handle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_BLOCK: PSF_EVENT_STREAMBUFFER_RECEIVE_BLOCK, (void*)(xStreamBuffer))
2978
2979#undef traceSTREAM_BUFFER_RECEIVE_FAILED
2980#define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) \
2981 prvTraceStoreEvent_Handle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FAILED: PSF_EVENT_STREAMBUFFER_RECEIVE_FAILED, (void*)(xStreamBuffer))
2982
2983#undef traceSTREAM_BUFFER_SEND_FROM_ISR
2984#define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ) \
2985 if ( (xReturn) > ( size_t ) 0 ) \
2986 { \
2987 prvTraceStoreEvent_HandleParam(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR : PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer)); \
2988 } \
2989 else \
2990 { \
2991 prvTraceStoreEvent_Handle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR_FAILED : PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR_FAILED, (void*)(xStreamBuffer)); \
2992 }
2993
2994#undef traceSTREAM_BUFFER_RECEIVE_FROM_ISR
2995#define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) \
2996 if ( (xReceivedLength) > ( size_t ) 0 ) \
2997 { \
2998 prvTraceStoreEvent_HandleParam(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR : PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer)); \
2999 } \
3000 else \
3001 { \
3002 prvTraceStoreEvent_Handle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR_FAILED : PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR_FAILED, (void*)(xStreamBuffer)); \
3003 }
3004
3005#endif
3006
3007#endif
3008
3009#endif
3010
3011#else
3012
3013/* When recorder is disabled */
3014#define vTraceSetQueueName(object, name)
3015#define vTraceSetSemaphoreName(object, name)
3016#define vTraceSetMutexName(object, name)
3017#define vTraceSetEventGroupName(object, name)
3018#define vTraceSetStreamBufferName(object, name)
3019#define vTraceSetMessageBufferName(object, name)
3020
3021#endif
3022
3023#ifdef __cplusplus
3024}
3025#endif
3026
3027#endif /* TRC_KERNEL_PORT_H */
A structure representing the kernel port buffer.
Definition: trcKernelPort.h:73
Public trace heap APIs.