Percepio Trace Recorder v4.11.0
Loading...
Searching...
No Matches
trcKernelPort.h
1/*
2 * Trace Recorder for Tracealyzer v4.11.0
3 * Copyright 2025 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#define TRC_FREERTOS_VERSION_10_6_0 TRC_FREERTOS_VERSION_10_4_0
48#define TRC_FREERTOS_VERSION_10_6_1 TRC_FREERTOS_VERSION_10_4_0
49#define TRC_FREERTOS_VERSION_10_6_2 TRC_FREERTOS_VERSION_10_4_0
50#define TRC_FREERTOS_VERSION_11_0_0 TRC_FREERTOS_VERSION_10_4_0
51#define TRC_FREERTOS_VERSION_11_0_1 TRC_FREERTOS_VERSION_10_4_0
52#define TRC_FREERTOS_VERSION_11_1_0 TRC_FREERTOS_VERSION_10_4_0
53
54/* Legacy FreeRTOS version codes for backwards compatibility with old trace configurations */
55#define TRC_FREERTOS_VERSION_7_3 TRC_FREERTOS_VERSION_7_3_X
56#define TRC_FREERTOS_VERSION_7_4 TRC_FREERTOS_VERSION_7_4_X
57#define TRC_FREERTOS_VERSION_7_5_OR_7_6 TRC_FREERTOS_VERSION_7_5_X
58#define TRC_FREERTOS_VERSION_8_X TRC_FREERTOS_VERSION_8_X_X
59
60#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)
61#define prvGetStreamBufferType(x) ((( StreamBuffer_t * )(x) )->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER)
62#else
63#define prvGetStreamBufferType(x) 0
64#endif
65
66/* Added mainly for our internal testing. This makes it easier to create test applications that
67 runs on multiple FreeRTOS versions. */
68#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X_X)
69 /* FreeRTOS v7.x */
70 #define STRING_CAST(x) ( (signed char*) x )
71 #define TraceKernelPortTickType_t portTickType
72 #define TraceKernelPortTaskHandle_t xTaskHandle
73 #define TraceKernelPortQueueHandle_t xQueueHandle
74#else
75 /* FreeRTOS v8.0 and later */
76 #define STRING_CAST(x) x
77 #define TraceKernelPortTickType_t TickType_t
78 #define TraceKernelPortTaskHandle_t TaskHandle_t
79 #define TraceKernelPortQueueHandle_t QueueHandle_t
80#endif
81
82#if (defined(TRC_USE_TRACEALYZER_RECORDER)) && (TRC_USE_TRACEALYZER_RECORDER == 1)
83
90#define TRC_PLATFORM_CFG "FreeRTOS"
91
98#define TRC_PLATFORM_CFG_MAJOR 1
99
106#define TRC_PLATFORM_CFG_MINOR 2
107
114#define TRC_PLATFORM_CFG_PATCH 0
115
116#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1) && (TRC_CFG_SCHEDULING_ONLY == 0)
117
123#define TRC_CFG_ALLOW_TASK_DELETE INCLUDE_vTaskDelete
124
125/* Required for stack monitoring */
126#undef INCLUDE_uxTaskGetStackHighWaterMark
127#define INCLUDE_uxTaskGetStackHighWaterMark 1
128
129#endif
130
131/* INCLUDE_xTaskGetCurrentTaskHandle must be set to 1 for tracing to work properly */
132#undef INCLUDE_xTaskGetCurrentTaskHandle
133#define INCLUDE_xTaskGetCurrentTaskHandle 1
134
135#define TRC_KERNEL_PORT_KERNEL_CAN_SWITCH_TO_SAME_TASK 0
136
137#include <trcHeap.h>
138
139#define TRC_KERNEL_PORT_BUFFER_SIZE (sizeof(TraceHeapHandle_t) + sizeof(void*))
140
141#if (TRC_CFG_FREERTOS_VERSION == FREERTOS_VERSION_NOT_SET)
142#error "Please set TRC_CFG_FREERTOS_VERSION in trcKernelPortConfig.h to the FreeRTOS version used."
143#endif
144
145#if (defined(configNUM_THREAD_LOCAL_STORAGE_POINTERS) && (configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0))
146#define TRC_KERNEL_PORT_SUPPORTS_TLS 1
147#endif
148
152typedef struct TraceKernelPortDataBuffer /* Aligned */
153{
154 uint8_t buffer[TRC_KERNEL_PORT_BUFFER_SIZE];
155} TraceKernelPortDataBuffer_t;
156
165traceResult xTraceKernelPortInitialize(TraceKernelPortDataBuffer_t* pxBuffer);
166
173traceResult xTraceKernelPortEnable(void);
174
183traceResult xTraceKernelPortDelay(uint32_t uiTicks);
184
191unsigned char xTraceKernelPortIsSchedulerSuspended(void);
192
202traceResult xTraceKernelPortSetTaskMonitorData(void* pvTask, void* pvData);
203
213traceResult xTraceKernelPortGetTaskMonitorData(void* pvTask, void** ppvData);
214
218#define TRC_KERNEL_PORT_ALLOC_CRITICAL_SECTION() TraceUnsignedBaseType_t TRACE_ALLOC_CRITICAL_SECTION_NAME;
219
223#define TRC_KERNEL_PORT_ENTER_CRITICAL_SECTION() TRACE_ALLOC_CRITICAL_SECTION_NAME = 0; portENTER_CRITICAL()
224
228#define TRC_KERNEL_PORT_EXIT_CRITICAL_SECTION() (void)TRACE_ALLOC_CRITICAL_SECTION_NAME; portEXIT_CRITICAL()
229
233#define TRC_KERNEL_PORT_SET_INTERRUPT_MASK() (TraceUnsignedBaseType_t)portSET_INTERRUPT_MASK_FROM_ISR()
234
235#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
236
240#define TRC_KERNEL_PORT_CLEAR_INTERRUPT_MASK(xMask) portCLEAR_INTERRUPT_MASK_FROM_ISR((TraceUnsignedBaseType_t)(xMask))
241
242#else
243
247#define TRC_KERNEL_PORT_CLEAR_INTERRUPT_MASK(xMask) portCLEAR_INTERRUPT_MASK_FROM_ISR((TraceUnsignedBaseType_t)xMask)
248#endif
249
250#if (TRC_CFG_SCHEDULING_ONLY == 0)
251
258void vTraceSetQueueName(void* pvQueue, const char* szName);
259
266void vTraceSetSemaphoreName(void* pvSemaphore, const char* szName);
267
274void vTraceSetMutexName(void* pvMutex, const char* szName);
275
276#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1)
277
284void vTraceSetEventGroupName(void* pvEventGroup, const char* szName);
285
286#else
287
291#define vTraceSetEventGroupName(__pvEventGroup, __szName) ((void)(__pvEventGroup), (void)(__szName))
292
293#endif
294
295#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1)
296
303void vTraceSetStreamBufferName(void* pvStreamBuffer, const char* szName);
304
311void vTraceSetMessageBufferName(void* pvMessageBuffer, const char* szName);
312
313#else
314
318#define vTraceSetStreamBufferName(__pvStreamBuffer, __szName) ((void)(__pvStreamBuffer), (void)(__szName))
319
323#define vTraceSetMessageBufferName(__pvMessageBuffer, __szName) ((void)(__pvMessageBuffer), (void)(__szName))
324
325#endif
326
327#if defined(TRC_CFG_ENABLE_STACK_MONITOR) && (TRC_CFG_ENABLE_STACK_MONITOR == 1)
328
338traceResult xTraceKernelPortGetUnusedStack(void* pvTask, TraceUnsignedBaseType_t *puxUnusedStack);
339
340#endif
341
342#else
343
347#define vTraceSetQueueName(__pvQueue, __szName) ((void)(__pvQueue), (void)(__szName))
348
352#define vTraceSetSemaphoreName(__pvSemaphore, __szName) ((void)(__pvSemaphore), (void)(__szName))
353
357#define vTraceSetMutexName(__pvMutex, __szName) ((void)(__pvMutex), (void)(__szName))
358
362#define vTraceSetEventGroupName(__pvEventGroup, __szName) ((void)(__pvEventGroup), (void)(__szName))
363
367#define vTraceSetStreamBufferName(__pvStreamBuffer, __szName) ((void)(__pvStreamBuffer), (void)(__szName))
368
372#define vTraceSetMessageBufferName(__pvMessageBuffer, __szName) ((void)(__pvMessageBuffer), (void)(__szName))
373
377#define xTraceKernelPortGetUnusedStack(pvTask, puxUnusedStack) ((void)(pvTask), (void)(puxUnusedStack))
378
379#endif
380
381/* Required for ISR tracing */
382#undef INCLUDE_xTaskGetSchedulerState
383#define INCLUDE_xTaskGetSchedulerState 1
384
388#define TRACE_KERNEL_VERSION 0x1AA1
389
393#define TRC_TICK_RATE_HZ configTICK_RATE_HZ /* Defined in "FreeRTOS.h" */
394
398#define TRACE_CPU_CLOCK_HZ configCPU_CLOCK_HZ /* Defined in "FreeRTOSConfig.h" */
399
400#if (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC)
404#define TRC_KERNEL_PORT_HEAP_INIT(size)
405
409#define TRC_KERNEL_PORT_HEAP_MALLOC(size) pvPortMalloc(size)
410#endif /* (TRC_CFG_RECORDER_BUFFER_ALLOCATION == TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC) */
411
412#if (defined(configUSE_TIMERS) && (configUSE_TIMERS == 1))
413
414#undef INCLUDE_xTimerGetTimerDaemonTaskHandle
415#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1
416
417#endif
418
419#if (TRC_CFG_HARDWARE_PORT == TRC_HARDWARE_PORT_XMOS_XCOREAI)
420
421#undef TRC_CFG_CORE_COUNT
422#ifdef configNUMBER_OF_CORES
423#define TRC_CFG_CORE_COUNT configNUMBER_OF_CORES
424#else
425#define TRC_CFG_CORE_COUNT configNUM_CORES
426#endif
427
428#undef TRC_CFG_GET_CURRENT_CORE
429#define TRC_CFG_GET_CURRENT_CORE() rtos_core_id_get()
430
431#endif
432
433#ifdef _CMSIS_RP2040_H_
434#undef TRC_CFG_CORE_COUNT
435#ifdef configNUMBER_OF_CORES
436#define TRC_CFG_CORE_COUNT configNUMBER_OF_CORES
437#else
438#define TRC_CFG_CORE_COUNT configNUM_CORES
439#endif
440
441#undef TRC_CFG_GET_CURRENT_CORE
442#define TRC_CFG_GET_CURRENT_CORE() get_core_num()
443#endif
444
445#if (TRC_CFG_FREERTOS_VERSION == TRC_FREERTOS_VERSION_9_0_1)
446
470#define isQueueReceiveHookActuallyPeek (__LINE__ > 1674) /* Half way between the closes trace points */
471
472#elif (TRC_CFG_FREERTOS_VERSION <= TRC_FREERTOS_VERSION_9_0_0)
473
477#define isQueueReceiveHookActuallyPeek xJustPeeking
478
479#elif (TRC_CFG_FREERTOS_VERSION > TRC_FREERTOS_VERSION_9_0_1)
480
484#define isQueueReceiveHookActuallyPeek (__LINE__ < 0) /* instead of pdFALSE to fix a warning of "constant condition" */
485
486#endif
487
488#if (TRC_CFG_SCHEDULING_ONLY == 0)
489/* We only do this if we're using it */
490
491/* Helpers needed to correctly expand names */
492#define TZ__CAT2(a,b) a ## b
493#define TZ__CAT(a,b) TZ__CAT2(a, b)
494
495/*
496 * The following xQueueGiveFromISR macro hacks make sure xQueueGiveFromISR also has a xCopyPosition parameter
497 */
498
499/* 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 */
500#define xQueueGiveFromISR(a,b) TZ__CAT(xQueueGiveFromISR__, uxQueueType) (a,b)
501
502/* If in queue.c, the "uxQueueType" macro expands to "pcHead". queueSEND_TO_BACK is the value we need to send in */
503#define xQueueGiveFromISR__pcHead(__a, __b) MyWrapper_xQueueGiveFromISR(__a, __b, const BaseType_t xCopyPosition); \
504BaseType_t xQueueGiveFromISR(__a, __b) { return MyWrapper_xQueueGiveFromISR(xQueue, pxHigherPriorityTaskWoken, queueSEND_TO_BACK); } \
505BaseType_t MyWrapper_xQueueGiveFromISR(__a, __b, const BaseType_t xCopyPosition)
506
507/* If not in queue.c, "uxQueueType" isn't expanded */
508#define xQueueGiveFromISR__uxQueueType(__a, __b) xQueueGiveFromISR(__a,__b)
509
510#endif
511
512TraceHeapHandle_t xTraceKernelPortGetSystemHeapHandle(void);
513
514/*************************************************************************/
515/* KERNEL SPECIFIC OBJECT CONFIGURATION */
516/*************************************************************************/
517
518/*******************************************************************************
519 * The event codes - should match the offline config file.
520 ******************************************************************************/
521
522/*** Event codes for streaming - should match the Tracealyzer config file *****/
523#define PSF_EVENT_NULL_EVENT 0x00
524
525#define PSF_EVENT_TRACE_START 0x01
526#define PSF_EVENT_TS_CONFIG 0x02
527#define PSF_EVENT_OBJ_NAME 0x03
528#define PSF_EVENT_TASK_PRIORITY 0x04
529#define PSF_EVENT_TASK_PRIO_INHERIT 0x05
530#define PSF_EVENT_TASK_PRIO_DISINHERIT 0x06
531#define PSF_EVENT_DEFINE_ISR 0x07
532
533#define PSF_EVENT_TASK_CREATE 0x10
534#define PSF_EVENT_QUEUE_CREATE 0x11
535#define PSF_EVENT_SEMAPHORE_BINARY_CREATE 0x12
536#define PSF_EVENT_MUTEX_CREATE 0x13
537#define PSF_EVENT_TIMER_CREATE 0x14
538#define PSF_EVENT_EVENTGROUP_CREATE 0x15
539#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE 0x16
540#define PSF_EVENT_MUTEX_RECURSIVE_CREATE 0x17
541#define PSF_EVENT_STREAMBUFFER_CREATE 0x18
542#define PSF_EVENT_MESSAGEBUFFER_CREATE 0x19
543
544#define PSF_EVENT_TASK_DELETE 0x20
545#define PSF_EVENT_QUEUE_DELETE 0x21
546#define PSF_EVENT_SEMAPHORE_DELETE 0x22
547#define PSF_EVENT_MUTEX_DELETE 0x23
548#define PSF_EVENT_TIMER_DELETE 0x24
549#define PSF_EVENT_EVENTGROUP_DELETE 0x25
550#define PSF_EVENT_STREAMBUFFER_DELETE 0x28
551#define PSF_EVENT_MESSAGEBUFFER_DELETE 0x29
552
553#define PSF_EVENT_TASK_READY 0x30
554#define PSF_EVENT_NEW_TIME 0x31
555#define PSF_EVENT_NEW_TIME_SCHEDULER_SUSPENDED 0x32
556#define PSF_EVENT_ISR_BEGIN 0x33
557#define PSF_EVENT_ISR_RESUME 0x34
558#define PSF_EVENT_TS_BEGIN 0x35
559#define PSF_EVENT_TS_RESUME 0x36
560#define PSF_EVENT_TASK_ACTIVATE 0x37
561
562#define PSF_EVENT_MALLOC 0x38
563#define PSF_EVENT_FREE 0x39
564
565#define PSF_EVENT_LOWPOWER_BEGIN 0x3A
566#define PSF_EVENT_LOWPOWER_END 0x3B
567
568#define PSF_EVENT_IFE_NEXT 0x3C
569#define PSF_EVENT_IFE_DIRECT 0x3D
570
571#define PSF_EVENT_TASK_CREATE_FAILED 0x40
572#define PSF_EVENT_QUEUE_CREATE_FAILED 0x41
573#define PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED 0x42
574#define PSF_EVENT_MUTEX_CREATE_FAILED 0x43
575#define PSF_EVENT_TIMER_CREATE_FAILED 0x44
576#define PSF_EVENT_EVENTGROUP_CREATE_FAILED 0x45
577#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED 0x46
578#define PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED 0x47
579#define PSF_EVENT_STREAMBUFFER_CREATE_FAILED 0x49
580#define PSF_EVENT_MESSAGEBUFFER_CREATE_FAILED 0x4A
581
582#define PSF_EVENT_TIMER_DELETE_FAILED 0x48
583
584#define PSF_EVENT_QUEUE_SEND 0x50
585#define PSF_EVENT_SEMAPHORE_GIVE 0x51
586#define PSF_EVENT_MUTEX_GIVE 0x52
587
588#define PSF_EVENT_QUEUE_SEND_FAILED 0x53
589#define PSF_EVENT_SEMAPHORE_GIVE_FAILED 0x54
590#define PSF_EVENT_MUTEX_GIVE_FAILED 0x55
591
592#define PSF_EVENT_QUEUE_SEND_BLOCK 0x56
593#define PSF_EVENT_SEMAPHORE_GIVE_BLOCK 0x57
594#define PSF_EVENT_MUTEX_GIVE_BLOCK 0x58
595
596#define PSF_EVENT_QUEUE_SEND_FROMISR 0x59
597#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR 0x5A
598
599#define PSF_EVENT_QUEUE_SEND_FROMISR_FAILED 0x5C
600#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED 0x5D
601
602#define PSF_EVENT_QUEUE_RECEIVE 0x60
603#define PSF_EVENT_SEMAPHORE_TAKE 0x61
604#define PSF_EVENT_MUTEX_TAKE 0x62
605
606#define PSF_EVENT_QUEUE_RECEIVE_FAILED 0x63
607#define PSF_EVENT_SEMAPHORE_TAKE_FAILED 0x64
608#define PSF_EVENT_MUTEX_TAKE_FAILED 0x65
609
610#define PSF_EVENT_QUEUE_RECEIVE_BLOCK 0x66
611#define PSF_EVENT_SEMAPHORE_TAKE_BLOCK 0x67
612#define PSF_EVENT_MUTEX_TAKE_BLOCK 0x68
613
614#define PSF_EVENT_QUEUE_RECEIVE_FROMISR 0x69
615#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR 0x6A
616
617#define PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED 0x6C
618#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED 0x6D
619
620#define PSF_EVENT_QUEUE_PEEK 0x70
621#define PSF_EVENT_SEMAPHORE_PEEK 0x71
622#define PSF_EVENT_MUTEX_PEEK 0x72
623
624#define PSF_EVENT_QUEUE_PEEK_FAILED 0x73
625#define PSF_EVENT_SEMAPHORE_PEEK_FAILED 0x74
626#define PSF_EVENT_MUTEX_PEEK_FAILED 0x75
627
628#define PSF_EVENT_QUEUE_PEEK_BLOCK 0x76
629#define PSF_EVENT_SEMAPHORE_PEEK_BLOCK 0x77
630#define PSF_EVENT_MUTEX_PEEK_BLOCK 0x78
631
632#define PSF_EVENT_TASK_DELAY_UNTIL 0x79
633#define PSF_EVENT_TASK_DELAY 0x7A
634#define PSF_EVENT_TASK_SUSPEND 0x7B
635#define PSF_EVENT_TASK_RESUME 0x7C
636#define PSF_EVENT_TASK_RESUME_FROMISR 0x7D
637
638#define PSF_EVENT_TIMER_PENDFUNCCALL 0x80
639#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR 0x81
640#define PSF_EVENT_TIMER_PENDFUNCCALL_FAILED 0x82
641#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED 0x83
642
643/* We reserve 0x08 slots for this */
644#define PSF_EVENT_USER_EVENT 0x90
645
646/* We reserve 0x08 slots for this */
647#define PSF_EVENT_USER_EVENT_FIXED 0x98
648
649#define PSF_EVENT_TIMER_START 0xA0
650#define PSF_EVENT_TIMER_RESET 0xA1
651#define PSF_EVENT_TIMER_STOP 0xA2
652#define PSF_EVENT_TIMER_CHANGEPERIOD 0xA3
653#define PSF_EVENT_TIMER_START_FROMISR 0xA4
654#define PSF_EVENT_TIMER_RESET_FROMISR 0xA5
655#define PSF_EVENT_TIMER_STOP_FROMISR 0xA6
656#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR 0xA7
657#define PSF_EVENT_TIMER_START_FAILED 0xA8
658#define PSF_EVENT_TIMER_RESET_FAILED 0xA9
659#define PSF_EVENT_TIMER_STOP_FAILED 0xAA
660#define PSF_EVENT_TIMER_CHANGEPERIOD_FAILED 0xAB
661#define PSF_EVENT_TIMER_START_FROMISR_FAILED 0xAC
662#define PSF_EVENT_TIMER_RESET_FROMISR_FAILED 0xAD
663#define PSF_EVENT_TIMER_STOP_FROMISR_FAILED 0xAE
664#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED 0xAF
665
666#define PSF_EVENT_EVENTGROUP_SYNC 0xB0
667#define PSF_EVENT_EVENTGROUP_WAITBITS 0xB1
668#define PSF_EVENT_EVENTGROUP_CLEARBITS 0xB2
669#define PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR 0xB3
670#define PSF_EVENT_EVENTGROUP_SETBITS 0xB4
671#define PSF_EVENT_EVENTGROUP_SETBITS_FROMISR 0xB5
672#define PSF_EVENT_EVENTGROUP_SYNC_BLOCK 0xB6
673#define PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK 0xB7
674#define PSF_EVENT_EVENTGROUP_SYNC_FAILED 0xB8
675#define PSF_EVENT_EVENTGROUP_WAITBITS_FAILED 0xB9
676
677#define PSF_EVENT_QUEUE_SEND_FRONT 0xC0
678#define PSF_EVENT_QUEUE_SEND_FRONT_FAILED 0xC1
679#define PSF_EVENT_QUEUE_SEND_FRONT_BLOCK 0xC2
680#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR 0xC3
681#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED 0xC4
682#define PSF_EVENT_MUTEX_GIVE_RECURSIVE 0xC5
683#define PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED 0xC6
684#define PSF_EVENT_MUTEX_TAKE_RECURSIVE 0xC7
685#define PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED 0xC8
686
687#define PSF_EVENT_TASK_NOTIFY 0xC9
688#define PSF_EVENT_TASK_NOTIFY_WAIT 0xCA
689#define PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK 0xCB
690#define PSF_EVENT_TASK_NOTIFY_WAIT_FAILED 0xCC
691#define PSF_EVENT_TASK_NOTIFY_FROM_ISR 0xCD
692
693#define PSF_EVENT_TIMER_EXPIRED 0xD2
694
695#define PSF_EVENT_STREAMBUFFER_SEND 0xD3
696#define PSF_EVENT_STREAMBUFFER_SEND_BLOCK 0xD4
697#define PSF_EVENT_STREAMBUFFER_SEND_FAILED 0xD5
698#define PSF_EVENT_STREAMBUFFER_RECEIVE 0xD6
699#define PSF_EVENT_STREAMBUFFER_RECEIVE_BLOCK 0xD7
700#define PSF_EVENT_STREAMBUFFER_RECEIVE_FAILED 0xD8
701#define PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR 0xD9
702#define PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR_FAILED 0xDA
703#define PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR 0xDB
704#define PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR_FAILED 0xDC
705#define PSF_EVENT_STREAMBUFFER_RESET 0xDD
706
707#define PSF_EVENT_MESSAGEBUFFER_SEND 0xDE
708#define PSF_EVENT_MESSAGEBUFFER_SEND_BLOCK 0xDF
709#define PSF_EVENT_MESSAGEBUFFER_SEND_FAILED 0xE0
710#define PSF_EVENT_MESSAGEBUFFER_RECEIVE 0xE1
711#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_BLOCK 0xE2
712#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FAILED 0xE3
713#define PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR 0xE4
714#define PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR_FAILED 0xE5
715#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR 0xE6
716#define PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR_FAILED 0xE7
717#define PSF_EVENT_MESSAGEBUFFER_RESET 0xE8
718
719#define PSF_EVENT_MALLOC_FAILED 0xE9
720#define PSF_EVENT_FREE_FAILED 0xEA
721
722#define PSF_EVENT_UNUSED_STACK 0xEB
723
724#define PSF_EVENT_STATEMACHINE_STATE_CREATE 0xEC
725#define PSF_EVENT_STATEMACHINE_CREATE 0xED
726#define PSF_EVENT_STATEMACHINE_STATECHANGE 0xEE
727
728#define PSF_EVENT_INTERVAL_CHANNEL_CREATE 0xEF
729#define PSF_EVENT_INTERVAL_START 0xF0
730
731#define PSF_EVENT_EXTENSION_CREATE 0xF1
732
733#define PSF_EVENT_HEAP_CREATE 0xF2
734
735#define PSF_EVENT_COUNTER_CREATE 0xF3
736#define PSF_EVENT_COUNTER_CHANGE 0xF4
737#define PSF_EVENT_COUNTER_LIMIT_EXCEEDED 0xF5
738
739#define PSF_EVENT_MUTEX_TAKE_RECURSIVE_BLOCK 0xF6
740
741#define PSF_EVENT_INTERVAL_STOP 0xF7
742#define PSF_EVENT_INTERVAL_CHANNEL_SET_CREATE 0xF8
743
744#define PSF_EVENT_RUNNABLE_REGISTER 0xF9
745#define PSF_EVENT_RUNNABLE_START 0xFA
746#define PSF_EVENT_RUNNABLE_STOP 0xFB
747
748#define PSF_EVENT_DEPENDENCY_REGISTER 0xFC
749
750#define TRC_EVENT_LAST_ID (PSF_EVENT_DEPENDENCY_REGISTER)
751
752/*** The trace macros for streaming ******************************************/
753
754/* A macro that will update the tick count when returning from tickless idle */
755#undef traceINCREASE_TICK_COUNT
756/* 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.*/
757#define traceINCREASE_TICK_COUNT( xCount ) { uint32_t uiTraceTickCount; (void)xTraceTimestampGetOsTickCount(&uiTraceTickCount); (void)xTraceTimestampSetOsTickCount(uiTraceTickCount + (xCount)); }
758
759#if (TRC_CFG_INCLUDE_OSTICK_EVENTS == 1)
760
761#define OS_TICK_EVENT(uxSchedulerSuspended, xTickCount) if ((uxSchedulerSuspended) == (TraceUnsignedBaseType_t) pdFALSE) { prvTraceEventCreate1(PSF_EVENT_NEW_TIME, xTickCount); }
762
763#else
764
765#define OS_TICK_EVENT(uxSchedulerSuspended, xTickCount)
766
767#endif
768
769/* Called on each OS tick. Will call uiPortGetTimestamp to make sure it is called at least once every OS tick. */
770#undef traceTASK_INCREMENT_TICK
771#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_3_0
772
773#define traceTASK_INCREMENT_TICK( xTickCount ) \
774 if (uxSchedulerSuspended == ( TraceUnsignedBaseType_t ) pdTRUE || xPendedTicks == 0) { (void)xTraceTimestampSetOsTickCount((xTickCount) + 1); } \
775 OS_TICK_EVENT(uxSchedulerSuspended, (xTickCount) + 1)
776
777#elif TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X
778
779#define traceTASK_INCREMENT_TICK( xTickCount ) \
780 if (uxSchedulerSuspended == ( TraceUnsignedBaseType_t ) pdTRUE || uxPendedTicks == 0) { (void)xTraceTimestampSetOsTickCount((xTickCount) + 1); } \
781 OS_TICK_EVENT(uxSchedulerSuspended, (xTickCount) + 1)
782
783#else
784
785#define traceTASK_INCREMENT_TICK( xTickCount ) \
786 if (uxSchedulerSuspended == ( TraceUnsignedBaseType_t ) pdTRUE || uxMissedTicks == 0) { (void)xTraceTimestampSetOsTickCount((xTickCount) + 1); } \
787 OS_TICK_EVENT(uxSchedulerSuspended, (xTickCount) + 1)
788
789#endif
790
791/* Called before each task-switch */
792#undef traceTASK_SWITCHED_OUT
793#define traceTASK_SWITCHED_OUT() \
794 (void)xTraceTaskMonitorSwitchOut(pxCurrentTCB)
795
796/* Called on each task-switch */
797#undef traceTASK_SWITCHED_IN
798#define traceTASK_SWITCHED_IN() \
799 (void)xTraceTaskSwitch(pxCurrentTCB, pxCurrentTCB->uxPriority)
800
801/* Called for each task that becomes ready */
802#undef traceMOVED_TASK_TO_READY_STATE
803#define traceMOVED_TASK_TO_READY_STATE( pxTCB ) \
804 (void)xTraceTaskReady(pxTCB);
805
806#undef traceTASK_CREATE
807#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0
808
809#define traceTASK_CREATE(pxNewTCB) \
810 if ((pxNewTCB) != 0) \
811 { \
812 (void)xTraceTaskRegisterWithoutHandle((void*)(pxNewTCB), (pxNewTCB)->pcTaskName, (pxNewTCB)->uxPriority); \
813 }
814
815#else
816
817#define traceTASK_CREATE(pxNewTCB) \
818 if (pxNewTCB != 0) \
819 { \
820 (void)xTraceTaskRegisterWithoutHandle((void*)pxNewTCB, (const char*)pcName, (uint32_t)uxPriority); \
821 }
822
823#endif
824
825/* Called in vTaskCreate, if it fails (typically if the stack can not be allocated) */
826#undef traceTASK_CREATE_FAILED
827#define traceTASK_CREATE_FAILED() \
828 prvTraceEventCreate0(PSF_EVENT_TASK_CREATE_FAILED)
829
830/* Called on vTaskDelete */
831#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.
832#define traceTASK_DELETE( pxTaskToDelete ) \
833 (void)xTraceTaskUnregisterWithoutHandle(pxTaskToDelete, (pxTaskToDelete)->uxPriority)
834
835#if (TRC_CFG_SCHEDULING_ONLY == 0)
836
837#if (defined(configUSE_TICKLESS_IDLE) && configUSE_TICKLESS_IDLE != 0)
838
839#undef traceLOW_POWER_IDLE_BEGIN
840#define traceLOW_POWER_IDLE_BEGIN() \
841 prvTraceEventCreate1(PSF_EVENT_LOWPOWER_BEGIN, xExpectedIdleTime)
842
843#undef traceLOW_POWER_IDLE_END
844#define traceLOW_POWER_IDLE_END() \
845 prvTraceEventCreate0(PSF_EVENT_LOWPOWER_END)
846
847#endif
848
849/* Called on vTaskSuspend */
850#undef traceTASK_SUSPEND
851#define traceTASK_SUSPEND( pxTaskToSuspend ) \
852 prvTraceEventCreate1(PSF_EVENT_TASK_SUSPEND, pxTaskToSuspend)
853
854/* Called on vTaskDelay - note the use of FreeRTOS variable xTicksToDelay */
855#undef traceTASK_DELAY
856#define traceTASK_DELAY() \
857 prvTraceEventCreate1(PSF_EVENT_TASK_DELAY, xTicksToDelay)
858
859/* Called on vTaskDelayUntil - note the use of FreeRTOS variable xTimeToWake */
860#undef traceTASK_DELAY_UNTIL
861#if TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0
862
863#define traceTASK_DELAY_UNTIL(xTimeToWake) \
864 prvTraceEventCreate1(PSF_EVENT_TASK_DELAY_UNTIL, (xTimeToWake))
865
866#else
867
868#define traceTASK_DELAY_UNTIL() \
869 prvTraceEventCreate1(PSF_EVENT_TASK_DELAY_UNTIL, xTimeToWake)
870
871#endif
872
873#if defined(queueQUEUE_TYPE_SET) && (queueQUEUE_TYPE_BASE != queueQUEUE_TYPE_SET)
874/* Queue and QueueSet are different, so we add a case for them */
875#define traceQUEUE_SET_CASE_HELPER() case queueQUEUE_TYPE_SET:
876#else
877#define traceQUEUE_SET_CASE_HELPER()
878#endif
879
880#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0)
881
882#define traceQUEUE_CREATE_HELPER() \
883 case queueQUEUE_TYPE_MUTEX: \
884 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_CREATE, (void*)pxNewQueue, "", 0); \
885 break; \
886 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
887 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (void*)pxNewQueue, "", 0); \
888 break;
889
890#else
891
892#define traceQUEUE_CREATE_HELPER()
893
894#endif
895
896/* Called in xQueueCreate, and thereby for all other object based on queues, such as semaphores. */
897#undef traceQUEUE_CREATE
898#define traceQUEUE_CREATE( pxNewQueue )\
899 switch ((pxNewQueue)->ucQueueType) \
900 { \
901 case queueQUEUE_TYPE_BASE: \
902 traceQUEUE_SET_CASE_HELPER() \
903 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_QUEUE_CREATE, (void*)(pxNewQueue), "", (uint32_t)uxQueueLength); \
904 break; \
905 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
906 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_BINARY_CREATE, (void*)(pxNewQueue), "", 0); \
907 break; \
908 traceQUEUE_CREATE_HELPER() \
909 }
910
911#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0)
912
913#define traceQUEUE_CREATE_FAILED_HELPER() \
914 case queueQUEUE_TYPE_MUTEX: \
915 prvTraceEventCreate2(PSF_EVENT_MUTEX_CREATE_FAILED, 0, 0); \
916 break; \
917 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
918 prvTraceEventCreate2(PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED, 0, 0); \
919 break;
920
921#else
922
923#define traceQUEUE_CREATE_FAILED_HELPER()
924
925#endif
926
927/* Called in xQueueCreate, if the queue creation fails */
928#undef traceQUEUE_CREATE_FAILED
929#define traceQUEUE_CREATE_FAILED( queueType ) \
930 switch (queueType) \
931 { \
932 case queueQUEUE_TYPE_BASE: \
933 traceQUEUE_SET_CASE_HELPER() \
934 prvTraceEventCreate2(PSF_EVENT_QUEUE_CREATE_FAILED, 0, uxQueueLength); \
935 break; \
936 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
937 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED, 0, 0); \
938 break; \
939 traceQUEUE_CREATE_FAILED_HELPER() \
940 }
941
942#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.
943#define traceQUEUE_DELETE( pxQueue ) \
944 switch ((pxQueue)->ucQueueType) \
945 { \
946 case queueQUEUE_TYPE_BASE: \
947 traceQUEUE_SET_CASE_HELPER() \
948 (void)xTraceObjectUnregisterWithoutHandle(PSF_EVENT_QUEUE_DELETE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
949 break; \
950 case queueQUEUE_TYPE_MUTEX: \
951 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
952 (void)xTraceObjectUnregisterWithoutHandle(PSF_EVENT_MUTEX_DELETE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
953 break; \
954 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
955 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
956 (void)xTraceObjectUnregisterWithoutHandle(PSF_EVENT_SEMAPHORE_DELETE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
957 break; \
958 }
959
960/* Called in xQueueCreateCountingSemaphore, if the queue creation fails */
961#undef traceCREATE_COUNTING_SEMAPHORE
962#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
963
964#define traceCREATE_COUNTING_SEMAPHORE() \
965 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)xHandle, "", (uint32_t)uxMaxCount)
966
967#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X)
968
969#define traceCREATE_COUNTING_SEMAPHORE() \
970 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)xHandle, "", uxInitialCount)
971
972#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_4_X)
973
974#define traceCREATE_COUNTING_SEMAPHORE() \
975 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)xHandle, "", uxCountValue)
976
977#else
978
979#define traceCREATE_COUNTING_SEMAPHORE() \
980 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (void*)pxHandle, "", uxCountValue)
981
982#endif
983
984#undef traceCREATE_COUNTING_SEMAPHORE_FAILED
985#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
986
987#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
988 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxMaxCount)
989
990#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_5_X)
991
992#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
993 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxInitialCount)
994
995#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_7_4_X)
996
997#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
998 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxCountValue)
999
1000#else
1001
1002#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \
1003 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED, 0, uxCountValue)
1004
1005#endif
1006
1007
1008/* This macro is not necessary as of FreeRTOS v9.0.0 */
1009#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0)
1010
1011/* Called in xQueueCreateMutex, and thereby also from xSemaphoreCreateMutex and xSemaphoreCreateRecursiveMutex */
1012#undef traceCREATE_MUTEX
1013#define traceCREATE_MUTEX( pxNewQueue ) \
1014 switch (pxNewQueue->ucQueueType) \
1015 { \
1016 case queueQUEUE_TYPE_MUTEX: \
1017 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_CREATE, (void*)(pxNewQueue), "", 0); \
1018 break; \
1019 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1020 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (void*)(pxNewQueue), "", 0); \
1021 break; \
1022 }
1023
1024/* Called in xQueueCreateMutex when the operation fails (when memory allocation fails) */
1025#undef traceCREATE_MUTEX_FAILED
1026#define traceCREATE_MUTEX_FAILED() \
1027 prvTraceEventCreate2(PSF_EVENT_MUTEX_CREATE_FAILED, 0, 0)
1028#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_9_0_0) */
1029
1030/* Called when the Mutex can not be given, since not holder */
1031#undef traceGIVE_MUTEX_RECURSIVE_FAILED
1032#define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) \
1033 prvTraceEventCreate1(PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED, (void*)(pxMutex))
1034
1035/* Called when a message is sent to a queue */ /* CS IS NEW ! */
1036#undef traceQUEUE_SEND
1037#define traceQUEUE_SEND( pxQueue ) \
1038 switch ((pxQueue)->ucQueueType) \
1039 { \
1040 case queueQUEUE_TYPE_BASE: \
1041 traceQUEUE_SET_CASE_HELPER() \
1042 prvTraceEventCreate2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND : PSF_EVENT_QUEUE_SEND_FRONT, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
1043 break; \
1044 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1045 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1046 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_GIVE, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
1047 break; \
1048 case queueQUEUE_TYPE_MUTEX: \
1049 prvTraceEventCreate1(PSF_EVENT_MUTEX_GIVE, (void*)(pxQueue)); \
1050 break; \
1051 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1052 prvTraceEventCreate1(PSF_EVENT_MUTEX_GIVE_RECURSIVE, (void*)(pxQueue)); \
1053 break; \
1054 }
1055
1056#undef traceQUEUE_SET_SEND
1057#define traceQUEUE_SET_SEND( pxQueue ) \
1058 prvTraceEventCreate2(PSF_EVENT_QUEUE_SEND, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1)
1059
1060/* Called when a message failed to be sent to a queue (timeout) */
1061#undef traceQUEUE_SEND_FAILED
1062#define traceQUEUE_SEND_FAILED( pxQueue ) \
1063 switch ((pxQueue)->ucQueueType) \
1064 { \
1065 case queueQUEUE_TYPE_BASE: \
1066 traceQUEUE_SET_CASE_HELPER() \
1067 prvTraceEventCreate2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1068 break; \
1069 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1070 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1071 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_GIVE_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1072 break; \
1073 case queueQUEUE_TYPE_MUTEX: \
1074 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1075 prvTraceEventCreate1(PSF_EVENT_MUTEX_GIVE_FAILED, (void*)(pxQueue)); \
1076 break; \
1077 }
1078
1079/* Called when the task is blocked due to a send operation on a full queue */
1080#undef traceBLOCKING_ON_QUEUE_SEND
1081#define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) \
1082 switch ((pxQueue)->ucQueueType) \
1083 { \
1084 case queueQUEUE_TYPE_BASE: \
1085 traceQUEUE_SET_CASE_HELPER() \
1086 prvTraceEventCreate2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_BLOCK : PSF_EVENT_QUEUE_SEND_FRONT_BLOCK, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1087 break; \
1088 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1089 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1090 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_GIVE_BLOCK, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1091 break; \
1092 case queueQUEUE_TYPE_MUTEX: \
1093 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1094 prvTraceEventCreate1(PSF_EVENT_MUTEX_GIVE_BLOCK, (void*)(pxQueue)); \
1095 break; \
1096 }
1097
1098/* Called when a message is sent from interrupt context, e.g., using xQueueSendFromISR */
1099#undef traceQUEUE_SEND_FROM_ISR
1100#define traceQUEUE_SEND_FROM_ISR( pxQueue ) \
1101 switch ((pxQueue)->ucQueueType) \
1102 { \
1103 case queueQUEUE_TYPE_BASE: \
1104 traceQUEUE_SET_CASE_HELPER() \
1105 prvTraceEventCreate2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
1106 break; \
1107 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1108 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1109 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting + 1); \
1110 break; \
1111 }
1112
1113/* Called when a message send from interrupt context fails (since the queue was full) */
1114#undef traceQUEUE_SEND_FROM_ISR_FAILED
1115#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) \
1116 switch ((pxQueue)->ucQueueType) \
1117 { \
1118 case queueQUEUE_TYPE_BASE: \
1119 traceQUEUE_SET_CASE_HELPER() \
1120 prvTraceEventCreate2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1121 break; \
1122 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1123 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1124 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1125 break; \
1126 }
1127
1128/* Called when a message is received from a queue */
1129#undef traceQUEUE_RECEIVE
1130#define traceQUEUE_RECEIVE( pxQueue ) \
1131 switch ((pxQueue)->ucQueueType) \
1132 { \
1133 case queueQUEUE_TYPE_BASE: \
1134 traceQUEUE_SET_CASE_HELPER() \
1135 if (isQueueReceiveHookActuallyPeek) \
1136 { \
1137 prvTraceEventCreate3(PSF_EVENT_QUEUE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
1138 } \
1139 else\
1140 { \
1141 prvTraceEventCreate3(PSF_EVENT_QUEUE_RECEIVE, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
1142 } \
1143 break; \
1144 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1145 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1146 if (isQueueReceiveHookActuallyPeek) \
1147 { \
1148 prvTraceEventCreate3(PSF_EVENT_SEMAPHORE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
1149 } \
1150 else \
1151 { \
1152 prvTraceEventCreate3(PSF_EVENT_SEMAPHORE_TAKE, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting - 1); \
1153 } \
1154 break; \
1155 case queueQUEUE_TYPE_MUTEX: \
1156 prvTraceEventCreate2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK : PSF_EVENT_MUTEX_TAKE, (void*)(pxQueue), xTicksToWait); \
1157 break; \
1158 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1159 prvTraceEventCreate2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK : PSF_EVENT_MUTEX_TAKE_RECURSIVE, (void*)(pxQueue), xTicksToWait); \
1160 break; \
1161 }
1162
1163/* Called when a receive operation on a queue fails (timeout) */
1164#undef traceQUEUE_RECEIVE_FAILED
1165#define traceQUEUE_RECEIVE_FAILED( pxQueue ) \
1166 switch ((pxQueue)->ucQueueType) \
1167 { \
1168 case queueQUEUE_TYPE_BASE: \
1169 traceQUEUE_SET_CASE_HELPER() \
1170 prvTraceEventCreate3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_QUEUE_PEEK_FAILED : PSF_EVENT_QUEUE_RECEIVE_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1171 break; \
1172 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1173 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1174 prvTraceEventCreate3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_SEMAPHORE_PEEK_FAILED : PSF_EVENT_SEMAPHORE_TAKE_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1175 break; \
1176 case queueQUEUE_TYPE_MUTEX: \
1177 prvTraceEventCreate2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_FAILED : PSF_EVENT_MUTEX_TAKE_FAILED, (void*)(pxQueue), xTicksToWait); \
1178 break; \
1179 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1180 prvTraceEventCreate2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_FAILED : PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED, (void*)(pxQueue), xTicksToWait); \
1181 break; \
1182 }
1183
1184/* Called when the task is blocked due to a receive operation on an empty queue */
1185#undef traceBLOCKING_ON_QUEUE_RECEIVE
1186#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) \
1187 switch ((pxQueue)->ucQueueType) \
1188 { \
1189 case queueQUEUE_TYPE_BASE: \
1190 traceQUEUE_SET_CASE_HELPER() \
1191 prvTraceEventCreate3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_QUEUE_PEEK_BLOCK : PSF_EVENT_QUEUE_RECEIVE_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1192 break; \
1193 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1194 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1195 prvTraceEventCreate3(isQueueReceiveHookActuallyPeek ? PSF_EVENT_SEMAPHORE_PEEK_BLOCK : PSF_EVENT_SEMAPHORE_TAKE_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1196 break; \
1197 case queueQUEUE_TYPE_MUTEX: \
1198 prvTraceEventCreate2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_BLOCK : PSF_EVENT_MUTEX_TAKE_BLOCK, (void*)(pxQueue), xTicksToWait); \
1199 break; \
1200 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1201 prvTraceEventCreate2(isQueueReceiveHookActuallyPeek ? PSF_EVENT_MUTEX_PEEK_BLOCK : PSF_EVENT_MUTEX_TAKE_RECURSIVE_BLOCK, (void*)(pxQueue), xTicksToWait); \
1202 break; \
1203 }
1204
1205#if (TRC_CFG_FREERTOS_VERSION > TRC_FREERTOS_VERSION_9_0_1)
1206
1207/* Called when a peek operation on a queue fails (timeout) */
1208#undef traceQUEUE_PEEK_FAILED
1209#define traceQUEUE_PEEK_FAILED( pxQueue ) \
1210 switch ((pxQueue)->ucQueueType) \
1211 { \
1212 case queueQUEUE_TYPE_BASE: \
1213 traceQUEUE_SET_CASE_HELPER() \
1214 prvTraceEventCreate3(PSF_EVENT_QUEUE_PEEK_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1215 break; \
1216 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1217 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1218 prvTraceEventCreate3(PSF_EVENT_SEMAPHORE_PEEK_FAILED, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1219 break; \
1220 case queueQUEUE_TYPE_MUTEX: \
1221 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1222 prvTraceEventCreate2(PSF_EVENT_MUTEX_PEEK_FAILED, (void*)(pxQueue), xTicksToWait); \
1223 break; \
1224 }
1225
1226/* Called when the task is blocked due to a peek operation on an empty queue */
1227#undef traceBLOCKING_ON_QUEUE_PEEK
1228#define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) \
1229 switch ((pxQueue)->ucQueueType) \
1230 { \
1231 case queueQUEUE_TYPE_BASE: \
1232 traceQUEUE_SET_CASE_HELPER() \
1233 prvTraceEventCreate3(PSF_EVENT_QUEUE_PEEK_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1234 break; \
1235 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1236 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1237 prvTraceEventCreate3(PSF_EVENT_SEMAPHORE_PEEK_BLOCK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1238 break; \
1239 case queueQUEUE_TYPE_MUTEX: \
1240 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1241 prvTraceEventCreate2(PSF_EVENT_MUTEX_PEEK_BLOCK, (void*)(pxQueue), xTicksToWait); \
1242 break; \
1243 }
1244
1245#endif
1246
1247/* Called when a message is received in interrupt context, e.g., using xQueueReceiveFromISR */
1248#undef traceQUEUE_RECEIVE_FROM_ISR
1249#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) \
1250 switch ((pxQueue)->ucQueueType) \
1251 { \
1252 case queueQUEUE_TYPE_BASE: \
1253 traceQUEUE_SET_CASE_HELPER() \
1254 prvTraceEventCreate2(PSF_EVENT_QUEUE_RECEIVE_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting - 1); \
1255 break; \
1256 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1257 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1258 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting - 1); \
1259 break; \
1260 }
1261
1262/* Called when a message receive from interrupt context fails (since the queue was empty) */
1263#undef traceQUEUE_RECEIVE_FROM_ISR_FAILED
1264#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) \
1265 switch ((pxQueue)->ucQueueType) \
1266 { \
1267 case queueQUEUE_TYPE_BASE: \
1268 traceQUEUE_SET_CASE_HELPER() \
1269 prvTraceEventCreate2(PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1270 break; \
1271 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1272 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1273 prvTraceEventCreate2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED, (void*)(pxQueue), (pxQueue)->uxMessagesWaiting); \
1274 break; \
1275 }
1276
1277/* Called on xQueuePeek */
1278#undef traceQUEUE_PEEK
1279#define traceQUEUE_PEEK( pxQueue ) \
1280 switch ((pxQueue)->ucQueueType) \
1281 { \
1282 case queueQUEUE_TYPE_BASE: \
1283 traceQUEUE_SET_CASE_HELPER() \
1284 prvTraceEventCreate3(PSF_EVENT_QUEUE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1285 break; \
1286 case queueQUEUE_TYPE_BINARY_SEMAPHORE: \
1287 case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \
1288 prvTraceEventCreate3(PSF_EVENT_SEMAPHORE_PEEK, (void*)(pxQueue), xTicksToWait, (pxQueue)->uxMessagesWaiting); \
1289 break; \
1290 case queueQUEUE_TYPE_MUTEX: \
1291 case queueQUEUE_TYPE_RECURSIVE_MUTEX: \
1292 prvTraceEventCreate2(PSF_EVENT_MUTEX_PEEK, (void*)(pxQueue), xTicksToWait); \
1293 break; \
1294 }
1295
1296/* Called in vTaskPrioritySet */
1297#undef traceTASK_PRIORITY_SET
1298#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) \
1299 (void)xTraceTaskSetPriorityWithoutHandle(pxTask, uxNewPriority)
1300
1301/* Called in vTaskPriorityInherit, which is called by Mutex operations */
1302#undef traceTASK_PRIORITY_INHERIT
1303#define traceTASK_PRIORITY_INHERIT( pxTask, uxNewPriority ) \
1304 prvTraceEventCreate2(PSF_EVENT_TASK_PRIO_INHERIT, (void*)(pxTask), uxNewPriority)
1305
1306/* Called in vTaskPriorityDisinherit, which is called by Mutex operations */
1307#undef traceTASK_PRIORITY_DISINHERIT
1308#define traceTASK_PRIORITY_DISINHERIT( pxTask, uxNewPriority ) \
1309 prvTraceEventCreate2(PSF_EVENT_TASK_PRIO_DISINHERIT, (void*)(pxTask), uxNewPriority)
1310
1311/* Called in vTaskResume */
1312#undef traceTASK_RESUME
1313#define traceTASK_RESUME( pxTaskToResume ) \
1314 prvTraceEventCreate1(PSF_EVENT_TASK_RESUME, (void*)(pxTaskToResume))
1315
1316/* Called in vTaskResumeFromISR */
1317#undef traceTASK_RESUME_FROM_ISR
1318#define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) \
1319 prvTraceEventCreate1(PSF_EVENT_TASK_RESUME_FROMISR, (void*)(pxTaskToResume))
1320
1321#if (TRC_CFG_INCLUDE_MEMMANG_EVENTS == 1)
1322
1323#undef traceMALLOC
1324#define traceMALLOC( pvAddress, uiSize ) \
1325 if (xTraceIsRecorderEnabled()) \
1326 { \
1327 (void)xTraceHeapAlloc(xTraceKernelPortGetSystemHeapHandle(), pvAddress, uiSize); \
1328 }
1329
1330#undef traceFREE
1331#define traceFREE( pvAddress, uiSize ) \
1332 if (xTraceIsRecorderEnabled()) \
1333 { \
1334 (void)xTraceHeapFree(xTraceKernelPortGetSystemHeapHandle(), pvAddress, uiSize); \
1335 }
1336
1337#endif
1338
1339#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1)
1340
1341/* Called in timer.c - xTimerCreate */
1342#undef traceTIMER_CREATE
1343#define traceTIMER_CREATE(tmr) \
1344 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_TIMER_CREATE, (void*)(tmr), (const char*)(tmr)->pcTimerName, (uint32_t)(tmr)->xTimerPeriodInTicks)
1345
1346#undef traceTIMER_CREATE_FAILED
1347#define traceTIMER_CREATE_FAILED() \
1348 prvTraceEventCreate0(PSF_EVENT_TIMER_CREATE_FAILED);
1349
1350#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X_X)
1351
1352#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \
1353 case tmrCOMMAND_RESET: \
1354 prvTraceEventCreate2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET : PSF_EVENT_TIMER_RESET_FAILED, (void*)(tmr), xOptionalValue); \
1355 break; \
1356 case tmrCOMMAND_START_FROM_ISR: \
1357 prvTraceEventCreate2((xReturn == pdPASS) ? PSF_EVENT_TIMER_START_FROMISR : PSF_EVENT_TIMER_START_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
1358 break; \
1359 case tmrCOMMAND_RESET_FROM_ISR: \
1360 prvTraceEventCreate2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET_FROMISR : PSF_EVENT_TIMER_RESET_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
1361 break; \
1362 case tmrCOMMAND_STOP_FROM_ISR: \
1363 prvTraceEventCreate2((xReturn == pdPASS) ? PSF_EVENT_TIMER_STOP_FROMISR : PSF_EVENT_TIMER_STOP_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
1364 break; \
1365 case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: \
1366 prvTraceEventCreate2((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR : PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED, (void*)(tmr), xOptionalValue); \
1367 break;
1368#else
1369
1370#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr)
1371
1372#endif
1373
1374/* Note that xCommandID can never be tmrCOMMAND_EXECUTE_CALLBACK (-1) since the trace macro is not called in that case */
1375#undef traceTIMER_COMMAND_SEND
1376#define traceTIMER_COMMAND_SEND(tmr, xCommandID, xOptionalValue, xReturn) \
1377 switch(xCommandID) \
1378 { \
1379 case tmrCOMMAND_START: \
1380 prvTraceEventCreate1(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_START : PSF_EVENT_TIMER_START_FAILED, (void*)(tmr)); \
1381 break; \
1382 case tmrCOMMAND_STOP: \
1383 prvTraceEventCreate1(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_STOP : PSF_EVENT_TIMER_STOP_FAILED, (void*)(tmr)); \
1384 break; \
1385 case tmrCOMMAND_CHANGE_PERIOD: \
1386 prvTraceEventCreate2(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD : PSF_EVENT_TIMER_CHANGEPERIOD_FAILED, (void*)(tmr), xOptionalValue); \
1387 break; \
1388 case tmrCOMMAND_DELETE: \
1389 (void)xTraceObjectUnregisterWithoutHandle(((xReturn) == pdPASS) ? PSF_EVENT_TIMER_DELETE : PSF_EVENT_TIMER_DELETE_FAILED, (void*)(tmr), 0); \
1390 break; \
1391 traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \
1392 }
1393
1394#undef traceTIMER_EXPIRED
1395#define traceTIMER_EXPIRED(tmr) \
1396 prvTraceEventCreate2(PSF_EVENT_TIMER_EXPIRED, (void*)(tmr), (TraceUnsignedBaseType_t)((tmr)->pxCallbackFunction))
1397
1398#endif
1399
1400
1401#if (TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS == 1)
1402
1403#undef tracePEND_FUNC_CALL
1404#define tracePEND_FUNC_CALL(func, arg1, arg2, ret) \
1405 prvTraceEventCreate1(((ret) == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL : PSF_EVENT_TIMER_PENDFUNCCALL_FAILED, (TraceUnsignedBaseType_t)(func))
1406
1407#undef tracePEND_FUNC_CALL_FROM_ISR
1408#define tracePEND_FUNC_CALL_FROM_ISR(func, arg1, arg2, ret) \
1409 prvTraceEventCreate1(((ret) == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR : PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED, (TraceUnsignedBaseType_t)(func))
1410
1411#endif
1412
1413#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1)
1414
1415#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_1_0)
1416#undef traceEVENT_GROUP_CREATE
1417#define traceEVENT_GROUP_CREATE(eg) \
1418 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_EVENTGROUP_CREATE, (void*)(eg), 0, (uint32_t)(eg)->uxEventBits)
1419
1420#undef traceEVENT_GROUP_DELETE
1421#define traceEVENT_GROUP_DELETE(eg) \
1422 (void)xTraceObjectUnregisterWithoutHandle(PSF_EVENT_EVENTGROUP_DELETE, (void*)(eg), (uint32_t)(eg)->uxEventBits)
1423#else
1424#undef traceEVENT_GROUP_CREATE
1425#define traceEVENT_GROUP_CREATE(eg) \
1426 (void)xTraceObjectRegisterWithoutHandle(PSF_EVENT_EVENTGROUP_CREATE, (void*)(eg), 0, ((EventGroup_t *)(eg))->uxEventBits)
1427
1428#undef traceEVENT_GROUP_DELETE
1429#define traceEVENT_GROUP_DELETE(eg) \
1430 (void)xTraceObjectUnregisterWithoutHandle(PSF_EVENT_EVENTGROUP_DELETE, (void*)(eg), ((EventGroup_t *)(eg))->uxEventBits)
1431#endif
1432
1433#undef traceEVENT_GROUP_CREATE_FAILED
1434#define traceEVENT_GROUP_CREATE_FAILED() \
1435 prvTraceEventCreate0(PSF_EVENT_EVENTGROUP_CREATE_FAILED)
1436
1437#undef traceEVENT_GROUP_SYNC_BLOCK
1438#define traceEVENT_GROUP_SYNC_BLOCK(eg, bitsToSet, bitsToWaitFor) \
1439 prvTraceEventCreate2(PSF_EVENT_EVENTGROUP_SYNC_BLOCK, (void*)(eg), bitsToWaitFor)
1440
1441#undef traceEVENT_GROUP_SYNC_END
1442#define traceEVENT_GROUP_SYNC_END(eg, bitsToSet, bitsToWaitFor, wasTimeout) \
1443 prvTraceEventCreate2(((wasTimeout) != pdTRUE) ? PSF_EVENT_EVENTGROUP_SYNC : PSF_EVENT_EVENTGROUP_SYNC_FAILED, (void*)(eg), bitsToWaitFor)
1444
1445#undef traceEVENT_GROUP_WAIT_BITS_BLOCK
1446#define traceEVENT_GROUP_WAIT_BITS_BLOCK(eg, bitsToWaitFor) \
1447 prvTraceEventCreate2(PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK, (void*)(eg), bitsToWaitFor)
1448
1449#undef traceEVENT_GROUP_WAIT_BITS_END
1450#define traceEVENT_GROUP_WAIT_BITS_END(eg, bitsToWaitFor, wasTimeout) \
1451 prvTraceEventCreate2(((wasTimeout) != pdTRUE) ? PSF_EVENT_EVENTGROUP_WAITBITS : PSF_EVENT_EVENTGROUP_WAITBITS_FAILED, (void*)(eg), bitsToWaitFor)
1452
1453#undef traceEVENT_GROUP_CLEAR_BITS
1454#define traceEVENT_GROUP_CLEAR_BITS(eg, bitsToClear) \
1455 prvTraceEventCreate2(PSF_EVENT_EVENTGROUP_CLEARBITS, (void*)(eg), bitsToClear)
1456
1457#undef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR
1458#define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR(eg, bitsToClear) \
1459 prvTraceEventCreate2(PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR, (void*)(eg), bitsToClear)
1460
1461#undef traceEVENT_GROUP_SET_BITS
1462#define traceEVENT_GROUP_SET_BITS(eg, bitsToSet) \
1463 prvTraceEventCreate2(PSF_EVENT_EVENTGROUP_SETBITS, (void*)(eg), bitsToSet)
1464
1465#undef traceEVENT_GROUP_SET_BITS_FROM_ISR
1466#define traceEVENT_GROUP_SET_BITS_FROM_ISR(eg, bitsToSet) \
1467 prvTraceEventCreate2(PSF_EVENT_EVENTGROUP_SETBITS_FROMISR, (void*)(eg), bitsToSet)
1468
1469#endif
1470
1471#undef traceTASK_NOTIFY
1472#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
1473
1474#define traceTASK_NOTIFY(index) \
1475 prvTraceEventCreate1(PSF_EVENT_TASK_NOTIFY, (void*)xTaskToNotify)
1476
1477#else
1478
1479#define traceTASK_NOTIFY() \
1480 prvTraceEventCreate1(PSF_EVENT_TASK_NOTIFY, (void*)xTaskToNotify)
1481
1482#endif
1483
1484#undef traceTASK_NOTIFY_FROM_ISR
1485#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
1486
1487#define traceTASK_NOTIFY_FROM_ISR(index) \
1488 prvTraceEventCreate1(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (void*)xTaskToNotify)
1489
1490#else
1491
1492#define traceTASK_NOTIFY_FROM_ISR() \
1493 prvTraceEventCreate1(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (void*)xTaskToNotify)
1494
1495#endif
1496
1497/* NOTIFY and NOTIFY_GIVE will be handled identically */
1498#undef traceTASK_NOTIFY_GIVE_FROM_ISR
1499#define traceTASK_NOTIFY_GIVE_FROM_ISR traceTASK_NOTIFY_FROM_ISR
1500
1501#undef traceTASK_NOTIFY_WAIT
1502#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
1503
1504#define traceTASK_NOTIFY_WAIT(index) \
1505 prvTraceEventCreate2(pxCurrentTCB->ucNotifyState[index] == taskNOTIFICATION_RECEIVED ? PSF_EVENT_TASK_NOTIFY_WAIT : PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (void*)pxCurrentTCB, xTicksToWait)
1506
1507#elif (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_9_0_0)
1508
1509#define traceTASK_NOTIFY_WAIT() \
1510 prvTraceEventCreate2(pxCurrentTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ? PSF_EVENT_TASK_NOTIFY_WAIT : PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (void*)pxCurrentTCB, xTicksToWait)
1511
1512#else
1513
1514#define traceTASK_NOTIFY_WAIT() \
1515 prvTraceEventCreate2(pxCurrentTCB->eNotifyState == eNotified ? PSF_EVENT_TASK_NOTIFY_WAIT : PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (void*)pxCurrentTCB, xTicksToWait)
1516
1517#endif
1518
1519/* WAIT and TAKE will be handled identically */
1520#undef traceTASK_NOTIFY_TAKE
1521#define traceTASK_NOTIFY_TAKE traceTASK_NOTIFY_WAIT
1522
1523#undef traceTASK_NOTIFY_WAIT_BLOCK
1524#if (TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_4_0)
1525
1526#define traceTASK_NOTIFY_WAIT_BLOCK(index) \
1527 prvTraceEventCreate2(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (void*)pxCurrentTCB, xTicksToWait)
1528
1529#else
1530
1531#define traceTASK_NOTIFY_WAIT_BLOCK() \
1532 prvTraceEventCreate2(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (void*)pxCurrentTCB, xTicksToWait)
1533
1534#endif
1535
1536/* WAIT_BLOCK and TAKE_BLOCK will be handled identically */
1537#undef traceTASK_NOTIFY_TAKE_BLOCK
1538#define traceTASK_NOTIFY_TAKE_BLOCK traceTASK_NOTIFY_WAIT_BLOCK
1539
1540#undef traceQUEUE_REGISTRY_ADD
1541#define traceQUEUE_REGISTRY_ADD(object, name) \
1542 (void)xTraceObjectSetNameWithoutHandle(object, (const char*)(name));
1543
1544#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1)
1545
1546#undef traceSTREAM_BUFFER_CREATE
1547#define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) \
1548 (void)xTraceObjectRegisterWithoutHandle((xIsMessageBuffer) == 1 ? PSF_EVENT_MESSAGEBUFFER_CREATE : PSF_EVENT_STREAMBUFFER_CREATE, (void*)(pxStreamBuffer), "", (uint32_t)xBufferSizeBytes)
1549
1550#undef traceSTREAM_BUFFER_CREATE_FAILED
1551#define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) \
1552 prvTraceEventCreate2((xIsMessageBuffer) == 1 ? PSF_EVENT_MESSAGEBUFFER_CREATE_FAILED : PSF_EVENT_STREAMBUFFER_CREATE_FAILED, 0 , xBufferSizeBytes)
1553
1554#undef traceSTREAM_BUFFER_CREATE_STATIC_FAILED
1555#define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) \
1556 traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )
1557
1558#undef traceSTREAM_BUFFER_DELETE
1559#define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) \
1560 (void)xTraceObjectUnregisterWithoutHandle(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_DELETE : PSF_EVENT_STREAMBUFFER_DELETE, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer));
1561
1562#undef traceSTREAM_BUFFER_RESET
1563#define traceSTREAM_BUFFER_RESET( xStreamBuffer ) \
1564 prvTraceEventCreate2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RESET : PSF_EVENT_STREAMBUFFER_RESET, (void*)(xStreamBuffer), 0)
1565
1566#undef traceSTREAM_BUFFER_SEND
1567#define traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ) \
1568 prvTraceEventCreate2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND : PSF_EVENT_STREAMBUFFER_SEND, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer))
1569
1570#undef traceBLOCKING_ON_STREAM_BUFFER_SEND
1571#define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) \
1572 prvTraceEventCreate1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_BLOCK : PSF_EVENT_STREAMBUFFER_SEND_BLOCK, (void*)(xStreamBuffer))
1573
1574#undef traceSTREAM_BUFFER_SEND_FAILED
1575#define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) \
1576 prvTraceEventCreate1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FAILED : PSF_EVENT_STREAMBUFFER_SEND_FAILED, (void*)(xStreamBuffer))
1577
1578#undef traceSTREAM_BUFFER_RECEIVE
1579#define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) \
1580 prvTraceEventCreate2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE: PSF_EVENT_STREAMBUFFER_RECEIVE, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer))
1581
1582#undef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE
1583#define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) \
1584 prvTraceEventCreate1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_BLOCK: PSF_EVENT_STREAMBUFFER_RECEIVE_BLOCK, (void*)(xStreamBuffer))
1585
1586#undef traceSTREAM_BUFFER_RECEIVE_FAILED
1587#define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) \
1588 prvTraceEventCreate1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FAILED: PSF_EVENT_STREAMBUFFER_RECEIVE_FAILED, (void*)(xStreamBuffer))
1589
1590#undef traceSTREAM_BUFFER_SEND_FROM_ISR
1591#define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ) \
1592 if ( (xReturn) > ( size_t ) 0 ) \
1593 { \
1594 prvTraceEventCreate2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR : PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer)); \
1595 } \
1596 else \
1597 { \
1598 prvTraceEventCreate1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_SEND_FROM_ISR_FAILED : PSF_EVENT_STREAMBUFFER_SEND_FROM_ISR_FAILED, (void*)(xStreamBuffer)); \
1599 }
1600
1601#undef traceSTREAM_BUFFER_RECEIVE_FROM_ISR
1602#define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) \
1603 if ( (xReceivedLength) > ( size_t ) 0 ) \
1604 { \
1605 prvTraceEventCreate2(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR : PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR, (void*)(xStreamBuffer), prvBytesInBuffer(xStreamBuffer)); \
1606 } \
1607 else \
1608 { \
1609 prvTraceEventCreate1(prvGetStreamBufferType(xStreamBuffer) > 0 ? PSF_EVENT_MESSAGEBUFFER_RECEIVE_FROM_ISR_FAILED : PSF_EVENT_STREAMBUFFER_RECEIVE_FROM_ISR_FAILED, (void*)(xStreamBuffer)); \
1610 }
1611
1612#endif
1613
1614#endif
1615
1616#else
1617
1618/* When recorder is disabled */
1619#define vTraceSetQueueName(object, name)
1620#define vTraceSetSemaphoreName(object, name)
1621#define vTraceSetMutexName(object, name)
1622#define vTraceSetEventGroupName(object, name)
1623#define vTraceSetStreamBufferName(object, name)
1624#define vTraceSetMessageBufferName(object, name)
1625
1626#endif
1627
1628#ifdef __cplusplus
1629}
1630#endif
1631
1632#endif
A structure representing the kernel port buffer.
Definition trcKernelPort.h:97
Public trace heap APIs.