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