+/*******************************************************************************\r
+ * Trace Recorder Library for Tracealyzer v3.0.2\r
+ * Percepio AB, www.percepio.com\r
+ *\r
+ * trcKernelPort.h\r
+ *\r
+ * The kernel-specific definitions for FreeRTOS.\r
+ *\r
+ * Terms of Use\r
+ * This software (the "Tracealyzer Recorder Library") is the intellectual\r
+ * property of Percepio AB and may not be sold or in other ways commercially\r
+ * redistributed without explicit written permission by Percepio AB.\r
+ *\r
+ * Separate conditions applies for the SEGGER branded source code included.\r
+ *\r
+ * The recorder library is free for use together with Percepio products.\r
+ * You may distribute the recorder library in its original form, but public\r
+ * distribution of modified versions require approval by Percepio AB.\r
+ *\r
+ * Disclaimer\r
+ * The trace tool and recorder library is being delivered to you AS IS and\r
+ * Percepio AB makes no warranty as to its use or performance. Percepio AB does\r
+ * not and cannot warrant the performance or results you may obtain by using the\r
+ * software or documentation. Percepio AB make no warranties, express or\r
+ * implied, as to noninfringement of third party rights, merchantability, or\r
+ * fitness for any particular purpose. In no event will Percepio AB, its\r
+ * technology partners, or distributors be liable to you for any consequential,\r
+ * incidental or special damages, including any lost profits or lost savings,\r
+ * even if a representative of Percepio AB has been advised of the possibility\r
+ * of such damages, or for any claim by any third party. Some jurisdictions do\r
+ * not allow the exclusion or limitation of incidental, consequential or special\r
+ * damages, or the exclusion of implied warranties or limitations on how long an\r
+ * implied warranty may last, so the above limitations may not apply to you.\r
+ *\r
+ * Tabs are used for indent in this file (1 tab = 4 spaces)\r
+ *\r
+ * Copyright Percepio AB, 2015.\r
+ * www.percepio.com\r
+ ******************************************************************************/\r
+\r
+\r
+#ifndef TRC_KERNEL_PORT_H\r
+#define TRC_KERNEL_PORT_H\r
+\r
+#ifdef __cplusplus\r
+extern \93C\94 {\r
+#endif\r
+\r
+#include "FreeRTOS.h" /* Defines configUSE_TRACE_FACILITY */\r
+#include "trcConfig.h"\r
+#include "trcHardwarePort.h"\r
+\r
+extern int uiInEventGroupSetBitsFromISR;\r
+\r
+#define USE_TRACEALYZER_RECORDER configUSE_TRACE_FACILITY\r
+\r
+#if (USE_TRACEALYZER_RECORDER == 1)\r
+\r
+/*******************************************************************************\r
+ * Trace_Init\r
+ *\r
+ * The main initalization routine for the embOS-Trace recorder. Configures RTT,\r
+ * activates the PTRACE instrumentation in embOS and the TzCtrl task.\r
+ * Also sets up the diagnostic User Event channels used by TzCtrl task.\r
+ *\r
+ * Settings used by the trace recorder are found in these header files:\r
+ * - SEGGER_RTT_Conf.h: settings for SEGGER Real-Time Terminal (RTT) which is\r
+ * used for the trace streaming.\r
+ * - trcKernelPort.h: RTT related settings for the trace streaming.\r
+ * - trcRecorder.h - settings for allocation of internal recorder tables.\r
+ * - trcHardwarePort.h - hardware-specific configuration (timestamping).\r
+ ******************************************************************************/\r
+void Trace_Init(void);\r
+\r
+/*******************************************************************************\r
+ * vTraceOnTraceBegin\r
+ *\r
+ * Called on trace begin.\r
+ ******************************************************************************/\r
+void vTraceOnTraceBegin(void);\r
+\r
+/*******************************************************************************\r
+ * vTraceOnTraceEnd\r
+ *\r
+ * Called on trace end.\r
+ ******************************************************************************/\r
+void vTraceOnTraceEnd(void);\r
+\r
+#include "trcRecorder.h"\r
+\r
+/* Defines that must be set for the recorder to work properly */\r
+#define KERNEL_ID 0x1AA1\r
+#define TRACE_TICK_RATE_HZ configTICK_RATE_HZ /* Defined in "FreeRTOS.h" */\r
+#define TRACE_CPU_CLOCK_HZ configCPU_CLOCK_HZ /* Defined in "FreeRTOSConfig.h" */\r
+\r
+#if (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_ARM_Cortex_M)\r
+ \r
+ /* Uses CMSIS API. Must be #included in trcConfig.h. */\r
+ #define TRACE_ALLOC_CRITICAL_SECTION() int __irq_status;\r
+ #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = __get_PRIMASK(); __set_PRIMASK(1);}\r
+ #define TRACE_EXIT_CRITICAL_SECTION() {__set_PRIMASK(__irq_status);}\r
+\r
+#endif\r
+\r
+#if ((TRC_RECORDER_HARDWARE_PORT == TRC_PORT_ARM_CORTEX_A9) || (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_Renesas_RX600))\r
+ #define TRACE_ALLOC_CRITICAL_SECTION() int __irq_status;\r
+ #define TRACE_ENTER_CRITICAL_SECTION() {__irq_status = portSET_INTERRUPT_MASK_FROM_ISR();}\r
+ #define TRACE_EXIT_CRITICAL_SECTION() {portCLEAR_INTERRUPT_MASK_FROM_ISR(__irq_status);}\r
+#endif\r
+\r
+#ifndef TRACE_ENTER_CRITICAL_SECTION\r
+ #error "This port has no valid definition for critical sections! See http://percepio.com/2014/10/27/how-to-define-critical-sections-for-the-recorder/"\r
+#endif\r
+\r
+void* prvTraceGetCurrentTaskHandle(void);\r
+uint32_t prvIsNewTCB(void* pNewTCB);\r
+\r
+#define OS_IS_SWITCH_FROM_INT_REQUIRED() 0\r
+#define TRACE_GET_CURRENT_TASK() prvTraceGetCurrentTaskHandle()\r
+\r
+/*************************************************************************/\r
+/* KERNEL SPECIFIC OBJECT CONFIGURATION */\r
+/*************************************************************************/\r
+\r
+/*******************************************************************************\r
+ * The event codes - should match the offline config file.\r
+ *\r
+ * Some sections below are encoded to allow for constructions like:\r
+ *\r
+ * vTraceStoreKernelCall(EVENTGROUP_CREATE + objectclass, ...\r
+ *\r
+ * The object class ID is given by the three LSB bits, in such cases. Since each\r
+ * object class has a separate object property table, the class ID is needed to\r
+ * know what section in the object table to use for getting an object name from\r
+ * an object handle.\r
+ ******************************************************************************/\r
+\r
+#define PSF_EVENT_NULL_EVENT 0x00\r
+\r
+/* PSF event codes */\r
+#define PSF_EVENT_TRACE_START 0x01\r
+#define PSF_EVENT_TS_CONFIG 0x02\r
+#define PSF_EVENT_OBJ_NAME 0x03\r
+#define PSF_EVENT_TASK_PRIORITY 0x04\r
+#define PSF_EVENT_TASK_PRIO_INHERIT 0x05\r
+#define PSF_EVENT_TASK_PRIO_DISINHERIT 0x06\r
+#define PSF_EVENT_DEFINE_ISR 0x07\r
+\r
+#define PSF_EVENT_TASK_CREATE 0x10\r
+#define PSF_EVENT_QUEUE_CREATE 0x11\r
+#define PSF_EVENT_SEMAPHORE_BINARY_CREATE 0x12\r
+#define PSF_EVENT_MUTEX_CREATE 0x13\r
+#define PSF_EVENT_TIMER_CREATE 0x14\r
+#define PSF_EVENT_EVENTGROUP_CREATE 0x15\r
+#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE 0x16\r
+#define PSF_EVENT_MUTEX_RECURSIVE_CREATE 0x17\r
+\r
+#define PSF_EVENT_TASK_DELETE 0x20\r
+#define PSF_EVENT_QUEUE_DELETE 0x21\r
+#define PSF_EVENT_SEMAPHORE_DELETE 0x22\r
+#define PSF_EVENT_MUTEX_DELETE 0x23\r
+#define PSF_EVENT_TIMER_DELETE 0x24\r
+#define PSF_EVENT_EVENTGROUP_DELETE 0x25\r
+\r
+#define PSF_EVENT_TASK_READY 0x30\r
+#define PSF_EVENT_NEW_TIME 0x31\r
+#define PSF_EVENT_NEW_TIME_SCHEDULER_SUSPENDED 0x32\r
+#define PSF_EVENT_ISR_BEGIN 0x33\r
+#define PSF_EVENT_ISR_RESUME 0x34\r
+#define PSF_EVENT_TS_BEGIN 0x35\r
+#define PSF_EVENT_TS_RESUME 0x36\r
+#define PSF_EVENT_TASK_ACTIVATE 0x37\r
+\r
+#define PSF_EVENT_MALLOC 0x38\r
+#define PSF_EVENT_FREE 0x39\r
+\r
+#define PSF_EVENT_LOWPOWER_BEGIN 0x3A\r
+#define PSF_EVENT_LOWPOWER_END 0x3B\r
+\r
+#define PSF_EVENT_IFE_NEXT 0x3C\r
+#define PSF_EVENT_IFE_DIRECT 0x3D\r
+\r
+#define PSF_EVENT_TASK_CREATE_FAILED 0x40\r
+#define PSF_EVENT_QUEUE_CREATE_FAILED 0x41\r
+#define PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED 0x42\r
+#define PSF_EVENT_MUTEX_CREATE_FAILED 0x43\r
+#define PSF_EVENT_TIMER_CREATE_FAILED 0x44\r
+#define PSF_EVENT_EVENTGROUP_CREATE_FAILED 0x45\r
+#define PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED 0x46\r
+#define PSF_EVENT_MUTEX_RECURSIVE_CREATE_FAILED 0x47\r
+\r
+#define PSF_EVENT_TIMER_DELETE_FAILED 0x48\r
+\r
+#define PSF_EVENT_QUEUE_SEND 0x50\r
+#define PSF_EVENT_SEMAPHORE_GIVE 0x51\r
+#define PSF_EVENT_MUTEX_GIVE 0x52\r
+\r
+#define PSF_EVENT_QUEUE_SEND_FAILED 0x53\r
+#define PSF_EVENT_SEMAPHORE_GIVE_FAILED 0x54\r
+#define PSF_EVENT_MUTEX_GIVE_FAILED 0x55\r
+\r
+#define PSF_EVENT_QUEUE_SEND_BLOCK 0x56\r
+#define PSF_EVENT_SEMAPHORE_GIVE_BLOCK 0x57\r
+#define PSF_EVENT_MUTEX_GIVE_BLOCK 0x58\r
+\r
+#define PSF_EVENT_QUEUE_SEND_FROMISR 0x59\r
+#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR 0x5A\r
+\r
+#define PSF_EVENT_QUEUE_SEND_FROMISR_FAILED 0x5C\r
+#define PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED 0x5D\r
+\r
+#define PSF_EVENT_QUEUE_RECEIVE 0x60\r
+#define PSF_EVENT_SEMAPHORE_TAKE 0x61\r
+#define PSF_EVENT_MUTEX_TAKE 0x62\r
+\r
+#define PSF_EVENT_QUEUE_RECEIVE_FAILED 0x63\r
+#define PSF_EVENT_SEMAPHORE_TAKE_FAILED 0x64\r
+#define PSF_EVENT_MUTEX_TAKE_FAILED 0x65\r
+\r
+#define PSF_EVENT_QUEUE_RECEIVE_BLOCK 0x66\r
+#define PSF_EVENT_SEMAPHORE_TAKE_BLOCK 0x67\r
+#define PSF_EVENT_MUTEX_TAKE_BLOCK 0x68\r
+\r
+#define PSF_EVENT_QUEUE_RECEIVE_FROMISR 0x69\r
+#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR 0x6A\r
+\r
+#define PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED 0x6C\r
+#define PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED 0x6D\r
+\r
+#define PSF_EVENT_QUEUE_PEEK 0x70\r
+#define PSF_EVENT_SEMAPHORE_PEEK 0x71 /* Will never be used */\r
+#define PSF_EVENT_MUTEX_PEEK 0x72 /* Will never be used */\r
+\r
+#define PSF_EVENT_QUEUE_PEEK_FAILED 0x73\r
+#define PSF_EVENT_SEMAPHORE_PEEK_FAILED 0x74 /* Will never be used */\r
+#define PSF_EVENT_MUTEX_PEEK_FAILED 0x75 /* Will never be used */\r
+\r
+#define PSF_EVENT_QUEUE_PEEK_BLOCK 0x76\r
+#define PSF_EVENT_SEMAPHORE_PEEK_BLOCK 0x77 /* Will never be used */\r
+#define PSF_EVENT_MUTEX_PEEK_BLOCK 0x78 /* Will never be used */\r
+\r
+#define PSF_EVENT_TASK_DELAY_UNTIL 0x79\r
+#define PSF_EVENT_TASK_DELAY 0x7A\r
+#define PSF_EVENT_TASK_SUSPEND 0x7B\r
+#define PSF_EVENT_TASK_RESUME 0x7C\r
+#define PSF_EVENT_TASK_RESUME_FROMISR 0x7D\r
+\r
+#define PSF_EVENT_TIMER_PENDFUNCCALL 0x80\r
+#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR 0x81\r
+#define PSF_EVENT_TIMER_PENDFUNCCALL_FAILED 0x82\r
+#define PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED 0x83\r
+\r
+#define PSF_EVENT_USER_EVENT 0x90\r
+\r
+#define PSF_EVENT_TIMER_START 0xA0\r
+#define PSF_EVENT_TIMER_RESET 0xA1\r
+#define PSF_EVENT_TIMER_STOP 0xA2\r
+#define PSF_EVENT_TIMER_CHANGEPERIOD 0xA3\r
+#define PSF_EVENT_TIMER_START_FROMISR 0xA4\r
+#define PSF_EVENT_TIMER_RESET_FROMISR 0xA5\r
+#define PSF_EVENT_TIMER_STOP_FROMISR 0xA6\r
+#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR 0xA7\r
+#define PSF_EVENT_TIMER_START_FAILED 0xA8\r
+#define PSF_EVENT_TIMER_RESET_FAILED 0xA9\r
+#define PSF_EVENT_TIMER_STOP_FAILED 0xAA\r
+#define PSF_EVENT_TIMER_CHANGEPERIOD_FAILED 0xAB\r
+#define PSF_EVENT_TIMER_START_FROMISR_FAILED 0xAC\r
+#define PSF_EVENT_TIMER_RESET_FROMISR_FAILED 0xAD\r
+#define PSF_EVENT_TIMER_STOP_FROMISR_FAILED 0xAE\r
+#define PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED 0xAF\r
+\r
+#define PSF_EVENT_EVENTGROUP_SYNC 0xB0\r
+#define PSF_EVENT_EVENTGROUP_WAITBITS 0xB1\r
+#define PSF_EVENT_EVENTGROUP_CLEARBITS 0xB2\r
+#define PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR 0xB3\r
+#define PSF_EVENT_EVENTGROUP_SETBITS 0xB4\r
+#define PSF_EVENT_EVENTGROUP_SETBITS_FROMISR 0xB5\r
+#define PSF_EVENT_EVENTGROUP_SYNC_BLOCK 0xB6\r
+#define PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK 0xB7\r
+#define PSF_EVENT_EVENTGROUP_SYNC_FAILED 0xB8\r
+#define PSF_EVENT_EVENTGROUP_WAITBITS_FAILED 0xB9\r
+\r
+#define PSF_EVENT_QUEUE_SEND_FRONT 0xC0\r
+#define PSF_EVENT_QUEUE_SEND_FRONT_FAILED 0xC1\r
+#define PSF_EVENT_QUEUE_SEND_FRONT_BLOCK 0xC2\r
+#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR 0xC3\r
+#define PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED 0xC4\r
+#define PSF_EVENT_MUTEX_GIVE_RECURSIVE 0xC5\r
+#define PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED 0xC6\r
+#define PSF_EVENT_MUTEX_TAKE_RECURSIVE 0xC7\r
+#define PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED 0xC8\r
+\r
+#define PSF_EVENT_TASK_NOTIFY 0xC9\r
+#define PSF_EVENT_TASK_NOTIFY_TAKE 0xCA\r
+#define PSF_EVENT_TASK_NOTIFY_TAKE_BLOCK 0xCB\r
+#define PSF_EVENT_TASK_NOTIFY_TAKE_FAILED 0xCC\r
+#define PSF_EVENT_TASK_NOTIFY_WAIT 0xCD\r
+#define PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK 0xCE\r
+#define PSF_EVENT_TASK_NOTIFY_WAIT_FAILED 0xCF\r
+#define PSF_EVENT_TASK_NOTIFY_FROM_ISR 0xD0\r
+#define PSF_EVENT_TASK_NOTIFY_GIVE_FROM_ISR 0xD1\r
+\r
+#define TRACE_GET_OS_TICKS() (uiTraceTickCount)\r
+\r
+/************************************************************************/\r
+/* KERNEL SPECIFIC DATA AND FUNCTIONS NEEDED TO PROVIDE THE */\r
+/* FUNCTIONALITY REQUESTED BY THE TRACE RECORDER */\r
+/************************************************************************/\r
+\r
+#if (configUSE_TIMERS == 1)\r
+#undef INCLUDE_xTimerGetTimerDaemonTaskHandle\r
+#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1\r
+#endif\r
+\r
+/************************************************************************/\r
+/* KERNEL SPECIFIC MACROS USED BY THE TRACE RECORDER */\r
+/************************************************************************/\r
+\r
+#define TRACE_MALLOC(size) pvPortMalloc(size)\r
+\r
+/************************************************************************/\r
+/* KERNEL SPECIFIC WRAPPERS THAT SHOULD BE CALLED BY THE KERNEL */\r
+/************************************************************************/\r
+\r
+#if (configUSE_TICKLESS_IDLE != 0)\r
+\r
+#undef traceLOW_POWER_IDLE_BEGIN\r
+#define traceLOW_POWER_IDLE_BEGIN() \\r
+ { \\r
+ vTraceStoreEvent0(PSF_EVENT_LOWPOWER_BEGIN); \\r
+ }\r
+\r
+#undef traceLOW_POWER_IDLE_END\r
+#define traceLOW_POWER_IDLE_END() \\r
+ { \\r
+ vTraceStoreEvent0(PSF_EVENT_LOWPOWER_END); \\r
+ }\r
+\r
+#endif\r
+\r
+/* A macro that will update the tick count when returning from tickless idle */\r
+#undef traceINCREASE_TICK_COUNT\r
+/* 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.*/\r
+#define traceINCREASE_TICK_COUNT( xCount ) \r
+\r
+/* Called for each task that becomes ready */\r
+#undef traceMOVED_TASK_TO_READY_STATE\r
+#define traceMOVED_TASK_TO_READY_STATE( pxTCB ) \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_READY, (uint32_t)pxTCB);\r
+\r
+/* Called on each OS tick. Will call uiPortGetTimestamp to make sure it is called at least once every OS tick. */\r
+#undef traceTASK_INCREMENT_TICK\r
+#if (TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_7_3_OR_7_4)\r
+\r
+#define traceTASK_INCREMENT_TICK( xTickCount ) \\r
+ if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxMissedTicks == 0) { extern uint32_t uiTraceTickCount; uiTraceTickCount++; } \\r
+ if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { vTraceStoreEvent1(PSF_EVENT_NEW_TIME, (xTickCount + 1)); }\r
+\r
+#else\r
+\r
+#define traceTASK_INCREMENT_TICK( xTickCount ) \\r
+ if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdTRUE || uxPendedTicks == 0) { extern uint32_t uiTraceTickCount; uiTraceTickCount++; } \\r
+ if (uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE) { vTraceStoreEvent1(PSF_EVENT_NEW_TIME, (xTickCount + 1)); }\r
+\r
+#endif\r
+\r
+/* Called on each task-switch */\r
+#undef traceTASK_SWITCHED_IN\r
+#define traceTASK_SWITCHED_IN() \\r
+ if (prvIsNewTCB(pxCurrentTCB)) \\r
+ { \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_ACTIVATE, (uint32_t)pxCurrentTCB, pxCurrentTCB->uxPriority); \\r
+ }\r
+\r
+/* Called on vTaskSuspend */\r
+#undef traceTASK_SUSPEND\r
+#define traceTASK_SUSPEND( pxTaskToSuspend ) \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_SUSPEND, (uint32_t)pxTaskToSuspend);\r
+\r
+/* Called on vTaskDelay - note the use of FreeRTOS variable xTicksToDelay */\r
+#undef traceTASK_DELAY\r
+#define traceTASK_DELAY() \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_DELAY, xTicksToDelay);\r
+\r
+/* Called on vTaskDelayUntil - note the use of FreeRTOS variable xTimeToWake */\r
+#undef traceTASK_DELAY_UNTIL\r
+#define traceTASK_DELAY_UNTIL() \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_DELAY_UNTIL, xTimeToWake);\r
+\r
+/* Called on vTaskDelete */\r
+#undef traceTASK_DELETE\r
+#define traceTASK_DELETE( pxTaskToDelete ) \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_DELETE, (uint32_t)pxTaskToDelete, (pxTaskToDelete != NULL) ? (pxTaskToDelete->uxPriority) : 0);\r
+\r
+/* Called on vQueueDelete */\r
+#undef traceQUEUE_DELETE\r
+#define traceQUEUE_DELETE( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(PSF_EVENT_QUEUE_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent2(PSF_EVENT_MUTEX_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \\r
+ break; \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_DELETE, (uint32_t)pxQueue, (pxQueue != NULL) ? (pxQueue->uxMessagesWaiting) : 0); \\r
+ break; \\r
+ }\r
+\r
+/* Called on vTaskCreate */\r
+#undef traceTASK_CREATE\r
+#define traceTASK_CREATE(pxNewTCB) \\r
+ if (pxNewTCB != NULL) \\r
+ { \\r
+ vTraceSaveSymbol(pxNewTCB, (const char*)pcName); \\r
+ vTraceSaveObjectData(pxNewTCB, uxPriority); \\r
+ vTraceStoreStringEvent(1, PSF_EVENT_OBJ_NAME, pcName, pxNewTCB); \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_CREATE, (uint32_t)pxNewTCB, uxPriority); \\r
+ }\r
+\r
+/* Called in vTaskCreate, if it fails (typically if the stack can not be allocated) */\r
+#undef traceTASK_CREATE_FAILED\r
+#define traceTASK_CREATE_FAILED() \\r
+ vTraceStoreEvent0(PSF_EVENT_TASK_CREATE_FAILED);\r
+\r
+/* Called in xQueueCreate, and thereby for all other object based on queues, such as semaphores. */\r
+#undef traceQUEUE_CREATE\r
+#define traceQUEUE_CREATE( pxNewQueue )\\r
+ switch (pxNewQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(PSF_EVENT_QUEUE_CREATE, (uint32_t)pxNewQueue, pxNewQueue->uxLength); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ vTraceStoreEvent1(PSF_EVENT_SEMAPHORE_BINARY_CREATE, (uint32_t)pxNewQueue); \\r
+ break; \\r
+ }\r
+\r
+/* Called in xQueueCreate, if the queue creation fails */\r
+#undef traceQUEUE_CREATE_FAILED\r
+#define traceQUEUE_CREATE_FAILED( queueType ) \\r
+ switch (queueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent0(PSF_EVENT_QUEUE_CREATE_FAILED); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ vTraceStoreEvent0(PSF_EVENT_SEMAPHORE_BINARY_CREATE_FAILED); \\r
+ break; \\r
+ }\r
+\r
+/* Called in xQueueCreateCountingSemaphore, if the queue creation fails */\r
+#undef traceCREATE_COUNTING_SEMAPHORE\r
+#if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
+#define traceCREATE_COUNTING_SEMAPHORE() \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)xHandle, ((Queue_t *) xHandle)->uxMessagesWaiting);\r
+#else\r
+#define traceCREATE_COUNTING_SEMAPHORE() \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_COUNTING_CREATE, (uint32_t)pxHandle, pxHandle->uxMessagesWaiting);\r
+#endif\r
+\r
+#undef traceCREATE_COUNTING_SEMAPHORE_FAILED\r
+#define traceCREATE_COUNTING_SEMAPHORE_FAILED() \\r
+ vTraceStoreEvent0(PSF_EVENT_SEMAPHORE_COUNTING_CREATE_FAILED);\r
+\r
+/* Called in xQueueCreateMutex, and thereby also from xSemaphoreCreateMutex and xSemaphoreCreateRecursiveMutex */\r
+#undef traceCREATE_MUTEX\r
+#define traceCREATE_MUTEX( pxNewQueue ) \\r
+ switch (ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_CREATE, (uint32_t)pxNewQueue); \\r
+ break; \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_RECURSIVE_CREATE, (uint32_t)pxNewQueue); \\r
+ break; \\r
+ }\r
+\r
+/* Called in xQueueCreateMutex when the operation fails (when memory allocation fails) */\r
+#undef traceCREATE_MUTEX_FAILED\r
+#define traceCREATE_MUTEX_FAILED() \\r
+ switch (ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ vTraceStoreEvent0(PSF_EVENT_MUTEX_CREATE_FAILED); \\r
+ break; \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent0(PSF_EVENT_MUTEX_CREATE_FAILED); \\r
+ break; \\r
+ }\r
+\r
+/* Called when a message is sent to a queue */ /* CS IS NEW ! */\r
+#undef traceQUEUE_SEND\r
+#define traceQUEUE_SEND( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND : PSF_EVENT_QUEUE_SEND_FRONT, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE, (uint32_t)pxQueue); \\r
+ break; \\r
+ }\r
+\r
+/* Called when a message failed to be sent to a queue (timeout) */\r
+#undef traceQUEUE_SEND_FAILED\r
+#define traceQUEUE_SEND_FAILED( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_FAILED, (uint32_t)pxQueue); \\r
+ break; \\r
+ }\r
+\r
+ /*trcKERNEL_HOOKS_KERNEL_SERVICE(SEND, FAILED, UNUSED, pxQueue);*/\r
+\r
+/* Called when the task is blocked due to a send operation on a full queue */\r
+#undef traceBLOCKING_ON_QUEUE_SEND\r
+#define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_BLOCK : PSF_EVENT_QUEUE_SEND_FRONT_BLOCK, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_BLOCK, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_BLOCK, (uint32_t)pxQueue); \\r
+ break; \\r
+ }\r
+\r
+/* Called for Recursive Mutex */\r
+#undef traceGIVE_MUTEX_RECURSIVE\r
+#define traceGIVE_MUTEX_RECURSIVE( pxMutex ) \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_RECURSIVE, (uint32_t)pxMutex);\r
+\r
+/* Called for Recursive Mutex */\r
+#undef traceGIVE_MUTEX_RECURSIVE_FAILED\r
+#define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_GIVE_RECURSIVE_FAILED, (uint32_t)pxMutex);\r
+\r
+/**************************************************************************/\r
+/* Hack to make sure xQueueGiveFromISR also has a xCopyPosition parameter */\r
+/**************************************************************************/\r
+/* Helpers needed to correctly expand names */\r
+#define TZ__CAT2(a,b) a ## b\r
+#define TZ__CAT(a,b) TZ__CAT2(a, b)\r
+\r
+/* 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 */\r
+#define xQueueGiveFromISR(a,b) TZ__CAT(xQueueGiveFromISR__, uxQueueType) (a,b)\r
+\r
+/* If in queue.c, the "uxQueueType" macro expands to "pcHead". queueSEND_TO_BACK is the value we need to send in */\r
+#define xQueueGiveFromISR__pcHead(__a, __b) MyWrapper(__a, __b, const BaseType_t xCopyPosition); \\r
+BaseType_t xQueueGiveFromISR(__a, __b) { return MyWrapper(xQueue, pxHigherPriorityTaskWoken, queueSEND_TO_BACK); } \\r
+BaseType_t MyWrapper(__a, __b, const BaseType_t xCopyPosition)\r
+\r
+/* If not in queue.c, "uxQueueType" isn't expanded */\r
+#define xQueueGiveFromISR__uxQueueType(__a, __b) xQueueGiveFromISR(__a,__b)\r
+\r
+/**************************************************************************/\r
+/* End of xQueueGiveFromISR hack */\r
+/**************************************************************************/\r
+\r
+/* Called when a message is sent from interrupt context, e.g., using xQueueSendFromISR */\r
+#undef traceQUEUE_SEND_FROM_ISR\r
+#define traceQUEUE_SEND_FROM_ISR( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting + 1); \\r
+ break; \\r
+ }\r
+\r
+/* Called when a message send from interrupt context fails (since the queue was full) */\r
+#undef traceQUEUE_SEND_FROM_ISR_FAILED\r
+#define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(xCopyPosition == queueSEND_TO_BACK ? PSF_EVENT_QUEUE_SEND_FROMISR_FAILED : PSF_EVENT_QUEUE_SEND_FRONT_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_GIVE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ }\r
+\r
+/* Called when a message is received from a queue */\r
+#undef traceQUEUE_RECEIVE\r
+#define traceQUEUE_RECEIVE( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent3(PSF_EVENT_QUEUE_RECEIVE, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent3(PSF_EVENT_SEMAPHORE_TAKE, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting - 1); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE, (uint32_t)pxQueue, xTicksToWait); \\r
+ break; \\r
+ }\r
+\r
+/* Called when a receive operation on a queue fails (timeout) */\r
+#undef traceQUEUE_RECEIVE_FAILED\r
+#define traceQUEUE_RECEIVE_FAILED( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_QUEUE_RECEIVE_FAILED : PSF_EVENT_QUEUE_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_SEMAPHORE_TAKE_FAILED : PSF_EVENT_SEMAPHORE_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent2(xJustPeeking == pdFALSE ? PSF_EVENT_MUTEX_TAKE_FAILED : PSF_EVENT_MUTEX_PEEK_FAILED, (uint32_t)pxQueue, xTicksToWait); \\r
+ break; \\r
+ }\r
+\r
+/* Called when the task is blocked due to a receive operation on an empty queue */\r
+#undef traceBLOCKING_ON_QUEUE_RECEIVE\r
+#define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_QUEUE_RECEIVE_BLOCK : PSF_EVENT_QUEUE_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent3(xJustPeeking == pdFALSE ? PSF_EVENT_SEMAPHORE_TAKE_BLOCK : PSF_EVENT_SEMAPHORE_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent2(xJustPeeking == pdFALSE ? PSF_EVENT_MUTEX_TAKE_BLOCK : PSF_EVENT_MUTEX_PEEK_BLOCK, (uint32_t)pxQueue, xTicksToWait); \\r
+ break; \\r
+ }\r
+ \r
+#undef traceTAKE_MUTEX_RECURSIVE\r
+#if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
+#define traceTAKE_MUTEX_RECURSIVE( pxQueue ) \\r
+ vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE, (uint32_t)pxQueue, xTicksToWait);\r
+#else\r
+#define traceTAKE_MUTEX_RECURSIVE( pxQueue ) \\r
+ vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE, (uint32_t)pxQueue, xBlockTime);\r
+#endif\r
+\r
+#undef traceTAKE_MUTEX_RECURSIVE_FAILED\r
+#if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
+#define traceTAKE_MUTEX_RECURSIVE_FAILED( pxQueue ) \\r
+vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED, (uint32_t)pxQueue, xTicksToWait);\r
+#else\r
+#define traceTAKE_MUTEX_RECURSIVE_FAILED( pxQueue ) \\r
+vTraceStoreEvent2(PSF_EVENT_MUTEX_TAKE_RECURSIVE_FAILED, (uint32_t)pxQueue, xBlockTime);\r
+#endif\r
+\r
+/* Called when a message is received in interrupt context, e.g., using xQueueReceiveFromISR */\r
+#undef traceQUEUE_RECEIVE_FROM_ISR\r
+#define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) \\r
+switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(PSF_EVENT_QUEUE_RECEIVE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting - 1); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting - 1); \\r
+ break; \\r
+ }\r
+\r
+/* Called when a message receive from interrupt context fails (since the queue was empty) */\r
+#undef traceQUEUE_RECEIVE_FROM_ISR_FAILED\r
+#define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent2(PSF_EVENT_QUEUE_RECEIVE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent2(PSF_EVENT_SEMAPHORE_TAKE_FROMISR_FAILED, (uint32_t)pxQueue, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ }\r
+\r
+/* Called on xQueuePeek */\r
+#undef traceQUEUE_PEEK\r
+#define traceQUEUE_PEEK( pxQueue ) \\r
+ switch (pxQueue->ucQueueType) \\r
+ { \\r
+ case queueQUEUE_TYPE_BASE: \\r
+ vTraceStoreEvent3(PSF_EVENT_QUEUE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_BINARY_SEMAPHORE: \\r
+ case queueQUEUE_TYPE_COUNTING_SEMAPHORE: \\r
+ vTraceStoreEvent3(PSF_EVENT_SEMAPHORE_PEEK, (uint32_t)pxQueue, xTicksToWait, pxQueue->uxMessagesWaiting); \\r
+ break; \\r
+ case queueQUEUE_TYPE_MUTEX: \\r
+ case queueQUEUE_TYPE_RECURSIVE_MUTEX: \\r
+ vTraceStoreEvent1(PSF_EVENT_MUTEX_PEEK, (uint32_t)pxQueue); \\r
+ break; \\r
+ }\r
+\r
+/* Called in vTaskPrioritySet */\r
+#undef traceTASK_PRIORITY_SET\r
+#define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_PRIORITY, (uint32_t)pxTask, uxNewPriority);\r
+ \r
+/* Called in vTaskPriorityInherit, which is called by Mutex operations */\r
+#undef traceTASK_PRIORITY_INHERIT\r
+#define traceTASK_PRIORITY_INHERIT( pxTask, uxNewPriority ) \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_PRIO_INHERIT, (uint32_t)pxTask, uxNewPriority);\r
+\r
+/* Called in vTaskPriorityDisinherit, which is called by Mutex operations */\r
+#undef traceTASK_PRIORITY_DISINHERIT\r
+#define traceTASK_PRIORITY_DISINHERIT( pxTask, uxNewPriority ) \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_PRIO_DISINHERIT, (uint32_t)pxTask, uxNewPriority);\r
+\r
+/* Called in vTaskResume */\r
+#undef traceTASK_RESUME\r
+#define traceTASK_RESUME( pxTaskToResume ) \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_RESUME, (uint32_t)pxTaskToResume);\r
+\r
+/* Called in vTaskResumeFromISR */\r
+#undef traceTASK_RESUME_FROM_ISR\r
+#define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_RESUME_FROMISR, (uint32_t)pxTaskToResume);\r
+\r
+#undef traceMALLOC\r
+#define traceMALLOC( pvAddress, uiSize ) \\r
+ vTraceStoreEvent2(PSF_EVENT_MALLOC, (uint32_t)pvAddress, (int32_t)uiSize);\r
+\r
+#undef traceFREE\r
+#define traceFREE( pvAddress, uiSize ) \\r
+ vTraceStoreEvent2(PSF_EVENT_FREE, (uint32_t)pvAddress, (int32_t)(-uiSize));\r
+\r
+/* Called in timer.c - xTimerCreate */\r
+#undef traceTIMER_CREATE\r
+#define traceTIMER_CREATE(tmr) \\r
+ vTraceStoreEvent2(PSF_EVENT_TIMER_CREATE, (uint32_t)tmr, tmr->xTimerPeriodInTicks);\r
+\r
+#undef traceTIMER_CREATE_FAILED\r
+#define traceTIMER_CREATE_FAILED() \\r
+ vTraceStoreEvent0(PSF_EVENT_TIMER_CREATE_FAILED);\r
+\r
+#if TRC_FREERTOS_VERSION == TRC_FREERTOS_VERSION_8_0_OR_LATER\r
+#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \\r
+ case tmrCOMMAND_RESET: \\r
+ vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET : PSF_EVENT_TIMER_RESET_FAILED, (uint32_t)tmr, xOptionalValue); \\r
+ break; \\r
+ case tmrCOMMAND_START_FROM_ISR: \\r
+ vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_START_FROMISR : PSF_EVENT_TIMER_START_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
+ break; \\r
+ case tmrCOMMAND_RESET_FROM_ISR: \\r
+ vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_RESET_FROMISR : PSF_EVENT_TIMER_RESET_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
+ break; \\r
+ case tmrCOMMAND_STOP_FROM_ISR: \\r
+ vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_STOP_FROMISR : PSF_EVENT_TIMER_STOP_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
+ break; \\r
+ case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: \\r
+ vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR : PSF_EVENT_TIMER_CHANGEPERIOD_FROMISR_FAILED, (uint32_t)tmr, xOptionalValue); \\r
+ break;\r
+#else\r
+#define traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \r
+#endif\r
+\r
+/* Note that xCommandID can never be tmrCOMMAND_EXECUTE_CALLBACK (-1) since the trace macro is not called in that case */\r
+#undef traceTIMER_COMMAND_SEND\r
+#define traceTIMER_COMMAND_SEND(tmr, xCommandID, xOptionalValue, xReturn) \\r
+ switch(xCommandID) \\r
+ { \\r
+ case tmrCOMMAND_START: \\r
+ break; \\r
+ case tmrCOMMAND_STOP: \\r
+ break; \\r
+ case tmrCOMMAND_CHANGE_PERIOD: \\r
+ vTraceStoreEvent2((xReturn == pdPASS) ? PSF_EVENT_TIMER_CHANGEPERIOD : PSF_EVENT_TIMER_CHANGEPERIOD_FAILED, (uint32_t)tmr, xOptionalValue); \\r
+ break; \\r
+ case tmrCOMMAND_DELETE: \\r
+ vTraceStoreEvent1((xReturn == pdPASS) ? PSF_EVENT_TIMER_DELETE : PSF_EVENT_TIMER_DELETE_FAILED, (uint32_t)tmr); \\r
+ break; \\r
+ traceTIMER_COMMAND_SEND_8_0_CASES(tmr) \\r
+ }\r
+\r
+#undef tracePEND_FUNC_CALL\r
+#define tracePEND_FUNC_CALL(func, arg1, arg2, ret) \\r
+ vTraceStoreEvent1((ret == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL : PSF_EVENT_TIMER_PENDFUNCCALL_FAILED, (uint32_t)func);\r
+\r
+#undef tracePEND_FUNC_CALL_FROM_ISR\r
+#define tracePEND_FUNC_CALL_FROM_ISR(func, arg1, arg2, ret) \\r
+ vTraceStoreEvent1((ret == pdPASS) ? PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR : PSF_EVENT_TIMER_PENDFUNCCALL_FROMISR_FAILED, (uint32_t)func);\r
+\r
+#undef traceEVENT_GROUP_CREATE\r
+#define traceEVENT_GROUP_CREATE(eg) \\r
+ vTraceStoreEvent1(PSF_EVENT_EVENTGROUP_CREATE, (uint32_t)eg);\r
+\r
+#undef traceEVENT_GROUP_DELETE\r
+#define traceEVENT_GROUP_DELETE(eg) \\r
+ vTraceStoreEvent1(PSF_EVENT_EVENTGROUP_DELETE, (uint32_t)eg);\r
+\r
+#undef traceEVENT_GROUP_CREATE_FAILED\r
+#define traceEVENT_GROUP_CREATE_FAILED() \\r
+ vTraceStoreEvent0(PSF_EVENT_EVENTGROUP_CREATE_FAILED);\r
+\r
+#undef traceEVENT_GROUP_SYNC_BLOCK\r
+#define traceEVENT_GROUP_SYNC_BLOCK(eg, bitsToSet, bitsToWaitFor) \\r
+ vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SYNC_BLOCK, (uint32_t)eg, bitsToWaitFor);\r
+\r
+#undef traceEVENT_GROUP_SYNC_END\r
+#define traceEVENT_GROUP_SYNC_END(eg, bitsToSet, bitsToWaitFor, wasTimeout) \\r
+ vTraceStoreEvent2((wasTimeout != pdTRUE) ? PSF_EVENT_EVENTGROUP_SYNC : PSF_EVENT_EVENTGROUP_SYNC_FAILED, (uint32_t)eg, bitsToWaitFor);\r
+\r
+#undef traceEVENT_GROUP_WAIT_BITS_BLOCK\r
+#define traceEVENT_GROUP_WAIT_BITS_BLOCK(eg, bitsToWaitFor) \\r
+ vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_WAITBITS_BLOCK, (uint32_t)eg, bitsToWaitFor);\r
+\r
+#undef traceEVENT_GROUP_WAIT_BITS_END\r
+#define traceEVENT_GROUP_WAIT_BITS_END(eg, bitsToWaitFor, wasTimeout) \\r
+ vTraceStoreEvent2((wasTimeout != pdTRUE) ? PSF_EVENT_EVENTGROUP_WAITBITS : PSF_EVENT_EVENTGROUP_WAITBITS_FAILED, (uint32_t)eg, bitsToWaitFor);\r
+\r
+#undef traceEVENT_GROUP_CLEAR_BITS\r
+#define traceEVENT_GROUP_CLEAR_BITS(eg, bitsToClear) \\r
+ vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_CLEARBITS, (uint32_t)eg, bitsToClear);\r
+\r
+#undef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR\r
+#define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR(eg, bitsToClear) \\r
+ vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_CLEARBITS_FROMISR, (uint32_t)eg, bitsToClear);\r
+\r
+#undef traceEVENT_GROUP_SET_BITS\r
+#define traceEVENT_GROUP_SET_BITS(eg, bitsToSet) \\r
+ vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SETBITS, (uint32_t)eg, bitsToSet);\r
+\r
+#undef traceEVENT_GROUP_SET_BITS_FROM_ISR\r
+#define traceEVENT_GROUP_SET_BITS_FROM_ISR(eg, bitsToSet) \\r
+ vTraceStoreEvent2(PSF_EVENT_EVENTGROUP_SETBITS_FROMISR, (uint32_t)eg, bitsToSet);\r
+\r
+#undef traceTASK_NOTIFY_TAKE\r
+#define traceTASK_NOTIFY_TAKE() \\r
+ if (pxCurrentTCB->eNotifyState == eNotified) \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE, (uint32_t)pxCurrentTCB, xTicksToWait); \\r
+ else \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);\r
+\r
+#undef traceTASK_NOTIFY_TAKE_BLOCK\r
+#define traceTASK_NOTIFY_TAKE_BLOCK() \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_TAKE_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait);\r
+\r
+#undef traceTASK_NOTIFY_WAIT\r
+#define traceTASK_NOTIFY_WAIT() \\r
+ if (pxCurrentTCB->eNotifyState == eNotified) \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT, (uint32_t)pxCurrentTCB, xTicksToWait); \\r
+ else \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_FAILED, (uint32_t)pxCurrentTCB, xTicksToWait);\r
+\r
+#undef traceTASK_NOTIFY_WAIT_BLOCK\r
+#define traceTASK_NOTIFY_WAIT_BLOCK() \\r
+ vTraceStoreEvent2(PSF_EVENT_TASK_NOTIFY_WAIT_BLOCK, (uint32_t)pxCurrentTCB, xTicksToWait);\r
+\r
+#undef traceTASK_NOTIFY\r
+#define traceTASK_NOTIFY() \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY, (uint32_t)xTaskToNotify);\r
+\r
+#undef traceTASK_NOTIFY_FROM_ISR\r
+#define traceTASK_NOTIFY_FROM_ISR() \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_FROM_ISR, (uint32_t)xTaskToNotify);\r
+ \r
+#undef traceTASK_NOTIFY_GIVE_FROM_ISR\r
+#define traceTASK_NOTIFY_GIVE_FROM_ISR() \\r
+ vTraceStoreEvent1(PSF_EVENT_TASK_NOTIFY_GIVE_FROM_ISR, (uint32_t)xTaskToNotify);\r
+\r
+/************************************************************************/\r
+/* KERNEL SPECIFIC MACROS TO NAME OBJECTS, IF NECESSARY */\r
+/************************************************************************/\r
+#define vTraceSetQueueName(object, name) \\r
+vTraceStoreKernelObjectName(object, name);\r
+\r
+#define vTraceSetSemaphoreName(object, name) \\r
+vTraceStoreKernelObjectName(object, name);\r
+\r
+#define vTraceSetMutexName(object, name) \\r
+vTraceStoreKernelObjectName(object, name);\r
+\r
+#define vTraceSetEventGroupName(object, name) \\r
+vTraceStoreKernelObjectName(object, name);\r
+\r
+#else /*(USE_TRACEALYZER_RECORDER == 1)*/\r
+\r
+#define vTraceSetQueueName(object, name)\r
+\r
+#define vTraceSetSemaphoreName(object, name)\r
+\r
+#define vTraceSetMutexName(object, name)\r
+\r
+#define vTraceSetEventGroupName(object, name)\r
+\r
+#define Trace_Init() \r
+\r
+#endif /*(USE_TRACEALYZER_RECORDER == 1)*/\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* TRC_KERNEL_PORT_H */\r