]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-Trace/trcKernelPort.c
Update trace recorder code.
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-Trace / trcKernelPort.c
index 96e568a1a231fe406ba5be81fd035fe60bab2d8d..e86f88ed8f8bdae9899e8d635deb38874ba528f1 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************\r
- * Trace Recorder Library for Tracealyzer v3.1.2\r
+ * Trace Recorder Library for Tracealyzer v4.1.1\r
  * Percepio AB, www.percepio.com\r
  *\r
  * trcKernelPort.c\r
@@ -7,7 +7,7 @@
  * The FreeRTOS-specific parts of the trace recorder\r
  *\r
  * Terms of Use\r
- * This file is part of the trace recorder library (RECORDER), which is the\r
+ * This file is part of the trace recorder library (RECORDER), which is the \r
  * intellectual property of Percepio AB (PERCEPIO) and provided under a\r
  * license as follows.\r
  * The RECORDER may be used free of charge for the purpose of recording data\r
  * You may distribute the RECORDER in its original source code form, assuming\r
  * this text (terms of use, disclaimer, copyright notice) is unchanged. You are\r
  * allowed to distribute the RECORDER with minor modifications intended for\r
- * configuration or porting of the RECORDER, e.g., to allow using it on a\r
+ * configuration or porting of the RECORDER, e.g., to allow using it on a \r
  * specific processor, processor family or with a specific communication\r
  * interface. Any such modifications should be documented directly below\r
- * this comment block.\r
+ * this comment block.  \r
  *\r
  * Disclaimer\r
  * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty\r
- * as to its use or performance. PERCEPIO does not and cannot warrant the\r
+ * as to its use or performance. PERCEPIO does not and cannot warrant the \r
  * performance or results you may obtain by using the RECORDER or documentation.\r
  * PERCEPIO make no warranties, express or implied, as to noninfringement of\r
  * third party rights, merchantability, or fitness for any particular purpose.\r
@@ -38,7 +38,7 @@
  *\r
  * Tabs are used for indent in this file (1 tab = 4 spaces)\r
  *\r
- * Copyright Percepio AB, 2017.\r
+ * Copyright Percepio AB, 2018.\r
  * www.percepio.com\r
  ******************************************************************************/\r
 \r
 \r
 #if (defined(TRC_USE_TRACEALYZER_RECORDER) && TRC_USE_TRACEALYZER_RECORDER == 1)\r
 \r
+#ifndef TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS\r
+ /* TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS is missing in trcConfig.h. */\r
+#error "TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS must be defined in trcConfig.h."\r
+#endif\r
+\r
+#ifndef TRC_CFG_INCLUDE_TIMER_EVENTS\r
+ /* TRC_CFG_INCLUDE_TIMER_EVENTS is missing in trcConfig.h. */\r
+#error "TRC_CFG_INCLUDE_TIMER_EVENTS must be defined in trcConfig.h."\r
+#endif\r
+\r
+#ifndef TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS\r
+ /* TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS is missing in trcConfig.h. */\r
+#error "TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS must be defined in trcConfig.h."\r
+#endif\r
+\r
+#ifndef TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS\r
+ /* TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS is missing in trcConfig.h. Define this as 1 if using FreeRTOS v10 or later and like to trace stream buffer or message buffer events, otherwise 0. */\r
+#error "TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS must be defined in trcConfig.h."\r
+#endif\r
+\r
 #if (configUSE_TICKLESS_IDLE != 0 && (TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR))\r
-       /*\r
+       /*      \r
                The below error message is to alert you on the following issue:\r
-\r
-               The hardware port selected in trcConfig.h uses the operating system timer for the\r
+               \r
+               The hardware port selected in trcConfig.h uses the operating system timer for the \r
                timestamping, i.e., the periodic interrupt timer that drives the OS tick interrupt.\r
-\r
-               When using tickless idle, the recorder needs an independent time source in order to\r
-               correctly record the durations of the idle times. Otherwise, the trace may appear\r
+                               \r
+               When using "tickless idle" mode, the recorder needs an independent time source in\r
+               order to correctly record the durations of the idle times. Otherwise, the trace may appear\r
                to have a different length than in reality, and the reported CPU load is also affected.\r
-\r
+               \r
                You may override this warning by defining the TRC_CFG_ACKNOWLEDGE_TICKLESS_IDLE_WARNING\r
                macro in your trcConfig.h file. But then the time scale may be incorrect during\r
                tickless idle periods.\r
-\r
+               \r
                To get this correct, override the default timestamping by setting TRC_CFG_HARDWARE_PORT\r
                in trcConfig.h to TRC_HARDWARE_PORT_APPLICATION_DEFINED and define the HWTC macros\r
                accordingly, using a free running counter or an independent periodic interrupt timer.\r
                See trcHardwarePort.h for details.\r
-\r
-               For ARM Cortex-M3, M4 and M7 MCUs this is not an issue, since the recorder uses the\r
-               DWT cycle counter for timestamping in these cases.\r
+                               \r
+               For ARM Cortex-M3, M4 and M7 MCUs this is not an issue, since the recorder uses the \r
+               DWT cycle counter for timestamping in these cases.              \r
        */\r
-\r
+       \r
        #ifndef TRC_CFG_ACKNOWLEDGE_TICKLESS_IDLE_WARNING\r
        #error Trace Recorder: This timestamping mode is not recommended with Tickless Idle.\r
        #endif\r
-#endif\r
-\r
+#endif /* (configUSE_TICKLESS_IDLE != 0 && (TRC_HWTC_TYPE == TRC_OS_TIMER_INCR || TRC_HWTC_TYPE == TRC_OS_TIMER_DECR)) */\r
+       \r
 #include "task.h"\r
 #include "queue.h"\r
 \r
-#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)\r
+#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X)\r
+/* If the project does not include the FreeRTOS timers, TRC_CFG_INCLUDE_TIMER_EVENTS must be set to 0 */\r
+#include "timers.h"\r
+#endif /* (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X) */\r
+\r
+#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X)\r
+/* If the project does not include the FreeRTOS event groups, TRC_CFG_INCLUDE_TIMER_EVENTS must be set to 0 */\r
+#include "event_groups.h"\r
+#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X) */\r
+\r
+#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)\r
+/* If the project does not include the FreeRTOS stream buffers, TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS must be set to 0 */\r
+#include "stream_buffer.h"\r
+#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */\r
+\r
+uint32_t prvTraceGetQueueNumber(void* handle);\r
+\r
+#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X)\r
+\r
+extern unsigned char ucQueueGetQueueNumber( xQueueHandle pxQueue );\r
+extern void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber );\r
+extern unsigned char ucQueueGetQueueType( xQueueHandle pxQueue );\r
+\r
+uint32_t prvTraceGetQueueNumber(void* handle)\r
+{\r
+       return (uint32_t)ucQueueGetQueueNumber(handle);\r
+}\r
+#else \r
+uint32_t prvTraceGetQueueNumber(void* handle)\r
+{\r
+       return (uint32_t)uxQueueGetQueueNumber(handle);\r
+}\r
+#endif /* (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X) */\r
+\r
+uint8_t prvTraceGetQueueType(void* handle)\r
+{\r
+       // This is either declared in header file in FreeRTOS 8 and later, or as extern above\r
+       return ucQueueGetQueueType(handle);\r
+}\r
+\r
+/* Tasks */\r
+uint16_t prvTraceGetTaskNumberLow16(void* handle)\r
+{\r
+       return TRACE_GET_LOW16(uxTaskGetTaskNumber(handle));\r
+}\r
+\r
+uint16_t prvTraceGetTaskNumberHigh16(void* handle)\r
+{\r
+       return TRACE_GET_HIGH16(uxTaskGetTaskNumber(handle));\r
+}\r
+\r
+void prvTraceSetTaskNumberLow16(void* handle, uint16_t value)\r
+{\r
+       vTaskSetTaskNumber(handle, TRACE_SET_LOW16(uxTaskGetTaskNumber(handle), value));\r
+}\r
+\r
+void prvTraceSetTaskNumberHigh16(void* handle, uint16_t value)\r
+{\r
+       vTaskSetTaskNumber(handle, TRACE_SET_HIGH16(uxTaskGetTaskNumber(handle), value));\r
+}\r
+\r
+uint16_t prvTraceGetQueueNumberLow16(void* handle)\r
+{\r
+       return TRACE_GET_LOW16(prvTraceGetQueueNumber(handle));\r
+}\r
+\r
+uint16_t prvTraceGetQueueNumberHigh16(void* handle)\r
+{\r
+       return TRACE_GET_HIGH16(prvTraceGetQueueNumber(handle));\r
+}\r
+\r
+void prvTraceSetQueueNumberLow16(void* handle, uint16_t value)\r
+{\r
+       vQueueSetQueueNumber(handle, TRACE_SET_LOW16(prvTraceGetQueueNumber(handle), value));\r
+}\r
+\r
+void prvTraceSetQueueNumberHigh16(void* handle, uint16_t value)\r
+{\r
+       vQueueSetQueueNumber(handle, TRACE_SET_HIGH16(prvTraceGetQueueNumber(handle), value));\r
+}\r
+\r
+#if (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)\r
+\r
+uint16_t prvTraceGetTimerNumberLow16(void* handle)\r
+{\r
+       return TRACE_GET_LOW16(uxTimerGetTimerNumber(handle));\r
+}\r
+\r
+uint16_t prvTraceGetTimerNumberHigh16(void* handle)\r
+{\r
+       return TRACE_GET_HIGH16(uxTimerGetTimerNumber(handle));\r
+}\r
+\r
+void prvTraceSetTimerNumberLow16(void* handle, uint16_t value)\r
+{\r
+       vTimerSetTimerNumber(handle, TRACE_SET_LOW16(uxTimerGetTimerNumber(handle), value));\r
+}\r
+\r
+void prvTraceSetTimerNumberHigh16(void* handle, uint16_t value)\r
+{\r
+       vTimerSetTimerNumber(handle, TRACE_SET_HIGH16(uxTimerGetTimerNumber(handle), value));\r
+}\r
+#endif /* (TRC_CFG_INCLUDE_TIMER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */\r
+\r
+#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)\r
+\r
+uint16_t prvTraceGetEventGroupNumberLow16(void* handle)\r
+{\r
+       return TRACE_GET_LOW16(uxEventGroupGetNumber(handle));\r
+}\r
+\r
+uint16_t prvTraceGetEventGroupNumberHigh16(void* handle)\r
+{\r
+       return TRACE_GET_HIGH16(uxEventGroupGetNumber(handle));\r
+}\r
+\r
+void prvTraceSetEventGroupNumberLow16(void* handle, uint16_t value)\r
+{\r
+       vEventGroupSetNumber(handle, TRACE_SET_LOW16(uxEventGroupGetNumber(handle), value));\r
+}\r
+\r
+void prvTraceSetEventGroupNumberHigh16(void* handle, uint16_t value)\r
+{\r
+       vEventGroupSetNumber(handle, TRACE_SET_HIGH16(uxEventGroupGetNumber(handle), value));\r
+}\r
+#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */\r
+\r
+#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)\r
+\r
+uint16_t prvTraceGetStreamBufferNumberLow16(void* handle)\r
+{\r
+       return TRACE_GET_LOW16(uxStreamBufferGetStreamBufferNumber(handle));\r
+}\r
+\r
+uint16_t prvTraceGetStreamBufferNumberHigh16(void* handle)\r
+{\r
+       return TRACE_GET_HIGH16(uxStreamBufferGetStreamBufferNumber(handle));\r
+}\r
+\r
+void prvTraceSetStreamBufferNumberLow16(void* handle, uint16_t value)\r
+{\r
+       vStreamBufferSetStreamBufferNumber(handle, TRACE_SET_LOW16(uxStreamBufferGetStreamBufferNumber(handle), value));\r
+}\r
+\r
+void prvTraceSetStreamBufferNumberHigh16(void* handle, uint16_t value)\r
+{\r
+       vStreamBufferSetStreamBufferNumber(handle, TRACE_SET_HIGH16(uxStreamBufferGetStreamBufferNumber(handle), value));\r
+}\r
+#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */\r
 \r
+#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)\r
+       \r
 static void* pCurrentTCB = NULL;\r
 #if (defined(configENABLE_BACKWARD_COMPATIBILITY) && configENABLE_BACKWARD_COMPATIBILITY == 0)\r
 /* We're explicitly not using compatibility mode */\r
@@ -93,10 +263,12 @@ static TaskHandle_t HandleTzCtrl = NULL;       /* TzCtrl task TCB */
 static xTaskHandle HandleTzCtrl = NULL;       /* TzCtrl task TCB */\r
 #endif\r
 \r
+#if defined(configSUPPORT_STATIC_ALLOCATION)\r
 #if (configSUPPORT_STATIC_ALLOCATION == 1)\r
 static StackType_t stackTzCtrl[TRC_CFG_CTRL_TASK_STACK_SIZE];\r
 static StaticTask_t tcbTzCtrl;\r
 #endif\r
+#endif\r
 \r
 /* Monitored by TzCtrl task, that give warnings as User Events */\r
 extern volatile uint32_t NoRoomForSymbol;\r
@@ -120,6 +292,8 @@ TRC_STREAM_PORT_ALLOCATE_FIELDS()
 /* Called by TzCtrl task periodically (Normally every 100 ms) */\r
 static void prvCheckRecorderStatus(void);\r
 \r
+extern void prvTraceWarning(int errCode);\r
+\r
 /* The TzCtrl task - receives commands from Tracealyzer (start/stop) */\r
 static portTASK_FUNCTION( TzCtrl, pvParameters );\r
 \r
@@ -132,14 +306,31 @@ static portTASK_FUNCTION( TzCtrl, pvParameters );
  ******************************************************************************/\r
 void vTraceEnable(int startOption)\r
 {\r
-       int bytes = 0;\r
+       int32_t bytes = 0;\r
+       int32_t status;\r
        extern uint32_t RecorderEnabled;\r
        TracealyzerCommandType msg;\r
 \r
-       if (HandleTzCtrl != NULL)\r
-               return; /* Seems we already initiated */\r
-\r
-       TRC_STREAM_PORT_INIT();\r
+       /* Only do this first time...*/\r
+       if (HandleTzCtrl == NULL)\r
+       {\r
+               TRC_STREAM_PORT_INIT();\r
+               \r
+               /* Note: Requires that TRC_CFG_INCLUDE_USER_EVENTS is 1. */\r
+               trcWarningChannel = xTraceRegisterString("Warnings from Recorder");\r
+\r
+               /* Creates the TzCtrl task - receives trace commands (start, stop, ...) */\r
+               #if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1)\r
+               HandleTzCtrl = xTaskCreateStatic(TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, stackTzCtrl, &tcbTzCtrl);\r
+               #else\r
+               xTaskCreate( TzCtrl, STRING_CAST("TzCtrl"), TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, &HandleTzCtrl );\r
+               #endif\r
+\r
+               if (HandleTzCtrl == NULL)\r
+               {\r
+                       prvTraceError(PSF_ERROR_TZCTRLTASK_NOT_CREATED);\r
+               }\r
+       }\r
 \r
        if (startOption == TRC_START_AWAIT_HOST)\r
        {\r
@@ -147,9 +338,15 @@ void vTraceEnable(int startOption)
                do\r
                {\r
                        bytes = 0;\r
-                       TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), &bytes);\r
+                       \r
+                       status = TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), (int32_t*)&bytes);\r
+                       \r
+                       if (status != 0)\r
+                       {\r
+                               prvTraceWarning(PSF_WARNING_STREAM_PORT_READ);\r
+                       }\r
 \r
-                       if (bytes == sizeof(TracealyzerCommandType))\r
+                       if ((status == 0) && (bytes == sizeof(TracealyzerCommandType)))\r
                        {\r
                                if (prvIsValidCommand(&msg))\r
                                {\r
@@ -158,7 +355,7 @@ void vTraceEnable(int startOption)
                                                /* On start, init and reset the timestamping */\r
                                                TRC_PORT_SPECIFIC_INIT();\r
                                        }\r
-\r
+                                       \r
                                        prvProcessCommand(&msg);\r
                                }\r
                        }\r
@@ -169,7 +366,7 @@ void vTraceEnable(int startOption)
        {\r
                /* We start streaming directly - this assumes that the interface is ready! */\r
                TRC_PORT_SPECIFIC_INIT();\r
-\r
+               \r
                msg.cmdCode = CMD_SET_ACTIVE;\r
                msg.param1 = 1;\r
                prvProcessCommand(&msg);\r
@@ -179,38 +376,9 @@ void vTraceEnable(int startOption)
                /* On TRC_INIT */\r
                TRC_PORT_SPECIFIC_INIT();\r
        }\r
-\r
-       trcWarningChannel = xTraceRegisterString("Warnings from Recorder");\r
-\r
-       /* Creates the TzCtrl task - receives trace commands (start, stop, ...) */\r
-#if (configSUPPORT_STATIC_ALLOCATION == 1)\r
-       HandleTzCtrl = xTaskCreateStatic(TzCtrl, "TzCtrl", TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, stackTzCtrl, &tcbTzCtrl);\r
-       (void)HandleTzCtrl;\r
-#else\r
-       xTaskCreate( TzCtrl, "TzCtrl", TRC_CFG_CTRL_TASK_STACK_SIZE, NULL, TRC_CFG_CTRL_TASK_PRIORITY, &HandleTzCtrl );\r
-#endif\r
-}\r
-\r
-/*******************************************************************************\r
- * prvTraceOnBegin\r
- *\r
- * Called on trace begin.\r
- ******************************************************************************/\r
-void prvTraceOnBegin()\r
-{\r
-       TRC_STREAM_PORT_ON_TRACE_BEGIN();\r
-}\r
-\r
-/*******************************************************************************\r
- * prvTraceOnEnd\r
- *\r
- * Called on trace end.\r
- ******************************************************************************/\r
-void prvTraceOnEnd()\r
-{\r
-       TRC_STREAM_PORT_ON_TRACE_END();\r
 }\r
 \r
+#if (TRC_CFG_SCHEDULING_ONLY == 0)\r
 /*******************************************************************************\r
  * vTraceSetQueueName(void* object, const char* name)\r
  *\r
@@ -243,13 +411,58 @@ void vTraceSetSemaphoreName(void* object, const char* name)
  * Parameter object: pointer to the Mutex that shall be named\r
  * Parameter name: the name to set (const string literal)\r
  *\r
- * Sets a name for Semaphore objects for display in Tracealyzer.\r
+ * Sets a name for Mutex objects for display in Tracealyzer.\r
  ******************************************************************************/\r
 void vTraceSetMutexName(void* object, const char* name)\r
 {\r
        vTraceStoreKernelObjectName(object, name);\r
 }\r
 \r
+#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X)\r
+/*******************************************************************************\r
+* vTraceSetEventGroupName(void* object, const char* name)\r
+*\r
+* Parameter object: pointer to the vTraceSetEventGroupName that shall be named\r
+* Parameter name: the name to set (const string literal)\r
+*\r
+* Sets a name for EventGroup objects for display in Tracealyzer.\r
+******************************************************************************/\r
+void vTraceSetEventGroupName(void* object, const char* name)\r
+{\r
+       vTraceStoreKernelObjectName(object, name);\r
+}\r
+#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X) */\r
+\r
+#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)\r
+/*******************************************************************************\r
+* vTraceSetStreamBufferName(void* object, const char* name)\r
+*\r
+* Parameter object: pointer to the StreamBuffer that shall be named\r
+* Parameter name: the name to set (const string literal)\r
+*\r
+* Sets a name for StreamBuffer objects for display in Tracealyzer.\r
+******************************************************************************/\r
+void vTraceSetStreamBufferName(void* object, const char* name)\r
+{\r
+       vTraceStoreKernelObjectName(object, name);\r
+}\r
+\r
+/*******************************************************************************\r
+* vTraceSetMessageBufferName(void* object, const char* name)\r
+*\r
+* Parameter object: pointer to the MessageBuffer that shall be named\r
+* Parameter name: the name to set (const string literal)\r
+*\r
+* Sets a name for MessageBuffer objects for display in Tracealyzer.\r
+******************************************************************************/\r
+void vTraceSetMessageBufferName(void* object, const char* name)\r
+{\r
+       vTraceStoreKernelObjectName(object, name);\r
+}\r
+#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */\r
+\r
+#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) */\r
+\r
 /*******************************************************************************\r
  * prvGetCurrentTaskHandle\r
  *\r
@@ -283,9 +496,9 @@ uint32_t prvIsNewTCB(void* pNewTCB)
  * Returns true if the RTOS scheduler currently is disabled, thus preventing any\r
  * task-switches from occurring. Only called from vTraceStoreISREnd.\r
  ******************************************************************************/\r
-unsigned char prvTraceIsSchedulerSuspended()\r
+unsigned char prvTraceIsSchedulerSuspended(void)\r
 {\r
-    /* Assumed to be available in FreeRTOS. According to the FreeRTOS docs,\r
+    /* Assumed to be available in FreeRTOS. According to the FreeRTOS docs, \r
        INCLUDE_xTaskGetSchedulerState or configUSE_TIMERS must be set to 1 in\r
        FreeRTOSConfig.h for this function to be available. */\r
 \r
@@ -304,47 +517,37 @@ static void prvCheckRecorderStatus(void)
 {\r
        if (NoRoomForSymbol > NoRoomForSymbol_last)\r
        {\r
-               vTracePrintF(trcWarningChannel, "TRC_CFG_SYMBOL_TABLE_SLOTS too small. Add %d slots.",\r
-                       NoRoomForSymbol);\r
-\r
+               if (NoRoomForSymbol > 0)\r
+               {\r
+                       prvTraceWarning(PSF_WARNING_SYMBOL_TABLE_SLOTS);\r
+               }\r
                NoRoomForSymbol_last = NoRoomForSymbol;\r
        }\r
 \r
        if (NoRoomForObjectData > NoRoomForObjectData_last)\r
        {\r
-               vTracePrintF(trcWarningChannel, "TRC_CFG_OBJECT_DATA_SLOTS too small. Add %d slots.",\r
-                       NoRoomForObjectData);\r
-\r
+               if (NoRoomForObjectData > 0)\r
+               {\r
+                       prvTraceWarning(PSF_WARNING_OBJECT_DATA_SLOTS);\r
+               }\r
                NoRoomForObjectData_last = NoRoomForObjectData;\r
        }\r
 \r
        if (LongestSymbolName > LongestSymbolName_last)\r
        {\r
-               if (LongestSymbolName > TRC_CFG_SYMBOL_MAX_LENGTH)\r
+               if (LongestSymbolName > (TRC_CFG_SYMBOL_MAX_LENGTH))\r
                {\r
-                       vTracePrintF(trcWarningChannel, "TRC_CFG_SYMBOL_MAX_LENGTH too small. Add %d chars.",\r
-                               LongestSymbolName);\r
+                       prvTraceWarning(PSF_WARNING_SYMBOL_MAX_LENGTH);\r
                }\r
                LongestSymbolName_last = LongestSymbolName;\r
        }\r
 \r
        if (MaxBytesTruncated > MaxBytesTruncated_last)\r
        {\r
-               /* Some string event generated a too long string that was truncated.\r
-               This may happen for the following functions:\r
-               - vTracePrintF\r
-               - vTracePrintF\r
-               - vTraceStoreKernelObjectName\r
-               - vTraceStoreUserEventChannelName\r
-               - vTraceSetISRProperties\r
-\r
-               A PSF event may store maximum 60 bytes payload, including data arguments\r
-               and string characters. For User Events, also the User Event Channel ptr\r
-               must be squeezed in, if a channel is specified. */\r
-\r
-               vTracePrintF(trcWarningChannel, "String event too long, up to %d bytes truncated.",\r
-                       MaxBytesTruncated);\r
-\r
+               if (MaxBytesTruncated > 0)\r
+               {\r
+                       prvTraceWarning(PSF_WARNING_STRING_TOO_LONG);\r
+               }\r
                MaxBytesTruncated_last = MaxBytesTruncated;\r
        }\r
 }\r
@@ -352,14 +555,15 @@ static void prvCheckRecorderStatus(void)
 /*******************************************************************************\r
  * TzCtrl\r
  *\r
- * Task for receiving commands from Tracealyzer and for recorder diagnostics.\r
- *\r
+ * Task for sending the trace data from the internal buffer to the stream \r
+ * interface (assuming TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1) and for\r
+ * receiving commands from Tracealyzer. Also does some diagnostics.\r
  ******************************************************************************/\r
 static portTASK_FUNCTION( TzCtrl, pvParameters )\r
 {\r
        TracealyzerCommandType msg;\r
-       int bytes = 0;\r
-\r
+       int32_t bytes = 0;\r
+       int32_t status = 0;\r
        (void)pvParameters;\r
 \r
        while (1)\r
@@ -368,8 +572,14 @@ static portTASK_FUNCTION( TzCtrl, pvParameters )
                {\r
                        /* Listen for new commands */\r
                        bytes = 0;\r
-                       TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), &bytes);\r
-                       if (bytes == sizeof(TracealyzerCommandType))\r
+                       status = TRC_STREAM_PORT_READ_DATA(&msg, sizeof(TracealyzerCommandType), (int32_t*)&bytes);\r
+\r
+                       if (status != 0)\r
+                       {\r
+                               prvTraceWarning(PSF_WARNING_STREAM_PORT_READ);\r
+                       }\r
+\r
+                       if ((status == 0) && (bytes == sizeof(TracealyzerCommandType)))\r
                        {\r
                                if (prvIsValidCommand(&msg))\r
                                {\r
@@ -377,15 +587,21 @@ static portTASK_FUNCTION( TzCtrl, pvParameters )
                                }\r
                        }\r
 \r
-                       /* Send periodic data */\r
-                       bytes = 0;\r
-                       TRC_STREAM_PORT_PERIODIC_SEND_DATA(&bytes);\r
-                       /* If there was data sent (bytes != 0), immediately loop around and do all this again. Otherwise, step out of this loop and sleep for a while. */\r
-               }\r
-               while (bytes != 0);\r
+/* If the internal buffer is disabled, the COMMIT macro instead sends the data directly \r
+   from the "event functions" (using TRC_STREAM_PORT_WRITE_DATA). */                   \r
+#if (TRC_STREAM_PORT_USE_INTERNAL_BUFFER == 1)\r
+                       /* If there is a buffer page, this sends it to the streaming interface using TRC_STREAM_PORT_WRITE_DATA. */\r
+                       bytes = prvPagedEventBufferTransfer();\r
+#endif                 \r
+                       \r
+               /* If there was data sent or received (bytes != 0), loop around and repeat, if there is more data to send or receive.\r
+               Otherwise, step out of this loop and sleep for a while. */              \r
+               \r
+               } while (bytes != 0);\r
 \r
                prvCheckRecorderStatus();\r
-               vTaskDelay(TRC_CFG_CTRL_TASK_DELAY);    /* 10ms */\r
+\r
+               vTaskDelay(TRC_CFG_CTRL_TASK_DELAY);\r
        }\r
 }\r
 \r
@@ -398,11 +614,11 @@ static portTASK_FUNCTION( TzCtrl, pvParameters )
 int uiInEventGroupSetBitsFromISR = 0;\r
 \r
 /******************************************************************************\r
- * TraceObjectClassTable\r
+ * TraceQueueClassTable\r
  * Translates a FreeRTOS QueueType into trace objects classes (TRACE_CLASS_).\r
  * Has one entry for each QueueType, gives TRACE_CLASS ID.\r
  ******************************************************************************/\r
-traceObjectClass TraceObjectClassTable[5] = {\r
+traceObjectClass TraceQueueClassTable[5] = {\r
        TRACE_CLASS_QUEUE,\r
        TRACE_CLASS_MUTEX,\r
        TRACE_CLASS_SEMAPHORE,\r
@@ -410,6 +626,7 @@ traceObjectClass TraceObjectClassTable[5] = {
        TRACE_CLASS_MUTEX\r
 };\r
 \r
+#if (TRC_CFG_SCHEDULING_ONLY == 0)\r
 /*******************************************************************************\r
  * vTraceSetQueueName(void* object, const char* name)\r
  *\r
@@ -420,7 +637,7 @@ traceObjectClass TraceObjectClassTable[5] = {
  ******************************************************************************/\r
 void vTraceSetQueueName(void* object, const char* name)\r
 {\r
-       prvTraceSetObjectName(TRACE_GET_OBJECT_TRACE_CLASS(TRC_UNUSED, object), TRACE_GET_OBJECT_NUMBER(TRC_UNUSED, object), name);\r
+       prvTraceSetObjectName(TRACE_CLASS_QUEUE, TRACE_GET_OBJECT_NUMBER(QUEUE, object), name);\r
 }\r
 \r
 /*******************************************************************************\r
@@ -433,7 +650,7 @@ void vTraceSetQueueName(void* object, const char* name)
  ******************************************************************************/\r
 void vTraceSetSemaphoreName(void* object, const char* name)\r
 {\r
-       prvTraceSetObjectName(TRACE_GET_OBJECT_TRACE_CLASS(TRC_UNUSED, object), TRACE_GET_OBJECT_NUMBER(TRC_UNUSED, object), name);\r
+       prvTraceSetObjectName(TRACE_CLASS_SEMAPHORE, TRACE_GET_OBJECT_NUMBER(QUEUE, object), name);\r
 }\r
 \r
 /*******************************************************************************\r
@@ -446,34 +663,57 @@ void vTraceSetSemaphoreName(void* object, const char* name)
  ******************************************************************************/\r
 void vTraceSetMutexName(void* object, const char* name)\r
 {\r
-       prvTraceSetObjectName(TRACE_GET_OBJECT_TRACE_CLASS(TRC_UNUSED, object), TRACE_GET_OBJECT_NUMBER(TRC_UNUSED, object), name);\r
+       prvTraceSetObjectName(TRACE_CLASS_MUTEX, TRACE_GET_OBJECT_NUMBER(QUEUE, object), name);\r
 }\r
 \r
-void* prvTraceGetCurrentTaskHandle()\r
+#if (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X)\r
+/*******************************************************************************\r
+* vTraceSetEventGroupName(void* object, const char* name)\r
+*\r
+* Parameter object: pointer to the EventGroup that shall be named\r
+* Parameter name: the name to set (const string literal)\r
+*\r
+* Sets a name for EventGroup objects for display in Tracealyzer.\r
+******************************************************************************/\r
+void vTraceSetEventGroupName(void* object, const char* name)\r
 {\r
-       return xTaskGetCurrentTaskHandle();\r
+       prvTraceSetObjectName(TRACE_CLASS_EVENTGROUP, TRACE_GET_OBJECT_NUMBER(EVENTGROUP, object), name);\r
 }\r
+#endif /* (TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_8_X) */\r
 \r
-#if (TRC_CFG_FREERTOS_VERSION < TRC_FREERTOS_VERSION_8_X)\r
-traceHandle prvTraceGetObjectNumber(void* handle)\r
-{\r
-       return (traceHandle) ucQueueGetQueueNumber(handle);\r
-}\r
-#else /* For FreeRTOS v8 and later */\r
-traceHandle prvTraceGetObjectNumber(void* handle)\r
+#if (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0)\r
+/*******************************************************************************\r
+* vTraceSetStreamBufferName(void* object, const char* name)\r
+*\r
+* Parameter object: pointer to the StreamBuffer that shall be named\r
+* Parameter name: the name to set (const string literal)\r
+*\r
+* Sets a name for StreamBuffer objects for display in Tracealyzer.\r
+******************************************************************************/\r
+void vTraceSetStreamBufferName(void* object, const char* name)\r
 {\r
-       return (traceHandle) uxQueueGetQueueNumber(handle);\r
+       prvTraceSetObjectName(TRACE_CLASS_STREAMBUFFER, TRACE_GET_OBJECT_NUMBER(STREAMBUFFER, object), name);\r
 }\r
-#endif\r
 \r
-uint8_t prvTraceGetObjectType(void* handle)\r
+/*******************************************************************************\r
+* vTraceSetMessageBufferName(void* object, const char* name)\r
+*\r
+* Parameter object: pointer to the MessageBuffer that shall be named\r
+* Parameter name: the name to set (const string literal)\r
+*\r
+* Sets a name for MessageBuffer objects for display in Tracealyzer.\r
+******************************************************************************/\r
+void vTraceSetMessageBufferName(void* object, const char* name)\r
 {\r
-       return ucQueueGetQueueType(handle);\r
+       prvTraceSetObjectName(TRACE_CLASS_MESSAGEBUFFER, TRACE_GET_OBJECT_NUMBER(STREAMBUFFER, object), name);\r
 }\r
+#endif /* (TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS == 1 && TRC_CFG_FREERTOS_VERSION >= TRC_FREERTOS_VERSION_10_0_0) */\r
+\r
+#endif /* (TRC_CFG_SCHEDULING_ONLY == 0) */\r
 \r
-traceHandle prvTraceGetTaskNumber(void* handle)\r
+void* prvTraceGetCurrentTaskHandle()\r
 {\r
-       return (traceHandle)uxTaskGetTaskNumber(handle);\r
+       return xTaskGetCurrentTaskHandle();\r
 }\r
 \r
 /* Initialization of the object property table */\r
@@ -487,6 +727,8 @@ void vTraceInitObjectPropertyTable()
        RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[4] = TRC_CFG_NISR;\r
        RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[5] = TRC_CFG_NTIMER;\r
        RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[6] = TRC_CFG_NEVENTGROUP;\r
+       RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[7] = TRC_CFG_NSTREAMBUFFER;\r
+       RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[8] = TRC_CFG_NMESSAGEBUFFER;\r
        RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[0] = TRC_CFG_NAME_LEN_QUEUE;\r
        RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[1] = TRC_CFG_NAME_LEN_SEMAPHORE;\r
        RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[2] = TRC_CFG_NAME_LEN_MUTEX;\r
@@ -494,6 +736,8 @@ void vTraceInitObjectPropertyTable()
        RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[4] = TRC_CFG_NAME_LEN_ISR;\r
        RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[5] = TRC_CFG_NAME_LEN_TIMER;\r
        RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[6] = TRC_CFG_NAME_LEN_EVENTGROUP;\r
+       RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[7] = TRC_CFG_NAME_LEN_STREAMBUFFER;\r
+       RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[8] = TRC_CFG_NAME_LEN_MESSAGEBUFFER;\r
        RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[0] = PropertyTableSizeQueue;\r
        RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[1] = PropertyTableSizeSemaphore;\r
        RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[2] = PropertyTableSizeMutex;\r
@@ -501,6 +745,8 @@ void vTraceInitObjectPropertyTable()
        RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[4] = PropertyTableSizeISR;\r
        RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[5] = PropertyTableSizeTimer;\r
        RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[6] = PropertyTableSizeEventGroup;\r
+       RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[7] = PropertyTableSizeStreamBuffer;\r
+       RecorderDataPtr->ObjectPropertyTable.TotalPropertyBytesPerClass[8] = PropertyTableSizeMessageBuffer;\r
        RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[0] = StartIndexQueue;\r
        RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[1] = StartIndexSemaphore;\r
        RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[2] = StartIndexMutex;\r
@@ -508,6 +754,8 @@ void vTraceInitObjectPropertyTable()
        RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[4] = StartIndexISR;\r
        RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[5] = StartIndexTimer;\r
        RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[6] = StartIndexEventGroup;\r
+       RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[7] = StartIndexStreamBuffer;\r
+       RecorderDataPtr->ObjectPropertyTable.StartIndexOfClass[8] = StartIndexMessageBuffer;\r
        RecorderDataPtr->ObjectPropertyTable.ObjectPropertyTableSizeInBytes = TRACE_OBJECT_TABLE_SIZE;\r
 }\r
 \r
@@ -515,20 +763,24 @@ void vTraceInitObjectPropertyTable()
 void vTraceInitObjectHandleStack()\r
 {\r
        objectHandleStacks.indexOfNextAvailableHandle[0] = objectHandleStacks.lowestIndexOfClass[0] = 0;\r
-       objectHandleStacks.indexOfNextAvailableHandle[1] = objectHandleStacks.lowestIndexOfClass[1] = TRC_CFG_NQUEUE;\r
-       objectHandleStacks.indexOfNextAvailableHandle[2] = objectHandleStacks.lowestIndexOfClass[2] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE;\r
-       objectHandleStacks.indexOfNextAvailableHandle[3] = objectHandleStacks.lowestIndexOfClass[3] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX;\r
-       objectHandleStacks.indexOfNextAvailableHandle[4] = objectHandleStacks.lowestIndexOfClass[4] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX + TRC_CFG_NTASK;\r
-       objectHandleStacks.indexOfNextAvailableHandle[5] = objectHandleStacks.lowestIndexOfClass[5] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX + TRC_CFG_NTASK + TRC_CFG_NISR;\r
-       objectHandleStacks.indexOfNextAvailableHandle[6] = objectHandleStacks.lowestIndexOfClass[6] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX + TRC_CFG_NTASK + TRC_CFG_NISR + TRC_CFG_NTIMER;\r
-\r
-       objectHandleStacks.highestIndexOfClass[0] = TRC_CFG_NQUEUE - 1;\r
-       objectHandleStacks.highestIndexOfClass[1] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE - 1;\r
-       objectHandleStacks.highestIndexOfClass[2] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX - 1;\r
-       objectHandleStacks.highestIndexOfClass[3] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX + TRC_CFG_NTASK - 1;\r
-       objectHandleStacks.highestIndexOfClass[4] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX + TRC_CFG_NTASK + TRC_CFG_NISR - 1;\r
-       objectHandleStacks.highestIndexOfClass[5] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX + TRC_CFG_NTASK + TRC_CFG_NISR + TRC_CFG_NTIMER - 1;\r
-       objectHandleStacks.highestIndexOfClass[6] = TRC_CFG_NQUEUE + TRC_CFG_NSEMAPHORE + TRC_CFG_NMUTEX + TRC_CFG_NTASK + TRC_CFG_NISR + TRC_CFG_NTIMER + TRC_CFG_NEVENTGROUP - 1;\r
+       objectHandleStacks.indexOfNextAvailableHandle[1] = objectHandleStacks.lowestIndexOfClass[1] = (TRC_CFG_NQUEUE);\r
+       objectHandleStacks.indexOfNextAvailableHandle[2] = objectHandleStacks.lowestIndexOfClass[2] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE);\r
+       objectHandleStacks.indexOfNextAvailableHandle[3] = objectHandleStacks.lowestIndexOfClass[3] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX);\r
+       objectHandleStacks.indexOfNextAvailableHandle[4] = objectHandleStacks.lowestIndexOfClass[4] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK);\r
+       objectHandleStacks.indexOfNextAvailableHandle[5] = objectHandleStacks.lowestIndexOfClass[5] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR);\r
+       objectHandleStacks.indexOfNextAvailableHandle[6] = objectHandleStacks.lowestIndexOfClass[6] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER);\r
+       objectHandleStacks.indexOfNextAvailableHandle[7] = objectHandleStacks.lowestIndexOfClass[7] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP);\r
+       objectHandleStacks.indexOfNextAvailableHandle[8] = objectHandleStacks.lowestIndexOfClass[8] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) + (TRC_CFG_NSTREAMBUFFER);\r
+\r
+       objectHandleStacks.highestIndexOfClass[0] = (TRC_CFG_NQUEUE) - 1;\r
+       objectHandleStacks.highestIndexOfClass[1] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) - 1;\r
+       objectHandleStacks.highestIndexOfClass[2] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) - 1;\r
+       objectHandleStacks.highestIndexOfClass[3] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) - 1;\r
+       objectHandleStacks.highestIndexOfClass[4] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) - 1;\r
+       objectHandleStacks.highestIndexOfClass[5] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) - 1;\r
+       objectHandleStacks.highestIndexOfClass[6] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) - 1;\r
+       objectHandleStacks.highestIndexOfClass[7] = (TRC_CFG_NQUEUE) + (TRC_CFG_NSEMAPHORE) + (TRC_CFG_NMUTEX) + (TRC_CFG_NTASK) + (TRC_CFG_NISR) + (TRC_CFG_NTIMER) + (TRC_CFG_NEVENTGROUP) + (TRC_CFG_NSTREAMBUFFER) - 1;\r
+       objectHandleStacks.highestIndexOfClass[8] = (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) - 1;\r
 }\r
 \r
 /* Returns the "Not enough handles" error message for this object class */\r
@@ -550,39 +802,15 @@ const char* pszTraceGetErrorNotEnoughHandles(traceObjectClass objectclass)
                return "Not enough TIMER handles - increase TRC_CFG_NTIMER in trcSnapshotConfig.h";\r
        case TRACE_CLASS_EVENTGROUP:\r
                return "Not enough EVENTGROUP handles - increase TRC_CFG_NEVENTGROUP in trcSnapshotConfig.h";\r
+       case TRACE_CLASS_STREAMBUFFER:\r
+               return "Not enough STREAMBUFFER handles - increase TRC_CFG_NSTREAMBUFFER in trcSnapshotConfig.h";\r
+       case TRACE_CLASS_MESSAGEBUFFER:\r
+               return "Not enough MESSAGEBUFFER handles - increase TRC_CFG_NMESSAGEBUFFER in trcSnapshotConfig.h";\r
        default:\r
                return "pszTraceGetErrorHandles: Invalid objectclass!";\r
        }\r
 }\r
 \r
-/* Returns the exclude state of the object */\r
-uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, traceHandle handle)\r
-{\r
-       TRACE_ASSERT(objectclass < TRACE_NCLASSES, "prvIsObjectExcluded: objectclass >= TRACE_NCLASSES", 1);\r
-       TRACE_ASSERT(handle <= RecorderDataPtr->ObjectPropertyTable.NumberOfObjectsPerClass[objectclass], "prvIsObjectExcluded: Invalid value for handle", 1);\r
-\r
-       switch(objectclass)\r
-       {\r
-       case TRACE_CLASS_TASK:\r
-               return (uint8_t) TRACE_GET_TASK_FLAG_ISEXCLUDED(handle);\r
-       case TRACE_CLASS_SEMAPHORE:\r
-               return (uint8_t) TRACE_GET_SEMAPHORE_FLAG_ISEXCLUDED(handle);\r
-       case TRACE_CLASS_MUTEX:\r
-               return (uint8_t) TRACE_GET_MUTEX_FLAG_ISEXCLUDED(handle);\r
-       case TRACE_CLASS_QUEUE:\r
-               return (uint8_t) TRACE_GET_QUEUE_FLAG_ISEXCLUDED(handle);\r
-       case TRACE_CLASS_TIMER:\r
-               return (uint8_t) TRACE_GET_TIMER_FLAG_ISEXCLUDED(handle);\r
-       case TRACE_CLASS_EVENTGROUP:\r
-               return (uint8_t) TRACE_GET_EVENTGROUP_FLAG_ISEXCLUDED(handle);\r
-       }\r
-\r
-       prvTraceError("Invalid object class ID in prvIsObjectExcluded!");\r
-\r
-       /* Must never reach */\r
-       return 1;\r
-}\r
-\r
 /*******************************************************************************\r
  * prvTraceIsSchedulerSuspended\r
  *\r
@@ -590,9 +818,9 @@ uint8_t uiTraceIsObjectExcluded(traceObjectClass objectclass, traceHandle handle
  * task-switches from occurring. Only called from vTraceStoreISREnd.\r
  ******************************************************************************/\r
 #if (TRC_CFG_INCLUDE_ISR_TRACING == 1)\r
-unsigned char prvTraceIsSchedulerSuspended()\r
+unsigned char prvTraceIsSchedulerSuspended(void)\r
 {\r
-    /* Assumed to be available in FreeRTOS. According to the FreeRTOS docs,\r
+    /* Assumed to be available in FreeRTOS. According to the FreeRTOS docs, \r
        INCLUDE_xTaskGetSchedulerState or configUSE_TIMERS must be set to 1 in\r
        FreeRTOSConfig.h for this function to be available. */\r
 \r