RTX5: added event recording
diff --git a/CMSIS/RTOS2/RTX/Config/RTX_Config.h b/CMSIS/RTOS2/RTX/Config/RTX_Config.h
index 0bb374c..669476d 100644
--- a/CMSIS/RTOS2/RTX/Config/RTX_Config.h
+++ b/CMSIS/RTOS2/RTX/Config/RTX_Config.h
@@ -54,6 +54,46 @@
  
 //   </e>
  
+//   <h>Event Recording
+ 
+//     <q>Memory Management
+//     <i> Enables Memory Management events recording.
+#define OS_EVR_MEMORY               1
+ 
+//     <q>Kernel
+//     <i> Enables Kernel events recording.
+#define OS_EVR_KERNEL               1
+ 
+//     <q>Thread
+//     <i> Enables Thread events recording.
+#define OS_EVR_THREAD               1
+ 
+//     <q>Timer
+//     <i> Enables Timer events recording.
+#define OS_EVR_TIMER                1
+ 
+//     <q>Event Flags
+//     <i> Enables Event Flags events recording.
+#define OS_EVR_EVFLAGS              1
+ 
+//     <q>Mutex
+//     <i> Enables Mutex events recording.
+#define OS_EVR_MUTEX                1
+ 
+//     <q>Semaphore
+//     <i> Enables Semaphore events recording.
+#define OS_EVR_SEMAPHORE            1
+ 
+//     <q>Memory Pool
+//     <i> Enables Memory Pool events recording.
+#define OS_EVR_MEMPOOL              1
+ 
+//     <q>Message Queue
+//     <i> Enables Message Queue events recording.
+#define OS_EVR_MSGQUEUE             1
+ 
+//   </h>
+ 
 //   <o>ISR FIFO Queue 
 //      <4=>  4 entries    <8=>   8 entries   <12=>  12 entries   <16=>  16 entries
 //     <24=> 24 entries   <32=>  32 entries   <48=>  48 entries   <64=>  64 entries
diff --git a/CMSIS/RTOS2/RTX/Include/rtx_evr.h b/CMSIS/RTOS2/RTX/Include/rtx_evr.h
new file mode 100644
index 0000000..3ccb60e
--- /dev/null
+++ b/CMSIS/RTOS2/RTX/Include/rtx_evr.h
@@ -0,0 +1,1765 @@
+/*
+ * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * -----------------------------------------------------------------------------
+ *
+ * Project:     CMSIS-RTOS RTX
+ * Title:       RTX Event Recorder definitions
+ *
+ * -----------------------------------------------------------------------------
+ */
+
+#ifndef RTX_EVR_H_
+#define RTX_EVR_H_
+
+#include "cmsis_os2.h"                  // CMSIS RTOS API
+#include "rtx_os.h"                     // RTX OS definitions
+#include "RTX_Config.h"
+
+
+/// Extended Status codes
+#define osRtxErrorKernelNotReady        (-7)
+#define osRtxErrorKernelNotRunning      (-8)
+#define osRtxErrorInvalidControlBlock   (-9)
+#define osRtxErrorInvalidDataMemory     (-10)
+#define osRtxErrorInvalidThreadStack    (-11)
+#define osRtxErrorInvalidPriority       (-12)
+#define osRtxErrorThreadNotJoinable     (-13)
+#define osRtxErrorMutexNotOwned         (-14)
+#define osRtxErrorMutexNotLocked        (-15)
+#define osRtxErrorMutexLockLimit        (-16)
+#define osRtxErrorSemaphoreCountLimit   (-17)
+#define osRtxErrorTZ_InitContext_S      (-18)
+#define osRtxErrorTZ_AllocContext_S     (-19)
+#define osRtxErrorTZ_FreeContext_S      (-20)
+#define osRtxErrorTZ_LoadContext_S      (-21)
+#define osRtxErrorTZ_SaveContext_S      (-22)
+
+
+//  ==== Memory Events ====
+
+/**
+  \brief  Event on memory initialization (Op)
+  \param[in]  mem           pointer to memory pool.
+  \param[in]  size          size of a memory pool in bytes.
+  \param[in]  result        execution status: 1 - success, 0 - failure.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_INIT_DISABLE))
+extern void EvrRtxMemoryInit (void *mem, uint32_t size, uint32_t result);
+#else
+#define EvrRtxMemoryInit(mem, size, result)
+#endif
+
+/**
+  \brief  Event on memory allocate (Op)
+  \param[in]  mem           pointer to memory pool.
+  \param[in]  size          size of a memory block in bytes.
+  \param[in]  type          memory block type: 0 - generic, 1 - control block
+  \param[in]  block         pointer to allocated memory block or NULL in case of no memory is available.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_ALLOC_DISABLE))
+extern void EvrRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type, void *block);
+#else
+#define EvrRtxMemoryAlloc(mem, size, type, block)
+#endif
+
+/**
+  \brief  Event on memory free (Op)
+  \param[in]  mem           pointer to memory pool.
+  \param[in]  block         memory block to be returned to the memory pool.
+  \param[in]  result        execution status: 1 - success, 0 - failure.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_FREE_DISABLE))
+extern void EvrRtxMemoryFree (void *mem, void *block, uint32_t result);
+#else
+#define EvrRtxMemoryFree(mem, block, result)
+#endif
+
+/**
+  \brief  Event on memory block initialization (Op)
+  \param[in]  mp_info       memory pool info.
+  \param[in]  block_count   maximum number of memory blocks in memory pool.
+  \param[in]  block_size    size of a memory block in bytes.
+  \param[in]  block_mem     pointer to memory for block storage.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_BLOCK_INIT_DISABLE))
+extern void EvrRtxMemoryBlockInit (osRtxMpInfo_t *mp_info, uint32_t block_count, uint32_t block_size, void *block_mem);
+#else
+#define EvrRtxMemoryBlockInit(mp_info, block_count, block_size, block_mem)
+#endif
+
+/**
+  \brief  Event on memory block alloc (Op)
+  \param[in]  mp_info       memory pool info.
+  \param[in]  block         address of the allocated memory block or NULL in case of no memory is available.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_BLOCK_ALLOC_DISABLE))
+extern void EvrRtxMemoryBlockAlloc (osRtxMpInfo_t *mp_info, void *block);
+#else
+#define EvrRtxMemoryBlockAlloc(mp_info, block)
+#endif
+
+/**
+  \brief  Event on memory block free (Op)
+  \param[in]  mp_info       memory pool info.
+  \param[in]  block         address of the allocated memory block to be returned to the memory pool.
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_BLOCK_FREE_DISABLE))
+extern void EvrRtxMemoryBlockFree (osRtxMpInfo_t *mp_info, void *block, int32_t status);
+#else
+#define EvrRtxMemoryBlockFree(mp_info, block, status)
+#endif
+
+
+//  ==== Kernel Events ====
+
+/**
+  \brief  Event on RTOS kernel error (Error)
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_ERROR_DISABLE))
+extern void EvrRtxKernelError (int32_t status);
+#else
+#define EvrRtxKernelError(status)
+#endif
+
+/**
+  \brief  Event on RTOS kernel initialize (API)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_INITIALIZE_DISABLE))
+extern void EvrRtxKernelInitialize (void);
+#else
+#define EvrRtxKernelInitialize()
+#endif
+
+/**
+  \brief  Event on successful RTOS kernel initialize (Op)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_INITIALIZE_COMPLETED_DISABLE))
+extern void EvrRtxKernelInitializeCompleted (void);
+#else
+#define EvrRtxKernelInitializeCompleted()
+#endif
+
+/**
+  \brief  Event on RTOS kernel information retrieve (API)
+  \param[in]  version       pointer to buffer for retrieving version information.
+  \param[in]  id_buf        pointer to buffer for retrieving kernel identification string.
+  \param[in]  id_size       size of buffer for kernel identification string.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_INFO_DISABLE))
+extern void EvrRtxKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size);
+#else
+#define EvrRtxKernelGetInfo(version, id_buf, id_size)
+#endif
+
+/**
+  \brief  Event on successful RTOS kernel information retrieve (Op)
+  \param[in]  version       pointer to buffer for retrieving version information.
+  \param[in]  id_buf        pointer to buffer for retrieving kernel identification string.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_INFO_RETRIEVED_DISABLE))
+extern void EvrRtxKernelInfoRetrieved (osVersion_t *version, char *id_buf);
+#else
+#define EvrRtxKernelInfoRetrieved(version, id_buf)
+#endif
+
+/**
+  \brief  Event on current RTOS Kernel state retrieve (API)
+  \param[in]  state         current RTOS Kernel state.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_STATE_DISABLE))
+extern void EvrRtxKernelGetState (osKernelState_t state);
+#else
+#define EvrRtxKernelGetState(state)
+#endif
+
+/**
+  \brief  Event on RTOS Kernel scheduler start (API)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_START_DISABLE))
+extern void EvrRtxKernelStart (void);
+#else
+#define EvrRtxKernelStart()
+#endif
+
+/**
+  \brief  Event on successful RTOS Kernel scheduler start (Op)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_STARTED_DISABLE))
+extern void EvrRtxKernelStarted (void);
+#else
+#define EvrRtxKernelStarted()
+#endif
+
+/**
+  \brief  Event on RTOS Kernel scheduler lock (API)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_LOCK_DISABLE))
+extern void EvrRtxKernelLock (void);
+#else
+#define EvrRtxKernelLock()
+#endif
+
+/**
+  \brief  Event on successful RTOS Kernel scheduler lock (Op)
+  \param[in]  lock          previous lock state (1 - locked, 0 - not locked, error code if negative).
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_LOCKED_DISABLE))
+extern void EvrRtxKernelLocked (int32_t lock);
+#else
+#define EvrRtxKernelLocked(lock)
+#endif
+
+/**
+  \brief  Event on RTOS Kernel scheduler unlock (API)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_UNLOCK_DISABLE))
+extern void EvrRtxKernelUnlock (void);
+#else
+#define EvrRtxKernelUnlock()
+#endif
+
+/**
+  \brief  Event on successful RTOS Kernel scheduler unlock (Op)
+  \param[in]  lock          previous lock state (1 - locked, 0 - not locked, error code if negative).
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_UNLOCKED_DISABLE))
+extern void EvrRtxKernelUnlocked (int32_t lock);
+#else
+#define EvrRtxKernelUnlocked(lock)
+#endif
+
+/**
+  \brief  Event on RTOS Kernel scheduler lock state restore (API)
+  \param[in]  lock          lock state obtained by \ref osKernelLock or \ref osKernelUnlock.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_RESTORE_LOCK_DISABLE))
+extern void EvrRtxKernelRestoreLock (int32_t lock);
+#else
+#define EvrRtxKernelRestoreLock(lock)
+#endif
+
+/**
+  \brief  Event on successful RTOS Kernel scheduler lock state restore (Op)
+  \param[in]  lock          new lock state (1 - locked, 0 - not locked, error code if negative).
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_LOCK_RESTORED_DISABLE))
+extern void EvrRtxKernelLockRestored (int32_t lock);
+#else
+#define EvrRtxKernelLockRestored(lock)
+#endif
+
+/**
+  \brief  Event on RTOS Kernel scheduler suspend (API)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_SUSPEND_DISABLE))
+extern void EvrRtxKernelSuspend (void);
+#else
+#define EvrRtxKernelSuspend()
+#endif
+
+/**
+  \brief  Event on successful RTOS Kernel scheduler suspend (Op)
+  \param[in]  sleep_ticks   time in ticks, for how long the system can sleep or power-down.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_SUSPENDED_DISABLE))
+extern void EvrRtxKernelSuspended (uint32_t sleep_ticks);
+#else
+#define EvrRtxKernelSuspended(sleep_ticks)
+#endif
+
+/**
+  \brief  Event on RTOS Kernel scheduler resume (API)
+  \param[in]  sleep_ticks   time in ticks for how long the system was in sleep or power-down mode.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_RESUME_DISABLE))
+extern void EvrRtxKernelResume (uint32_t sleep_ticks);
+#else
+#define EvrRtxKernelResume(sleep_ticks)
+#endif
+
+/**
+  \brief  Event on successful RTOS Kernel scheduler resume (Op)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_RESUMED_DISABLE))
+extern void EvrRtxKernelResumed (void);
+#else
+#define EvrRtxKernelResumed()
+#endif
+
+/**
+  \brief  Event on RTOS kernel tick count retrieve (API)
+  \param[in]  count         RTOS kernel current tick count.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_TICK_COUNT_DISABLE))
+extern void EvrRtxKernelGetTickCount (uint64_t count);
+#else
+#define EvrRtxKernelGetTickCount(count)
+#endif
+
+/**
+  \brief  Event on RTOS kernel tick frequency retrieve (API)
+  \param[in]  freq          frequency of the kernel tick.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_TICK_FREQ_DISABLE))
+extern void EvrRtxKernelGetTickFreq (uint32_t freq);
+#else
+#define EvrRtxKernelGetTickFreq(freq)
+#endif
+
+/**
+  \brief  Event on RTOS kernel system timer count retrieve (API)
+  \param[in]  count         RTOS kernel current system timer count as 32-bit value.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_SYS_TIMER_COUNT_DISABLE))
+extern void EvrRtxKernelGetSysTimerCount (uint32_t count);
+#else
+#define EvrRtxKernelGetSysTimerCount(count)
+#endif
+
+/**
+  \brief  Event on RTOS kernel system timer frequency retrieve (API)
+  \param[in]  freq          frequency of the system timer.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_SYS_TIMER_FREQ_DISABLE))
+extern void EvrRtxKernelGetSysTimerFreq (uint32_t freq);
+#else
+#define EvrRtxKernelGetSysTimerFreq(freq)
+#endif
+
+
+//  ==== Thread Events ====
+
+/**
+  \brief  Event on thread error (Error)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId or NULL when ID is unknown.
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_ERROR_DISABLE))
+extern void EvrRtxThreadError (osThreadId_t thread_id, int32_t status);
+#else
+#define EvrRtxThreadError(thread_id, status)
+#endif
+
+/**
+  \brief  Event on thread create and intialize (API)
+  \param[in]  func          thread function.
+  \param[in]  argument      pointer that is passed to the thread function as start argument.
+  \param[in]  attr          thread attributes.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_NEW_DISABLE))
+extern void EvrRtxThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);
+#else
+#define EvrRtxThreadNew(func, argument, attr)
+#endif
+
+/**
+  \brief  Event on successful thread create (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_CREATED_DISABLE))
+extern void EvrRtxThreadCreated (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadCreated(thread_id)
+#endif
+
+/**
+  \brief  Event on thread name retrieve (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  name          pointer to thread object name
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_NAME_DISABLE))
+extern void EvrRtxThreadGetName (osThreadId_t thread_id, const char *name);
+#else
+#define EvrRtxThreadGetName(thread_id, name)
+#endif
+
+/**
+  \brief  Event on current running thread ID retrieve (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_ID_DISABLE))
+extern void EvrRtxThreadGetId (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadGetId(thread_id)
+#endif
+
+/**
+  \brief  Event on thread state retrieve (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  state         current thread state of the specified thread.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_STATE_DISABLE))
+extern void EvrRtxThreadGetState (osThreadId_t thread_id, osThreadState_t state);
+#else
+#define EvrRtxThreadGetState(thread_id, state)
+#endif
+
+/**
+  \brief  Event on thread stack size retrieve (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  stack_size    stack size in bytes.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_STACK_SIZE_DISABLE))
+extern void EvrRtxThreadGetStackSize (osThreadId_t thread_id, uint32_t stack_size);
+#else
+#define EvrRtxThreadGetStackSize(thread_id, stack_size)
+#endif
+
+/**
+  \brief  Event on available stack space retrieve (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  stack_space   remaining stack space in bytes.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_STACK_SPACE_DISABLE))
+extern void EvrRtxThreadGetStackSpace (osThreadId_t thread_id, uint32_t stack_space);
+#else
+#define EvrRtxThreadGetStackSpace(thread_id, stack_space)
+#endif
+
+/**
+  \brief  Event on thread priority set (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  priority      new priority value for the thread function.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SET_PRIORITY_DISABLE))
+extern void EvrRtxThreadSetPriority (osThreadId_t thread_id, osPriority_t priority);
+#else
+#define EvrRtxThreadSetPriority(thread_id, priority)
+#endif
+
+/**
+  \brief  Event on thread priority retrieve (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  priority      current priority value of the specified thread.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_PRIORITY_DISABLE))
+extern void EvrRtxThreadGetPriority (osThreadId_t thread_id, osPriority_t priority);
+#else
+#define EvrRtxThreadGetPriority(thread_id, priority)
+#endif
+
+/**
+  \brief  Event on thread yield (API)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_YIELD_DISABLE))
+extern void EvrRtxThreadYield (void);
+#else
+#define EvrRtxThreadYield()
+#endif
+
+/**
+  \brief  Event on thread suspend (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SUSPEND_DISABLE))
+extern void EvrRtxThreadSuspend (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadSuspend(thread_id)
+#endif
+
+/**
+  \brief  Event on successful thread suspend (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SUSPENDED_DISABLE))
+extern void EvrRtxThreadSuspended (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadSuspended(thread_id)
+#endif
+
+/**
+  \brief  Event on thread resume (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_RESUME_DISABLE))
+extern void EvrRtxThreadResume (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadResume(thread_id)
+#endif
+
+/**
+  \brief  Event on successful thread resume (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_RESUMED_DISABLE))
+extern void EvrRtxThreadResumed (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadResumed(thread_id)
+#endif
+
+/**
+  \brief  Event on thread detach (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DETACH_DISABLE))
+extern void EvrRtxThreadDetach (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadDetach(thread_id)
+#endif
+
+/**
+  \brief  Event on successful thread detach (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DETACHED_DISABLE))
+extern void EvrRtxThreadDetached (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadDetached(thread_id)
+#endif
+
+/**
+  \brief  Event on thread join (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_JOIN_DISABLE))
+extern void EvrRtxThreadJoin (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadJoin(thread_id)
+#endif
+
+/**
+  \brief  Event on pending thread join (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_JOIN_PENDING_DISABLE))
+extern void EvrRtxThreadJoinPending (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadJoinPending(thread_id)
+#endif
+
+/**
+  \brief  Event on successful thread join (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_JOINED_DISABLE))
+extern void EvrRtxThreadJoined (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadJoined(thread_id)
+#endif
+
+/**
+  \brief  Event on thread execution block (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_BLOCKED_DISABLE))
+extern void EvrRtxThreadBlocked (osThreadId_t thread_id, uint32_t timeout);
+#else
+#define EvrRtxThreadBlocked(thread, timeout)
+#endif
+
+/**
+  \brief  Event on blocked thread release (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  ret_val       extended execution status of the thread.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_UNBLOCKED_DISABLE))
+extern void EvrRtxThreadUnblocked (osThreadId_t thread_id, uint32_t ret_val);
+#else
+#define EvrRtxThreadUnblocked(thread, ret_val)
+#endif
+
+/**
+  \brief  Event on current running thread switch (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SWITCH_DISABLE))
+extern void EvrRtxThreadSwitch (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadSwitch(thread)
+#endif
+
+/**
+  \brief  Event on thread exit (API)
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_EXIT_DISABLE))
+extern void EvrRtxThreadExit (void);
+#else
+#define EvrRtxThreadExit()
+#endif
+
+/**
+  \brief  Event on thread terminate (API)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_TERMINATE_DISABLE))
+extern void EvrRtxThreadTerminate (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadTerminate(thread_id)
+#endif
+
+/**
+  \brief  Event on successful thread terminate (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DESTROYED_DISABLE))
+extern void EvrRtxThreadDestroyed (osThreadId_t thread_id);
+#else
+#define EvrRtxThreadDestroyed(thread_id)
+#endif
+
+/**
+  \brief  Event on active thread count retrieve (API)
+  \param[in]  count         number of active threads.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_COUNT_DISABLE))
+extern void EvrRtxThreadGetCount (uint32_t count);
+#else
+#define EvrRtxThreadGetCount(count)
+#endif
+
+/**
+  \brief  Event on active threads enumerate (API)
+  \param[in]  thread_array  pointer to array for retrieving thread IDs.
+  \param[in]  array_items   maximum number of items in array for retrieving thread IDs.
+  \count[in]  count         number of enumerated threads.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_ENUMERATE_DISABLE))
+extern void EvrRtxThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items, uint32_t count);
+#else
+#define EvrRtxThreadEnumerate(thread_array, array_items, count)
+#endif
+
+/**
+  \brief  Event on thread flags set (API)
+  \param[in]   thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]   flags         flags of the thread that shall be set.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_SET_DISABLE))
+extern void EvrRtxThreadFlagsSet (osThreadId_t thread_id, int32_t flags);
+#else
+#define EvrRtxThreadFlagsSet(thread_id, flags)
+#endif
+
+/**
+  \brief  Event on successful thread flags set (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+  \param[in]  thread_flags  thread flags after setting or error code if negative.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_SET_DONE_DISABLE))
+extern void EvrRtxThreadFlagsSetDone (osThreadId_t thread_id, int32_t thread_flags);
+#else
+#define EvrRtxThreadFlagsSetDone(thread_id, thread_flags)
+#endif
+
+/**
+  \brief  Event on thread flags clear (API)
+  \param[in]  flags         flags of the thread that shall be cleared.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_CLEAR_DISABLE))
+extern void EvrRtxThreadFlagsClear (int32_t flags);
+#else
+#define EvrRtxThreadFlagsClear(flags)
+#endif
+
+/**
+  \brief  Event on successful thread flags clear (Op)
+  \param[in]  thread_flags  thread flags before clearing or error code if negative.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_CLEAR_DONE_DISABLE))
+extern void EvrRtxThreadFlagsClearDone (int32_t thread_flags);
+#else
+#define EvrRtxThreadFlagsClearDone(thread_flags)
+#endif
+
+/**
+  \brief  Event on thread flags retrieve (API)
+  \param[in]  thread_flags  current thread flags.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_GET_DISABLE))
+extern void EvrRtxThreadFlagsGet (int32_t thread_flags);
+#else
+#define EvrRtxThreadFlagsGet(thread_flags)
+#endif
+
+/**
+  \brief  Event on wait for thread flags (API)
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_DISABLE))
+extern void EvrRtxThreadFlagsWait (int32_t flags, uint32_t options, uint32_t timeout);
+#else
+#define EvrRtxThreadFlagsWait(flags, options, timeout)
+#endif
+
+/**
+  \brief  Event on pending wait for thread flags (Op)
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_PENDING_DISABLE))
+extern void EvrRtxThreadFlagsWaitPending (int32_t flags, uint32_t options, uint32_t timeout);
+#else
+#define EvrRtxThreadFlagsWaitPending(flags, options, timeout)
+#endif
+
+/**
+  \brief  Event on successful wait for thread flags (Op)
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+  \param[in]  thread_flags  thread flags before clearing
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_COMPLETED_DISABLE))
+extern void EvrRtxThreadFlagsWaitCompleted (int32_t flags, uint32_t options, int32_t thread_flags);
+#else
+#define EvrRtxThreadFlagsWaitCompleted(flags, options, thread_flags)
+#endif
+
+/**
+  \brief  Event on unsuccessful wait for thread flags (Op)
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_NOT_COMPLETED_DISABLE))
+extern void EvrRtxThreadFlagsWaitNotCompleted (int32_t flags, uint32_t options);
+#else
+#define EvrRtxThreadFlagsWaitNotCompleted(flags, options)
+#endif
+
+/**
+  \brief  Event on wait for timeout (API)
+  \param[in]  ticks         \ref CMSIS_RTOS_TimeOutValue "time ticks" value
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DELAY_DISABLE))
+extern void EvrRtxThreadDelay (uint32_t ticks);
+#else
+#define EvrRtxThreadDelay(ticks)
+#endif
+
+/**
+  \brief  Event on wait until specified time (API)
+  \param[in]  ticks         absolute time in ticks
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DELAY_UNTIL_DISABLE))
+extern void EvrRtxThreadDelayUntil (uint64_t ticks);
+#else
+#define EvrRtxThreadDelayUntil(ticks)
+#endif
+
+
+//  ==== Timer Events ====
+
+/**
+  \brief  Event on timer error (Error)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew or NULL when ID is unknown.
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_ERROR_DISABLE))
+extern void EvrRtxTimerError (osTimerId_t timer_id, int32_t status);
+#else
+#define EvrRtxTimerError(timer_id, status);
+#endif
+
+/**
+  \brief  Event on timer callback call (Op)
+  \param[in]  func          start address of a timer call back function.
+  \param[in]  argument      argument to the timer call back function.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_CALLBACK_DISABLE))
+extern void EvrRtxTimerCallback (osTimerFunc_t func, void *argument);
+#else
+#define EvrRtxTimerCallback(func, argument);
+#endif
+
+/**
+  \brief  Event on timer create and initialize (API)
+  \param[in]  func          start address of a timer call back function.
+  \param[in]  type          osTimerOnce for one-shot or osTimerPeriodic for periodic behavior.
+  \param[in]  argument      argument to the timer call back function.
+  \param[in]  attr          timer attributes.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_NEW_DISABLE))
+extern void EvrRtxTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);
+#else
+#define EvrRtxTimerNew(func, type, argument, attr);
+#endif
+
+/**
+  \brief  Event on successful timer create (Op)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_CREATED_DISABLE))
+extern void EvrRtxTimerCreated (osTimerId_t timer_id);
+#else
+#define EvrRtxTimerCreated(timer_id);
+#endif
+
+/**
+  \brief  Event on timer name retrieve (API)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+  \param[in]  name          pointer to timer object name.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_GET_NAME_DISABLE))
+extern void EvrRtxTimerGetName (osTimerId_t timer_id, const char *name);
+#else
+#define EvrRtxTimerGetName(timer_id, name);
+#endif
+
+/**
+  \brief  Event on timer start (API)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+  \param[in]  ticks         \ref CMSIS_RTOS_TimeOutValue "time ticks" value of the timer.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_START_DISABLE))
+extern void EvrRtxTimerStart (osTimerId_t timer_id, uint32_t ticks);
+#else
+#define EvrRtxTimerStart(timer_id, ticks);
+#endif
+
+/**
+  \brief  Event on successful timer start (Op)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_STARTED_DISABLE))
+extern void EvrRtxTimerStarted (osTimerId_t timer_id);
+#else
+#define EvrRtxTimerStarted(timer_id);
+#endif
+
+/**
+  \brief  Event on timer stop (API)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_STOP_DISABLE))
+extern void EvrRtxTimerStop (osTimerId_t timer_id);
+#else
+#define EvrRtxTimerStop(timer_id);
+#endif
+
+/**
+  \brief  Event on successful timer stop (Op)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_STOPPED_DISABLE))
+extern void EvrRtxTimerStopped (osTimerId_t timer_id);
+#else
+#define EvrRtxTimerStopped(timer_id);
+#endif
+
+/**
+  \brief  Event on timer running state check (API)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+  \param[in]  running       running state: 0 not running, 1 running
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_IS_RUNNING_DISABLE))
+extern void EvrRtxTimerIsRunning (osTimerId_t timer_id, uint32_t running);
+#else
+#define EvrRtxTimerIsRunning(timer_id, running);
+#endif
+
+/**
+  \brief  Event on timer delete (API)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_DELETE_DISABLE))
+extern void EvrRtxTimerDelete (osTimerId_t timer_id);
+#else
+#define EvrRtxTimerDelete(timer_id);
+#endif
+
+/**
+  \brief  Event on successful timer delete (Op)
+  \param[in]  timer_id      timer ID obtained by \ref osTimerNew
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_DESTROYED_DISABLE))
+extern void EvrRtxTimerDestroyed (osTimerId_t timer_id);
+#else
+#define EvrRtxTimerDestroyed(timer_id);
+#endif
+
+
+//  ==== Event Flags Events ====
+
+/**
+  \brief  Event on event flags error (Error)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew or NULL when ID is unknown.
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_ERROR_DISABLE))
+extern void EvrRtxEventFlagsError (osEventFlagsId_t ef_id, int32_t status);
+#else
+#define EvrRtxEventFlagsError(ef_id, status)
+#endif
+
+/**
+  \brief  Event on event flags create and initialize (API)
+  \param[in]  attr          event flags attributes
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_NEW_DISABLE))
+extern void EvrRtxEventFlagsNew (const osEventFlagsAttr_t *attr);
+#else
+#define EvrRtxEventFlagsNew(attr)
+#endif
+
+/**
+  \brief  Event on successful event flags create (Op)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_CREATED_DISABLE))
+extern void EvrRtxEventFlagsCreated (osEventFlagsId_t ef_id);
+#else
+#define EvrRtxEventFlagsCreated(ef_id)
+#endif
+
+/**
+  \brief  Event on event flags name retrieve (API)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  name          pointer to event flags object name.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_GET_NAME_DISABLE))
+extern void EvrRtxEventFlagsGetName (osEventFlagsId_t ef_id, const char *name);
+#else
+#define EvrRtxEventFlagsGetName(ef_id, name)
+#endif
+
+/**
+  \brief  Event on event flags set (API)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  flags         flags that shall be set.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_SET_DISABLE))
+extern void EvrRtxEventFlagsSet (osEventFlagsId_t ef_id, int32_t flags);
+#else
+#define EvrRtxEventFlagsSet(ef_id, flags)
+#endif
+
+/**
+  \brief  Event on successful event flags set (Op)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  event_flags   event flags after setting or error code if negative.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_SET_DONE_DISABLE))
+extern void EvrRtxEventFlagsSetDone (osEventFlagsId_t ef_id, int32_t event_flags);
+#else
+#define EvrRtxEventFlagsSetDone(ef_id, event_flags)
+#endif
+
+/**
+  \brief  Event on event flags clear (API)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  flags         flags that shall be cleared.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_CLEAR_DISABLE))
+extern void EvrRtxEventFlagsClear (osEventFlagsId_t ef_id, int32_t flags);
+#else
+#define EvrRtxEventFlagsClear(ef_id, flags)
+#endif
+
+/**
+  \brief  Event on successful event flags clear (Op)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  event_flags   event flags before clearing or error code if negative.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_CLEAR_DONE_DISABLE))
+extern void EvrRtxEventFlagsClearDone (osEventFlagsId_t ef_id, int32_t event_flags);
+#else
+#define EvrRtxEventFlagsClearDone(ef_id, event_flags)
+#endif
+
+/**
+  \brief  Event on event flags retrieve (API)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  event_flags   current event flags.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_GET_DISABLE))
+extern void EvrRtxEventFlagsGet (osEventFlagsId_t ef_id, int32_t event_flags);
+#else
+#define EvrRtxEventFlagsGet(ef_id, event_flags)
+#endif
+
+/**
+  \brief  Event on wait for event flags (API)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_DISABLE))
+extern void EvrRtxEventFlagsWait (osEventFlagsId_t ef_id, int32_t flags, uint32_t options, uint32_t timeout);
+#else
+#define EvrRtxEventFlagsWait(ef_id, flags, options, timeout)
+#endif
+
+/**
+  \brief  Event on pending wait for event flags (Op)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_PENDING_DISABLE))
+extern void EvrRtxEventFlagsWaitPending (osEventFlagsId_t ef_id, int32_t flags, uint32_t options, uint32_t timeout);
+#else
+#define EvrRtxEventFlagsWaitPending(ef_id, flags, options, timeout)
+#endif
+
+/**
+  \brief  Event on successful wait for event flags (Op)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+  \param[in]  event_flags   event flags before clearing or 0 if specified flags have not been set.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_COMPLETED_DISABLE))
+extern void EvrRtxEventFlagsWaitCompleted (osEventFlagsId_t ef_id, int32_t flags, uint32_t options, int32_t event_flags);
+#else
+#define EvrRtxEventFlagsWaitCompleted(ef_id, flags, options, event_flags)
+#endif
+
+/**
+  \brief  Event on unsuccessful wait for event flags (Op)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+  \param[in]  flags         flags to wait for.
+  \param[in]  options       flags options (osFlagsXxxx).
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_NOT_COMPLETED_DISABLE))
+extern void EvrRtxEventFlagsWaitNotCompleted (osEventFlagsId_t ef_id, int32_t flags, uint32_t options);
+#else
+#define EvrRtxEventFlagsWaitNotCompleted(ef_id, flags, options)
+#endif
+
+/**
+  \brief  Event on event flags delete (API)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_DELETE_DISABLE))
+extern void EvrRtxEventFlagsDelete (osEventFlagsId_t ef_id);
+#else
+#define EvrRtxEventFlagsDelete(ef_id)
+#endif
+
+/**
+  \brief  Event on successful event flags delete (Op)
+  \param[in]  ef_id         event flags ID obtained by \ref osEventFlagsNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_DESTROYED_DISABLE))
+extern void EvrRtxEventFlagsDestroyed (osEventFlagsId_t ef_id);
+#else
+#define EvrRtxEventFlagsDestroyed(ef_id)
+#endif
+
+
+//  ==== Mutex Events ====
+
+/**
+  \brief  Event on mutex error (Error)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew or NULL when ID is unknown.
+  \param[in]  status    extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ERROR_DISABLE))
+extern void EvrRtxMutexError (osMutexId_t mutex_id, int32_t status);
+#else
+#define EvrRtxMutexError(mutex_id, status)
+#endif
+
+/**
+  \brief  Event on mutex create and initialize (API)
+  \param[in]  attr      mutex attributes
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_NEW_DISABLE))
+extern void EvrRtxMutexNew (const osMutexAttr_t *attr);
+#else
+#define EvrRtxMutexNew(attr)
+#endif
+
+/**
+  \brief  Event on successful mutex create (Op)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_CREATED_DISABLE))
+extern void EvrRtxMutexCreated (osMutexId_t mutex_id);
+#else
+#define EvrRtxMutexCreated(mutex_id)
+#endif
+
+/**
+  \brief  Event on mutex name retrieve (API)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+  \param[in]  name      pointer to mutex object name
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_GET_NAME_DISABLE))
+extern void EvrRtxMutexGetName (osMutexId_t mutex_id, const char *name);
+#else
+#define EvrRtxMutexGetName(mutex_id, name)
+#endif
+
+/**
+  \brief  Event on mutex acquire (API)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+  \param[in]  timeout   \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ACQUIRE_DISABLE))
+extern void EvrRtxMutexAcquire (osMutexId_t mutex_id, uint32_t timeout);
+#else
+#define EvrRtxMutexAcquire(mutex_id, timeout)
+#endif
+
+/**
+  \brief  Event on pending mutex acquire (Op)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+  \param[in]  timeout   \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ACQUIRE_PENDING_DISABLE))
+extern void EvrRtxMutexAcquirePending (osMutexId_t mutex_id, uint32_t timeout);
+#else
+#define EvrRtxMutexAcquirePending(mutex_id, timeout);
+#endif
+
+/**
+  \brief  Event on successful mutex acquire (Op)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+  \param[in]  lock      current number of times mutex object is locked
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ACQUIRED_DISABLE))
+extern void EvrRtxMutexAcquired (osMutexId_t mutex_id, uint32_t lock);
+#else
+#define EvrRtxMutexAcquired(mutex_id, lock)
+#endif
+
+/**
+  \brief  Event on unsuccessful mutex acquire (Op)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_NOT_ACQUIRED_DISABLE))
+extern void EvrRtxMutexNotAcquired (osMutexId_t mutex_id);
+#else
+#define EvrRtxMutexNotAcquired(mutex_id)
+#endif
+
+/**
+  \brief  Event on mutex release (API)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_RELEASE_DISABLE))
+extern void EvrRtxMutexRelease (osMutexId_t mutex_id);
+#else
+#define EvrRtxMutexRelease(mutex_id)
+#endif
+
+/**
+  \brief  Event on successful mutex release (Op)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+  \param[in]  lock      current number of times mutex object is locked
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_RELEASED_DISABLE))
+extern void EvrRtxMutexReleased (osMutexId_t mutex_id, uint32_t lock);
+#else
+#define EvrRtxMutexReleased(mutex_id, lock)
+#endif
+
+/**
+  \brief  Event on mutex owner retrieve (API)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+  \param[in]  thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_GET_OWNER_DISABLE))
+extern void EvrRtxMutexGetOwner (osMutexId_t mutex_id, osThreadId_t thread_id);
+#else
+#define EvrRtxMutexGetOwner(mutex_id, thread_id)
+#endif
+
+/**
+  \brief  Event on mutex delete (API)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_DELETE_DISABLE))
+extern void EvrRtxMutexDelete (osMutexId_t mutex_id);
+#else
+#define EvrRtxMutexDelete(mutex_id)
+#endif
+
+/**
+  \brief  Event on successful mutex delete (Op)
+  \param[in]  mutex_id  mutex ID obtained by \ref osMutexNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_DESTROYED_DISABLE))
+extern void EvrRtxMutexDestroyed (osMutexId_t mutex_id);
+#else
+#define EvrRtxMutexDestroyed(mutex_id)
+#endif
+
+
+//  ==== Semaphore Events ====
+
+/**
+  \brief  Event on semaphore error (Error)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew or NULL when ID is unknown.
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ERROR_DISABLE))
+extern void EvrRtxSemaphoreError (osSemaphoreId_t semaphore_id, int32_t status);
+#else
+#define EvrRtxSemaphoreError(semaphore_id, status)
+#endif
+
+/**
+  \brief  Event on semaphore create and initialize (API)
+  \param[in]  max_count     maximum number of available tokens.
+  \param[in]  initial_count initial number of available tokens.
+  \param[in]  attr          semaphore attributes.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_NEW_DISABLE))
+extern void EvrRtxSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr);
+#else
+#define EvrRtxSemaphoreNew(max_count, initial_count, attr)
+#endif
+
+/**
+  \brief  Event on successful semaphore create (Op)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_CREATED_DISABLE))
+extern void EvrRtxSemaphoreCreated (osSemaphoreId_t semaphore_id);
+#else
+#define EvrRtxSemaphoreCreated(semaphore_id)
+#endif
+
+/**
+  \brief  Event on semaphore name retrieve (API)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+  \param[in]  name          pointer to semaphore object name.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_GET_NAME_DISABLE))
+extern void EvrRtxSemaphoreGetName (osSemaphoreId_t semaphore_id, const char *name);
+#else
+#define EvrRtxSemaphoreGetName(semaphore_id, name)
+#endif
+
+/**
+  \brief  Event on semaphore acquire (API)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ACQUIRE_DISABLE))
+extern void EvrRtxSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout);
+#else
+#define EvrRtxSemaphoreAcquire(semaphore_id, timeout)
+#endif
+
+/**
+  \brief  Event on pending semaphore acquire (Op)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ACQUIRE_PENDING_DISABLE))
+extern void EvrRtxSemaphoreAcquirePending (osSemaphoreId_t semaphore_id, uint32_t timeout);
+#else
+#define EvrRtxSemaphoreAcquirePending(semaphore_id, timeout);
+#endif
+
+/**
+  \brief  Event on successful semaphore acquire (Op)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ACQUIRED_DISABLE))
+extern void EvrRtxSemaphoreAcquired (osSemaphoreId_t semaphore_id);
+#else
+#define EvrRtxSemaphoreAcquired(semaphore_id)
+#endif
+
+/**
+  \brief  Event on unsuccessful semaphore acquire (Op)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_NOT_ACQUIRED_DISABLE))
+extern void EvrRtxSemaphoreNotAcquired (osSemaphoreId_t semaphore_id);
+#else
+#define EvrRtxSemaphoreNotAcquired(semaphore_id)
+#endif
+
+/**
+  \brief  Event on semaphore release (API)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_RELEASE_DISABLE))
+extern void EvrRtxSemaphoreRelease (osSemaphoreId_t semaphore_id);
+#else
+#define EvrRtxSemaphoreRelease(semaphore_id)
+#endif
+
+/**
+  \brief  Event on successful semaphore release (Op)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_RELEASED_DISABLE))
+extern void EvrRtxSemaphoreReleased (osSemaphoreId_t semaphore_id);
+#else
+#define EvrRtxSemaphoreReleased(semaphore_id)
+#endif
+
+/**
+  \brief  Event on semaphore token count retrieval (API)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+  \param[in]  count         current number of available tokens.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_GET_COUNT_DISABLE))
+extern void EvrRtxSemaphoreGetCount (osSemaphoreId_t semaphore_id, uint32_t count);
+#else
+#define EvrRtxSemaphoreGetCount(semaphore_id, count)
+#endif
+
+/**
+  \brief  Event on semaphore delete (API)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_DELETE_DISABLE))
+extern void EvrRtxSemaphoreDelete (osSemaphoreId_t semaphore_id);
+#else
+#define EvrRtxSemaphoreDelete(semaphore_id)
+#endif
+
+/**
+  \brief  Event on successful semaphore delete (Op)
+  \param[in]  semaphore_id  semaphore ID obtained by \ref osSemaphoreNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_DESTROYED_DISABLE))
+extern void EvrRtxSemaphoreDestroyed (osSemaphoreId_t semaphore_id);
+#else
+#define EvrRtxSemaphoreDestroyed(semaphore_id)
+#endif
+
+
+//  ==== Memory Pool Events ====
+
+/**
+  \brief  Event on memory pool error (Error)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew or NULL when ID is unknown.
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ERROR_DISABLE))
+extern void EvrRtxMemoryPoolError (osMemoryPoolId_t mp_id, int32_t status);
+#else
+#define EvrRtxMemoryPoolError(mp_id, status)
+#endif
+
+/**
+  \brief  Event on memory pool create and initialize (API)
+  \param[in]  block_count   maximum number of memory blocks in memory pool.
+  \param[in]  block_size    memory block size in bytes.
+  \param[in]  attr          memory pool attributes; NULL: default values.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_NEW_DISABLE))
+extern void EvrRtxMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr);
+#else
+#define EvrRtxMemoryPoolNew(block_count, block_size, attr)
+#endif
+
+/**
+  \brief  Event on successful memory pool create (Op)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_CREATED_DISABLE))
+extern void EvrRtxMemoryPoolCreated (osMemoryPoolId_t mp_id);
+#else
+#define EvrRtxMemoryPoolCreated(mp_id)
+#endif
+
+/**
+  \brief  Event on memory pool name retrieve (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  name          pointer to memory pool object name.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_NAME_DISABLE))
+extern void EvrRtxMemoryPoolGetName (osMemoryPoolId_t mp_id, const char *name);
+#else
+#define EvrRtxMemoryPoolGetName(mp_id, name)
+#endif
+
+/**
+  \brief  Event on memory pool allocation (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOC_DISABLE))
+extern void EvrRtxMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout);
+#else
+#define EvrRtxMemoryPoolAlloc(mp_id, timeout)
+#endif
+
+/**
+  \brief  Event on pending memory pool allocation (Op)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOC_PENDING_DISABLE))
+extern void EvrRtxMemoryPoolAllocPending (osMemoryPoolId_t mp_id, uint32_t timeout);
+#else
+#define EvrRtxMemoryPoolAllocPending(mp_id, timeout)
+#endif
+
+/**
+  \brief  Event on successful memory pool allocation (Op)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  block         address of the allocated memory block.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOCATED_DISABLE))
+extern void EvrRtxMemoryPoolAllocated (osMemoryPoolId_t mp_id, void *block);
+#else
+#define EvrRtxMemoryPoolAllocated(mp_id, block)
+#endif
+
+/**
+  \brief  Event on unsuccessful memory pool allocation (Op)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOC_FAILED_DISABLE))
+extern void EvrRtxMemoryPoolAllocFailed (osMemoryPoolId_t mp_id);
+#else
+#define EvrRtxMemoryPoolAllocFailed(mp_id)
+#endif
+
+/**
+  \brief  Event on memory pool free (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  block         address of the allocated memory block to be returned to the memory pool.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_FREE_DISABLE))
+extern void EvrRtxMemoryPoolFree (osMemoryPoolId_t mp_id, void *block);
+#else
+#define EvrRtxMemoryPoolFree(mp_id, block)
+#endif
+
+/**
+  \brief  Event on successful memory pool free (Op)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  block         address of the allocated memory block to be returned to the memory pool.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_DEALLOCATED_DISABLE))
+extern void EvrRtxMemoryPoolDeallocated (osMemoryPoolId_t mp_id, void *block);
+#else
+#define EvrRtxMemoryPoolDeallocated(mp_id, block)
+#endif
+
+/**
+  \brief  Event on unsuccessful memory pool free (Op)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  block         address of the allocated memory block to be returned to the memory pool.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_FREE_FAILED_DISABLE))
+extern void EvrRtxMemoryPoolFreeFailed (osMemoryPoolId_t mp_id, void *block);
+#else
+#define EvrRtxMemoryPoolFreeFailed(mp_id, block)
+#endif
+
+/**
+  \brief  Event on memory pool capacity retrieve (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  capacity      maximum number of memory blocks.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_CAPACITY_DISABLE))
+extern void EvrRtxMemoryPoolGetCapacity (osMemoryPoolId_t mp_id, uint32_t capacity);
+#else
+#define EvrRtxMemoryPoolGetCapacity(mp_id, capacity)
+#endif
+
+/**
+  \brief  Event on memory pool block size retrieve (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  block_size    memory block size in bytes.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_BLOCK_SZIE_DISABLE))
+extern void EvrRtxMemoryPoolGetBlockSize (osMemoryPoolId_t mp_id, uint32_t block_size);
+#else
+#define EvrRtxMemoryPoolGetBlockSize(mp_id, block_size)
+#endif
+
+/**
+  \brief  Event on used memory pool blocks retrieve (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  count         number of memory blocks used.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_COUNT_DISABLE))
+extern void EvrRtxMemoryPoolGetCount (osMemoryPoolId_t mp_id, uint32_t count);
+#else
+#define EvrRtxMemoryPoolGetCount(mp_id, count)
+#endif
+
+/**
+  \brief  Event on available memory pool blocks retrieve (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+  \param[in]  space         number of memory blocks available.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_SPACE_DISABLE))
+extern void EvrRtxMemoryPoolGetSpace (osMemoryPoolId_t mp_id, uint32_t space);
+#else
+#define EvrRtxMemoryPoolGetSpace(mp_id, space)
+#endif
+
+/**
+  \brief  Event on memory pool delete (API)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_DELETE_DISABLE))
+extern void EvrRtxMemoryPoolDelete (osMemoryPoolId_t mp_id);
+#else
+#define EvrRtxMemoryPoolDelete(mp_id)
+#endif
+
+/**
+  \brief  Event on successful memory pool delete (Op)
+  \param[in]  mp_id         memory pool ID obtained by \ref osMemoryPoolNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_DESTROYED_DISABLE))
+extern void EvrRtxMemoryPoolDestroyed (osMemoryPoolId_t mp_id);
+#else
+#define EvrRtxMemoryPoolDestroyed(mp_id)
+#endif
+
+
+//  ==== Message Queue Events ====
+
+/**
+  \brief  Event on message queue error (Error)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew or NULL when ID is unknown.
+  \param[in]  status        extended execution status.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_ERROR_DISABLE))
+extern void EvrRtxMessageQueueError (osMessageQueueId_t mq_id, int32_t status);
+#else
+#define EvrRtxMessageQueueError(mq_id, status)
+#endif
+
+/**
+  \brief  Event on message queue create and initialization (API)
+  \param[in]  msg_count     maximum number of messages in queue.
+  \param[in]  msg_size      maximum message size in bytes.
+  \param[in]  attr          message queue attributes; NULL: default values.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_NEW_DISABLE))
+extern void EvrRtxMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr);
+#else
+#define EvrRtxMessageQueueNew(msg_count, msg_size, attr)
+#endif
+
+/**
+  \brief  Event on successful message queue create (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_CREATED_DISABLE))
+extern void EvrRtxMessageQueueCreated (osMessageQueueId_t mq_id);
+#else
+#define EvrRtxMessageQueueCreated(mq_id)
+#endif
+
+/**
+  \brief  Event on message queue name retrieve(API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  name          pointer to message queue object name.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_NAME_DISABLE))
+extern void EvrRtxMessageQueueGetName (osMessageQueueId_t mq_id, const char *name);
+#else
+#define EvrRtxMessageQueueGetName(mq_id, name)
+#endif
+
+/**
+  \brief  Event on message put (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer with message to put into a queue.
+  \param[in]  msg_prio      message priority.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_PUT_DISABLE))
+extern void EvrRtxMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout);
+#else
+#define EvrRtxMessageQueuePut(mq_id, msg_ptr, msg_prio, timeout)
+#endif
+
+/**
+  \brief  Event on pending message put (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer with message to put into a queue.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_PUT_PENDING_DISABLE))
+extern void EvrRtxMessageQueuePutPending (osMessageQueueId_t mq_id, const void *msg_ptr, uint32_t timeout);
+#else
+#define EvrRtxMessageQueuePutPending(mq_id, msg_ptr, timeout)
+#endif
+
+/**
+  \brief  Event on pending message insert (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer with message to put into a queue.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_INSERT_PENDING_DISABLE))
+extern void EvrRtxMessageQueueInsertPending (osMessageQueueId_t mq_id, const void *msg_ptr);
+#else
+#define EvrRtxMessageQueueInsertPending(mq_id, msg_ptr)
+#endif
+
+/**
+  \brief  Event on successful message insert (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer with message to put into a queue.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_INSERTED_DISABLE))
+extern void EvrRtxMessageQueueInserted (osMessageQueueId_t mq_id, const void *msg_ptr);
+#else
+#define EvrRtxMessageQueueInserted(mq_id, msg_ptr)
+#endif
+
+/**
+  \brief  Event on unsuccessful message insert (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer with message to put into a queue.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_NOT_INSERTED_DISABLE))
+extern void EvrRtxMessageQueueNotInserted (osMessageQueueId_t mq_id, const void *msg_ptr);
+#else
+#define EvrRtxMessageQueueNotInserted(mq_id, msg_ptr)
+#endif
+
+/**
+  \brief  Event on message get (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer for message to get from a queue.
+  \param[in]  msg_prio      message priority.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_DISABLE))
+extern void EvrRtxMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout);
+#else
+#define EvrRtxMessageQueueGet(mq_id, msg_ptr, msg_prio, timeout)
+#endif
+
+/**
+  \brief  Event on pending message get (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer for message to get from a queue.
+  \param[in]  timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_PENDING_DISABLE))
+extern void EvrRtxMessageQueueGetPending (osMessageQueueId_t mq_id, void *msg_ptr, uint32_t timeout);
+#else
+#define EvrRtxMessageQueueGetPending(mq_id, msg_ptr, timeout)
+#endif
+
+/**
+  \brief  Event on successful message get (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer for message to get from a queue.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_RETRIEVED_DISABLE))
+extern void EvrRtxMessageQueueRetrieved (osMessageQueueId_t mq_id, void *msg_ptr);
+#else
+#define EvrRtxMessageQueueRetrieved(mq_id, msg_ptr)
+#endif
+
+/**
+  \brief  Event on unsuccessful message get (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_ptr       pointer to buffer for message to get from a queue.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_NOT_RETRIEVED_DISABLE))
+extern void EvrRtxMessageQueueNotRetrieved (osMessageQueueId_t mq_id, void *msg_ptr);
+#else
+#define EvrRtxMessageQueueNotRetrieved(mq_id, msg_ptr)
+#endif
+
+/**
+  \brief  Event on message queue capacity retrieve (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  capacity      maximum number of messages.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_CAPACITY_DISABLE))
+extern void EvrRtxMessageQueueGetCapacity (osMessageQueueId_t mq_id, uint32_t capacity);
+#else
+#define EvrRtxMessageQueueGetCapacity(mq_id, capacity)
+#endif
+
+/**
+  \brief  Event on message queue message size retrieve (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  msg_size      maximum message size in bytes.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_MSG_SIZE_DISABLE))
+extern void EvrRtxMessageQueueGetMsgSize (osMessageQueueId_t mq_id, uint32_t msg_size);
+#else
+#define EvrRtxMessageQueueGetMsgSize(mq_id, msg_size)
+#endif
+
+/**
+  \brief  Event on message queue message count retrieve (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  count         number of queued messages.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_COUNT_DISABLE))
+extern void EvrRtxMessageQueueGetCount (osMessageQueueId_t mq_id, uint32_t count);
+#else
+#define EvrRtxMessageQueueGetCount(mq_id, count)
+#endif
+
+/**
+  \brief  Event on message queue message slots retrieve (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+  \param[in]  space         number of available slots for messages.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_SPACE_DISABLE))
+extern void EvrRtxMessageQueueGetSpace (osMessageQueueId_t mq_id, uint32_t space);
+#else
+#define EvrRtxMessageQueueGetSpace(mq_id, space)
+#endif
+
+/**
+  \brief  Event on message queue reset (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_RESET_DISABLE))
+extern void EvrRtxMessageQueueReset (osMessageQueueId_t mq_id);
+#else
+#define EvrRtxMessageQueueReset(mq_id)
+#endif
+
+/**
+  \brief  Event on successful message queue reset (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_RESET_DONE_DISABLE))
+extern void EvrRtxMessageQueueResetDone (osMessageQueueId_t mq_id);
+#else
+#define EvrRtxMessageQueueResetDone(mq_id)
+#endif
+
+/**
+  \brief  Event on message queue delete (API)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_DELETE_DISABLE))
+extern void EvrRtxMessageQueueDelete (osMessageQueueId_t mq_id);
+#else
+#define EvrRtxMessageQueueDelete(mq_id)
+#endif
+
+/**
+  \brief  Event on successful message queue delete (Op)
+  \param[in]  mq_id         message queue ID obtained by \ref osMessageQueueNew.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_DESTROYED_DISABLE))
+extern void EvrRtxMessageQueueDestroyed (osMessageQueueId_t mq_id);
+#else
+#define EvrRtxMessageQueueDestroyed(mq_id)
+#endif
+
+
+#endif  // RTX_EVR_H_
diff --git a/CMSIS/RTOS2/RTX/RTX5.scvd b/CMSIS/RTOS2/RTX/RTX5.scvd
index 449bc6c..92455b0 100644
--- a/CMSIS/RTOS2/RTX/RTX5.scvd
+++ b/CMSIS/RTOS2/RTX/RTX5.scvd
@@ -3,10 +3,75 @@
   <component name="RTOS" version="5.0.0"/>    <!-- name and version of the component  -->
 
   <typedefs>
+    <!-- Attributes structure for thread -->
+    <typedef name="osThreadAttr_t" info="" size="36">
+      <member name="name"       type="uint32_t" offset="0"  info="name of the thread (type is const char *)"/>
+      <member name="attr_bits"  type="uint32_t" offset="4"  info="attribute bits"/>
+      <member name="cb_mem"     type="uint32_t" offset="8"  info="memory for control block (type is void *)"/>
+      <member name="cb_size"    type="uint32_t" offset="12" info="size of provided memory for control block"/>
+      <member name="stack_mem"  type="uint32_t" offset="16" info="memory for stack (type is void *)"/>
+      <member name="stack_size" type="uint32_t" offset="20" info="size of stack"/>
+      <member name="priority"   type="uint32_t" offset="24" info="initial thread priority (type is osPriority_t)"/>
+      <member name="tz_module"  type="uint32_t" offset="28" info="TrustZone module identifier (type is TZ_ModuleId_t)"/>
+      <member name="reserved"   type="uint32_t" offset="32" info="reserved (must be 0)"/>
+    </typedef>
+
+    <!-- Attributes structure for timer -->
+    <typedef name="osTimerAttr_t" info="" size="16">
+      <member name="name"      type="uint32_t" offset="0"  info="name of the timer (type is const char *)"/>
+      <member name="attr_bits" type="uint32_t" offset="4"  info="attribute bits"/>
+      <member name="cb_mem"    type="uint32_t" offset="8"  info="memory for control block (type is void *)"/>
+      <member name="cb_size"   type="uint32_t" offset="12" info="size of provided memory for control block"/>
+    </typedef>
+
+    <!-- Attributes structure for event flags -->
+    <typedef name="osEventFlagsAttr_t" info="" size="16">
+      <member name="name"      type="uint32_t" offset="0"  info="name of the event flags (type is const char *)"/>
+      <member name="attr_bits" type="uint32_t" offset="4"  info="attribute bits"/>
+      <member name="cb_mem"    type="uint32_t" offset="8"  info="memory for control block (type is void *)"/>
+      <member name="cb_size"   type="uint32_t" offset="12" info="size of provided memory for control block"/>
+    </typedef>
+
+    <!-- Attributes structure for mutex -->
+    <typedef name="osMutexAttr_t" info="" size="16">
+      <member name="name"      type="uint32_t" offset="0"  info="name of the mutex (type is const char *)"/>
+      <member name="attr_bits" type="uint32_t" offset="4"  info="attribute bits"/>
+      <member name="cb_mem"    type="uint32_t" offset="8"  info="memory for control block (type is void *)"/>
+      <member name="cb_size"   type="uint32_t" offset="12" info="size of provided memory for control block"/>
+    </typedef>
+
+    <!-- Attributes structure for semaphore -->
+    <typedef name="osSemaphoreAttr_t" info="" size="16">
+      <member name="name"      type="uint32_t" offset="0"  info="name of the semaphore (type is const char *)"/>
+      <member name="attr_bits" type="uint32_t" offset="4"  info="attribute bits"/>
+      <member name="cb_mem"    type="uint32_t" offset="8"  info="memory for control block (type is void *)"/>
+      <member name="cb_size"   type="uint32_t" offset="12" info="size of provided memory for control block"/>
+    </typedef>
+
+    <!-- Attributes structure for memory pool -->
+    <typedef name="osMemoryPoolAttr_t" info="" size="24">
+      <member name="name"      type="uint32_t" offset="0"  info="name of the semaphore (type is const char *)"/>
+      <member name="attr_bits" type="uint32_t" offset="4"  info="attribute bits"/>
+      <member name="cb_mem"    type="uint32_t" offset="8"  info="memory for control block (type is void *)"/>
+      <member name="cb_size"   type="uint32_t" offset="12" info="size of provided memory for control block"/>
+      <member name="mp_mem"    type="uint32_t" offset="16" info="memory for data storage (type is void *)"/>
+      <member name="mp_size"   type="uint32_t" offset="20" info="size of provided memory for data storage"/>
+    </typedef>
+
+    <!-- Attributes structure for message queue -->
+    <typedef name="osMessageQueueAttr_t" info="" size="24">
+      <member name="name"      type="uint32_t" offset="0"  info="name of the semaphore (type is const char *)"/>
+      <member name="attr_bits" type="uint32_t" offset="4"  info="attribute bits"/>
+      <member name="cb_mem"    type="uint32_t" offset="8"  info="memory for control block (type is void *)"/>
+      <member name="cb_size"   type="uint32_t" offset="12" info="size of provided memory for control block"/>
+      <member name="mq_mem"    type="uint32_t" offset="16" info="memory for data storage (type is void *)"/>
+      <member name="mq_size"   type="uint32_t" offset="20" info="size of provided memory for data storage"/>
+    </typedef>
+
     <!-- Thread Control Block -->
-    <typedef name="os_thread_t" info="" size="64">
-      <member name="id"            type="uint8_t"      offset="0" info="Object Identifier"/>
-      <member name="state"         type="uint8_t"      offset="1" info="Object State">
+    <typedef name="osRtxThread_t" info="" size="68">
+      <member name="id"            type="uint8_t"        offset="0" info="Object Identifier"/>
+      <member name="state"         type="uint8_t"        offset="1" info="Object State">
         <enum name="osThreadInactive"    value="0"  info=""/>
         <enum name="osThreadReady"       value="1"  info=""/>
         <enum name="osThreadRunning"     value="2"  info=""/>
@@ -24,21 +89,19 @@
         <enum name="Message Get"  value="0x83"  info=""/>
         <enum name="Message Put"  value="0x93"  info=""/>
       </member>
-      <member name="flags"         type="uint8_t"      offset="2" info="Object Flags"/>
-      <member name="attr"          type="uint8_t"      offset="3" info="Object Attributes">
+      <member name="flags"         type="uint8_t"        offset="2" info="Object Flags"/>
+      <member name="attr"          type="uint8_t"        offset="3" info="Object Attributes">
         <enum name="osThreadDetached" value="0x00" info="Thread created in detached state"/>
         <enum name="osThreadJoinable" value="0x01" info="Thread created in joinable state"/>
       </member>
-      <member name="name"          type="uint32_t"     offset="4" info="Object name (type is *uint8_t)"/>
-
-      <member name="thread_next"   type="*os_thread_t" offset="8" info="Link pointer to next Thread in Object list"/>
-      <member name="thread_prev"   type="*os_thread_t" offset="12" info="Link pointer to previous Thread in Object list"/>
-      <member name="delay_next"    type="*os_thread_t" offset="16" info="Link pointer to next Thread in Delay list"/>
-      <member name="delay_prev"    type="*os_thread_t" offset="20" info="Link pointer to previous Thread in Delay list"/>
-      <member name="thread_join"   type="*os_thread_t" offset="24" info="Thread waiting to Join"/>
-
-      <member name="delay"         type="uint32_t"     offset="28" info="Delay time"/>
-      <member name="priority"      type="int8_t"       offset="32" info="Thread priority">
+      <member name="name"          type="uint32_t"       offset="4"  info="Object name (type is *uint8_t)"/>
+      <member name="thread_next"   type="*osRtxThread_t" offset="8"  info="Link pointer to next Thread in Object list"/>
+      <member name="thread_prev"   type="*osRtxThread_t" offset="12" info="Link pointer to previous Thread in Object list"/>
+      <member name="delay_next"    type="*osRtxThread_t" offset="16" info="Link pointer to next Thread in Delay list"/>
+      <member name="delay_prev"    type="*osRtxThread_t" offset="20" info="Link pointer to previous Thread in Delay list"/>
+      <member name="thread_join"   type="*osRtxThread_t" offset="24" info="Thread waiting to Join"/>
+      <member name="delay"         type="uint32_t"       offset="28" info="Delay time"/>
+      <member name="priority"      type="int8_t"         offset="32" info="Thread priority">
         <enum name="osPriorityNone"         value="0"    info=""/>
         <enum name="osPriorityIdle"         value="1"    info=""/>
         <enum name="osPriorityLow"          value="8"    info=""/>
@@ -92,20 +155,21 @@
         <enum name="osPriorityISR"          value="56"   info=""/>
         <enum name="osPriorityError"        value="-1"   info=""/>
       </member>
-      <member name="priority_base" type="int8_t"       offset="33" info="Base priority"/>
-      <member name="stack_frame"   type="uint8_t"      offset="34" info="Stack frame"/>
-      <member name="flags_options" type="uint8_t"      offset="35" info="Thread/Event flags options">
+      <member name="priority_base" type="int8_t"         offset="33" info="Base priority"/>
+      <member name="stack_frame"   type="uint8_t"        offset="34" info="Stack frame"/>
+      <member name="flags_options" type="uint8_t"        offset="35" info="Thread/Event flags options">
         <enum name="osFlagsWaitAny"   value="0x00" info="Wait for any flag."/>
         <enum name="osFlagsWaitAll"   value="0x01" info="Wait for all flags."/>
         <enum name="osFlagsAutoClear" value="0x02" info="Clear flags which have been specified to wait for."/>
       </member>
-      <member name="wait_flags"    type="int32_t"      offset="36" info="Waiting Thread/Event flags"/>
-      <member name="thread_flags"  type="int32_t"      offset="40" info="Thread flags"/>
-      <member name="mutex_list"    type="*os_mutex_t"  offset="44" info="Link pointer to list of owned mutexes"/>
-      <member name="stack_mem"     type="uint32_t"     offset="48" info="Stack memory (type is void *)"/>
-      <member name="stack_size"    type="uint32_t"     offset="52" info="Stack size"/>
-      <member name="sp"            type="uint32_t"     offset="56" info="Current stack pointer"/>
-      <member name="tz_memory"     type="uint32_t"     offset="60" info="TrustZone Memory Identifier"/>
+      <member name="wait_flags"    type="int32_t"        offset="36" info="Waiting Thread/Event flags"/>
+      <member name="thread_flags"  type="int32_t"        offset="40" info="Thread flags"/>
+      <member name="mutex_list"    type="*osRtxMutex_t"  offset="44" info="Link pointer to list of owned mutexes"/>
+      <member name="stack_mem"     type="uint32_t"       offset="48" info="Stack memory (type is void *)"/>
+      <member name="stack_size"    type="uint32_t"       offset="52" info="Stack size"/>
+      <member name="sp"            type="uint32_t"       offset="56" info="Current stack pointer"/>
+      <member name="thread_addr"   type="uint32_t"       offset="60" info="Thread entry address"/>
+      <member name="tz_memory"     type="uint32_t"       offset="64" info="TrustZone Memory Identifier"/>
 
       <var name="obj_name"   type="uint8_t"  info="Object name string" size="66" />
       <var name="cb_valid"   type="uint32_t" info="Control Block validation status (valid=1, invalid=0)"/>
@@ -122,26 +186,26 @@
     </typedef>
 
     <!-- Timer Control Block -->
-    <typedef name="os_timer_t" info="" size="32">
-      <member name="id"          type="uint8_t"     offset="0" info="Object Identifier"/>
-      <member name="state"       type="uint8_t"     offset="1" info="Object State">
+    <typedef name="osRtxTimer_t" info="" size="32">
+      <member name="id"          type="uint8_t"       offset="0" info="Object Identifier"/>
+      <member name="state"       type="uint8_t"       offset="1" info="Object State">
         <enum name="Inactive" value="0" info="Timer is not active"/>
         <enum name="Stopped"  value="1" info="Timer is stopped"/>
         <enum name="Running"  value="2" info="Timer is running"/>
       </member>
-      <member name="flags"       type="uint8_t"     offset="2" info="Object Flags"/>
-      <member name="type"        type="uint8_t"     offset="3" info="Timer Type">
+      <member name="flags"       type="uint8_t"       offset="2" info="Object Flags"/>
+      <member name="type"        type="uint8_t"       offset="3" info="Timer Type">
         <enum name="osTimerOnce"     value="0" info="One-shot timer"/>
         <enum name="osTimerPeriodic" value="1" info="Periodic timer"/>
       </member>
-      <member name="name"        type="uint32_t"    offset="4" info="Object name (type is *uint8_t)"/>
-      <member name="prev"        type="*os_timer_t" offset="8" info="Pointer to previous active timer"/>
-      <member name="next"        type="*os_timer_t" offset="12" info="Pointer to next active timer"/>
-      <member name="tick"        type="uint32_t"    offset="16" info="Timer current tick"/>
-      <member name="load"        type="uint32_t"    offset="20" info="Timer load value"/>
+      <member name="name"        type="uint32_t"      offset="4"  info="Object name (type is *uint8_t)"/>
+      <member name="prev"        type="*osRtxTimer_t" offset="8"  info="Pointer to previous active timer"/>
+      <member name="next"        type="*osRtxTimer_t" offset="12" info="Pointer to next active timer"/>
+      <member name="tick"        type="uint32_t"      offset="16" info="Timer current tick"/>
+      <member name="load"        type="uint32_t"      offset="20" info="Timer load value"/>
       <!-- Inlined "os_timer_finfo_t" structure -->
-      <member name="finfo_fp"    type="uint32_t"    offset="24" info="Timer function pointer (type is void *)"/>
-      <member name="finfo_arg"   type="uint32_t"    offset="28" info="Timer function argument (type is void *)"/>
+      <member name="finfo_fp"    type="uint32_t"      offset="24" info="Timer function pointer (type is void *)"/>
+      <member name="finfo_arg"   type="uint32_t"      offset="28" info="Timer function argument (type is void *)"/>
 
       <var name="obj_name" type="uint8_t"  info="Object name string" size="66" />
       <var name="cb_valid" type="uint32_t" info="Control Block validation status (valid=1, invalid=0)"/>
@@ -149,14 +213,14 @@
     </typedef>
 
     <!-- Event Flags Control Block -->
-    <typedef name="os_event_flags_t" info="" size="16">
-      <member name="id"          type="uint8_t"      offset="0" info="Object Identifier"/>
-      <member name="state"       type="uint8_t"      offset="1" info="Object State"/>
-      <member name="flags"       type="uint8_t"      offset="2" info="Object Flags"/>
-      <member name="reserved"    type="uint8_t"      offset="3" info=""/>
-      <member name="name"        type="uint32_t"     offset="4" info="Object name (type is *uint8_t)"/>
-      <member name="thread_list" type="*os_thread_t" offset="8" info="Waiting threads list"/>
-      <member name="event_flags" type="int32_t"      offset="12" info="Event flags"/>
+    <typedef name="osRtxEventFlags_t" info="" size="16">
+      <member name="id"          type="uint8_t"        offset="0"  info="Object Identifier"/>
+      <member name="state"       type="uint8_t"        offset="1"  info="Object State"/>
+      <member name="flags"       type="uint8_t"        offset="2"  info="Object Flags"/>
+      <member name="reserved"    type="uint8_t"        offset="3"  info=""/>
+      <member name="name"        type="uint32_t"       offset="4"  info="Object name (type is *uint8_t)"/>
+      <member name="thread_list" type="*osRtxThread_t" offset="8"  info="Waiting threads list"/>
+      <member name="event_flags" type="int32_t"        offset="12" info="Event flags"/>
 
       <var name="obj_name" type="uint8_t"  info="Object name string" size="66" />
       <var name="cb_valid" type="uint32_t" info="Control Block validation status (valid=1, invalid=0)"/>
@@ -165,21 +229,21 @@
     </typedef>
 
     <!-- Mutex Control Block -->
-    <typedef name="os_mutex_t" info="" size="28">
-      <member name="id"           type="uint8_t"      offset="0" info="Object Identifier"/>
-      <member name="state"        type="uint8_t"      offset="1" info="Object State"/>
-      <member name="flags"        type="uint8_t"      offset="2" info="Object Flags"/>
-      <member name="attr"         type="uint8_t"      offset="3" info="Object Attributes">
+    <typedef name="osRtxMutex_t" info="" size="28">
+      <member name="id"           type="uint8_t"        offset="0" info="Object Identifier"/>
+      <member name="state"        type="uint8_t"        offset="1" info="Object State"/>
+      <member name="flags"        type="uint8_t"        offset="2" info="Object Flags"/>
+      <member name="attr"         type="uint8_t"        offset="3" info="Object Attributes">
         <enum name="osMutexRecursive"   value="0x01" info="Recursive mutex."/>
         <enum name="osMutexPrioInherit" value="0x02" info="Priority inherit protocol."/>
         <enum name="osMutexRobust"      value="0x08" info="Robust mutex."/>
       </member>
-      <member name="name"         type="uint32_t"     offset="4" info="Object name (type is *uint8_t)"/>
-      <member name="thread_list"  type="*os_thread_t" offset="8" info="Waiting threads list"/>
-      <member name="owner_thread" type="*os_thread_t" offset="12" info="Owner thread"/>
-      <member name="owner_prev"   type="*os_mutex_t"  offset="16" info="Pointer to previous owned mutex"/>
-      <member name="owner_next"   type="*os_mutex_t"  offset="20" info="Pointer to next owned mutex"/>
-      <member name="lock"         type="uint8_t"      offset="24" info="Lock counter"/>
+      <member name="name"         type="uint32_t"       offset="4"  info="Object name (type is *uint8_t)"/>
+      <member name="thread_list"  type="*osRtxThread_t" offset="8"  info="Waiting threads list"/>
+      <member name="owner_thread" type="*osRtxThread_t" offset="12" info="Owner thread"/>
+      <member name="owner_prev"   type="*osRtxMutex_t"  offset="16" info="Pointer to previous owned mutex"/>
+      <member name="owner_next"   type="*osRtxMutex_t"  offset="20" info="Pointer to next owned mutex"/>
+      <member name="lock"         type="uint8_t"        offset="24" info="Lock counter"/>
 
       <var name="obj_name" type="uint8_t"  info="Object name string" size="66" />
       <var name="cb_valid" type="uint32_t" info="Control Block validation status (valid=1, invalid=0)"/>
@@ -188,15 +252,15 @@
     </typedef>
 
     <!-- Semaphore Control Block -->
-    <typedef name="os_semaphore_t" info="" size="16">
-      <member name="id"          type="uint8_t"      offset="0" info="Object Identifier"/>
-      <member name="state"       type="uint8_t"      offset="1" info="Object State"/>
-      <member name="flags"       type="uint8_t"      offset="2" info="Object Flags"/>
-      <member name="reserved"    type="uint8_t"      offset="3" info=""/>
-      <member name="name"        type="uint32_t"     offset="4" info="Object name (type is *uint8_t)"/>
-      <member name="thread_list" type="*os_thread_t" offset="8" info="Waiting threads list"/>
-      <member name="tokens"      type="uint16_t"     offset="12" info="Current number of tokens"/>
-      <member name="max_tokens"  type="uint16_t"     offset="14" info="Maximum number of tokens"/>
+    <typedef name="osRtxSemaphore_t" info="" size="16">
+      <member name="id"          type="uint8_t"        offset="0"  info="Object Identifier"/>
+      <member name="state"       type="uint8_t"        offset="1"  info="Object State"/>
+      <member name="flags"       type="uint8_t"        offset="2"  info="Object Flags"/>
+      <member name="reserved"    type="uint8_t"        offset="3"  info=""/>
+      <member name="name"        type="uint32_t"       offset="4"  info="Object name (type is *uint8_t)"/>
+      <member name="thread_list" type="*osRtxThread_t" offset="8"  info="Waiting threads list"/>
+      <member name="tokens"      type="uint16_t"       offset="12" info="Current number of tokens"/>
+      <member name="max_tokens"  type="uint16_t"       offset="14" info="Maximum number of tokens"/>
 
       <var name="obj_name" type="uint8_t"  info="Object name string" size="66" />
       <var name="cb_valid" type="uint32_t" info="Control Block validation status (valid=1, invalid=0)"/>
@@ -205,7 +269,7 @@
     </typedef>
 
     <!-- Memory Pool Information -->
-    <typedef name="os_mp_info_t" info="Memory pool information" size="24">
+    <typedef name="osRtxMpInfo_t" info="Memory pool information" size="24">
       <member name="max_blocks"  type="uint32_t" offset="0" info="Maximum number of blocks"/>
       <member name="used_blocks" type="uint32_t" offset="4" info="Number of used blocks"/>
       <member name="block_size"  type="uint32_t" offset="8" info="Block size"/>
@@ -215,21 +279,21 @@
     </typedef>
 
     <!-- Memory Pool Control Block -->
-    <typedef name="os_memory_pool_t" info="" size="36">
-      <member name="id"          type="uint8_t"      offset="0" info="Object Identifier"/>
-      <member name="state"       type="uint8_t"      offset="1" info="Object State"/>
-      <member name="flags"       type="uint8_t"      offset="2" info="Object Flags"/>
-      <member name="reserved"    type="uint8_t"      offset="3" info=""/>
-      <member name="name"        type="uint32_t"     offset="4" info="Object name (type is *uint8_t)"/>
-      <member name="thread_list" type="*os_thread_t" offset="8" info="Waiting threads list"/>
+    <typedef name="osRtxMemoryPool_t" info="" size="36">
+      <member name="id"          type="uint8_t"        offset="0" info="Object Identifier"/>
+      <member name="state"       type="uint8_t"        offset="1" info="Object State"/>
+      <member name="flags"       type="uint8_t"        offset="2" info="Object Flags"/>
+      <member name="reserved"    type="uint8_t"        offset="3" info=""/>
+      <member name="name"        type="uint32_t"       offset="4" info="Object name (type is *uint8_t)"/>
+      <member name="thread_list" type="*osRtxThread_t" offset="8" info="Waiting threads list"/>
 
-      <!-- Inlined "os_mp_info_t" structure -->
-      <member name="max_blocks"  type="uint32_t" offset="12+0" info="Maximum number of blocks"/>
-      <member name="used_blocks" type="uint32_t" offset="12+4" info="Number of used blocks"/>
-      <member name="block_size"  type="uint32_t" offset="12+8" info="Block size"/>
-      <member name="block_base"  type="uint32_t" offset="12+12" info="Block memory base address (type is void *)"/>
-      <member name="block_lim"   type="uint32_t" offset="12+16" info="Block memory limit address (type is void *)"/>
-      <member name="block_free"  type="uint32_t" offset="12+20" info="First free block address (type is void *)"/>
+      <!-- Inlined "osRtxMpInfo_t" structure -->
+      <member name="max_blocks"  type="uint32_t"       offset="12+0"  info="Maximum number of blocks"/>
+      <member name="used_blocks" type="uint32_t"       offset="12+4"  info="Number of used blocks"/>
+      <member name="block_size"  type="uint32_t"       offset="12+8"  info="Block size"/>
+      <member name="block_base"  type="uint32_t"       offset="12+12" info="Block memory base address (type is void *)"/>
+      <member name="block_lim"   type="uint32_t"       offset="12+16" info="Block memory limit address (type is void *)"/>
+      <member name="block_free"  type="uint32_t"       offset="12+20" info="First free block address (type is void *)"/>
 
       <var name="obj_name" type="uint8_t"  info="Object name string" size="66" />
       <var name="cb_valid" type="uint32_t" info="Control Block validation status (valid=1, invalid=0)"/>
@@ -238,38 +302,38 @@
     </typedef>
 
     <!-- Message Control Block -->
-    <typedef name="os_message_t" info="" size="12">
-      <member name="id"       type="uint8_t"       offset="0" info="Object Identifier"/>
-      <member name="state"    type="uint8_t"       offset="1" info="Object State"/>
-      <member name="flags"    type="uint8_t"       offset="2" info="Object Flags"/>
-      <member name="priority" type="uint8_t"       offset="3" info="Message priority"/>
-      <member name="prev"     type="*os_message_t" offset="4" info="Pointer to previous message"/>
-      <member name="next"     type="*os_message_t" offset="8" info="Pointer to next message"/>
+    <typedef name="osRtxMessage_t" info="" size="12">
+      <member name="id"       type="uint8_t"         offset="0" info="Object Identifier"/>
+      <member name="state"    type="uint8_t"         offset="1" info="Object State"/>
+      <member name="flags"    type="uint8_t"         offset="2" info="Object Flags"/>
+      <member name="priority" type="uint8_t"         offset="3" info="Message priority"/>
+      <member name="prev"     type="*osRtxMessage_t" offset="4" info="Pointer to previous message"/>
+      <member name="next"     type="*osRtxMessage_t" offset="8" info="Pointer to next message"/>
 
       <var name="addr" type="uint32_t" info="Message location address" />
     </typedef>
 
     <!-- Message Queue Control Block -->
-    <typedef name="os_message_queue_t" info="" size="52">
-      <member name="id"          type="uint8_t"       offset="0" info="Object Identifier"/>
-      <member name="state"       type="uint8_t"       offset="1" info="Object State"/>
-      <member name="flags"       type="uint8_t"       offset="2" info="Object Flags"/>
-      <member name="reserved"    type="uint8_t"       offset="3" info=""/>
-      <member name="name"        type="uint32_t"      offset="4" info="Object name (type is *uint8_t)"/>
-      <member name="thread_list" type="*os_thread_t"  offset="8" info="Waiting threads list"/>
+    <typedef name="osRtxMessageQueue_t" info="" size="52">
+      <member name="id"          type="uint8_t"         offset="0" info="Object Identifier"/>
+      <member name="state"       type="uint8_t"         offset="1" info="Object State"/>
+      <member name="flags"       type="uint8_t"         offset="2" info="Object Flags"/>
+      <member name="reserved"    type="uint8_t"         offset="3" info=""/>
+      <member name="name"        type="uint32_t"        offset="4" info="Object name (type is *uint8_t)"/>
+      <member name="thread_list" type="*osRtxThread_t"  offset="8" info="Waiting threads list"/>
 
-      <!-- Inlined "os_mp_info_t" structure -->
-      <member name="max_blocks"  type="uint32_t"      offset="12+0" info="Maximum number of blocks"/>
-      <member name="used_blocks" type="uint32_t"      offset="12+4" info="Number of used blocks"/>
-      <member name="block_size"  type="uint32_t"      offset="12+8" info="Block size"/>
-      <member name="block_base"  type="uint32_t"      offset="12+12" info="Block memory base address (type is void *)"/>
-      <member name="block_lim"   type="uint32_t"      offset="12+16" info="Block memory limit address (type is void *)"/>
-      <member name="block_free"  type="uint32_t"      offset="12+20" info="First free block address (type is void *)"/>
+      <!-- Inlined "osRtxMpInfo_t" structure -->
+      <member name="max_blocks"  type="uint32_t"        offset="12+0"  info="Maximum number of blocks"/>
+      <member name="used_blocks" type="uint32_t"        offset="12+4"  info="Number of used blocks"/>
+      <member name="block_size"  type="uint32_t"        offset="12+8"  info="Block size"/>
+      <member name="block_base"  type="uint32_t"        offset="12+12" info="Block memory base address (type is void *)"/>
+      <member name="block_lim"   type="uint32_t"        offset="12+16" info="Block memory limit address (type is void *)"/>
+      <member name="block_free"  type="uint32_t"        offset="12+20" info="First free block address (type is void *)"/>
 
-      <member name="msg_size"    type="uint32_t"      offset="36" info="Message size"/>
-      <member name="msg_count"   type="uint32_t"      offset="40" info="Number of queued messages"/>
-      <member name="msg_first"   type="*os_message_t" offset="44" info="Pointer to first message"/>
-      <member name="msg_last"    type="*os_message_t" offset="48" info="Pointer to last message"/>
+      <member name="msg_size"    type="uint32_t"        offset="36" info="Message size"/>
+      <member name="msg_count"   type="uint32_t"        offset="40" info="Number of queued messages"/>
+      <member name="msg_first"   type="*osRtxMessage_t" offset="44" info="Pointer to first message"/>
+      <member name="msg_last"    type="*osRtxMessage_t" offset="48" info="Pointer to last message"/>
 
       <var name="obj_name" type="uint8_t"  info="Object name string" size="66" />
       <var name="cb_valid" type="uint32_t" info="Control Block validation status (valid=1, invalid=0)"/>
@@ -281,19 +345,19 @@
 
     <!-- Generic Object Control Block -->
     <typedef name="os_object_t" info="" size="12">
-      <member name="id"          type="uint8_t"      offset="0" info="Object Identifier"/>
-      <member name="state"       type="uint8_t"      offset="1" info="Object State"/>
-      <member name="flags"       type="uint8_t"      offset="2" info="Object Flags"/>
-      <member name="reserved"    type="uint8_t"      offset="3" info=""/>
-      <member name="name"        type="uint32_t"     offset="4" info="Object name (type is *uint8_t)"/>
-      <member name="thread_list" type="*os_thread_t" offset="8" info="Threads list"/>
+      <member name="id"          type="uint8_t"        offset="0" info="Object Identifier"/>
+      <member name="state"       type="uint8_t"        offset="1" info="Object State"/>
+      <member name="flags"       type="uint8_t"        offset="2" info="Object Flags"/>
+      <member name="reserved"    type="uint8_t"        offset="3" info=""/>
+      <member name="name"        type="uint32_t"       offset="4" info="Object name (type is *uint8_t)"/>
+      <member name="thread_list" type="*osRtxThread_t" offset="8" info="Threads list"/>
     </typedef>
 
     <!-- OS Runtime Information structure -->
-    <typedef name="os_info_t" info="OS Runtime Information" size="168">
-      <member name="os_id"                      type="uint32_t"      offset="0" info="OS Identification (type is *uint8_t)"/>
-      <member name="version"                    type="uint32_t"      offset="4" info="OS Version"/>
-      <member name="kernel_state"               type="uint8_t"       offset="8" info="Kernel state">
+    <typedef name="osRtxInfo_t" info="OS Runtime Information" size="168">
+      <member name="os_id"                      type="uint32_t"             offset="0" info="OS Identification (type is *uint8_t)"/>
+      <member name="version"                    type="uint32_t"             offset="4" info="OS Version"/>
+      <member name="kernel_state"               type="uint8_t"              offset="8" info="Kernel state">
         <enum name="osKernelInactive"  value="0"  info="Inactive"/>
         <enum name="osKernelReady"     value="1"  info="Ready"/>
         <enum name="osKernelRunning"   value="2"  info="Running"/>
@@ -301,72 +365,69 @@
         <enum name="osKernelSuspended" value="4"  info="Suspended"/>
         <enum name="osKernelError"     value="5"  info="Error"/>
       </member>
-      <member name="kernel_blocked"             type="uint8_t"       offset="9" info="Kernel blocked"/>
-      <member name="kernel_pendISR"             type="uint8_t"       offset="10" info="Kernel pending ISR"/>
-      <member name="kernel_pendSV"              type="uint8_t"       offset="11" info="Kernel pending SV"/>
-      <member name="kernel_sys_freq"            type="uint32_t"      offset="12" info="Kernel system frequency"/>
-      <member name="kernel_tick"                type="uint64_t"      offset="16" info="Kernel tick counter"/>
-
-      <member name="tick_irqn"                  type="int32_t"       offset="24" info="Tick timer IRQ number"/>
-
-      <member name="thread_run_curr"            type="*os_thread_t"  offset="28" info="Current running thread"/>
-      <member name="thread_run_next"            type="*os_thread_t"  offset="32" info="Next thread to run"/>
+      <member name="kernel_blocked"             type="uint8_t"              offset="9"  info="Kernel blocked"/>
+      <member name="kernel_pendISR"             type="uint8_t"              offset="10" info="Kernel pending ISR"/>
+      <member name="kernel_pendSV"              type="uint8_t"              offset="11" info="Kernel pending SV"/>
+      <member name="kernel_sys_freq"            type="uint32_t"             offset="12" info="Kernel system frequency"/>
+      <member name="kernel_tick"                type="uint64_t"             offset="16" info="Kernel tick counter"/>
+      <member name="tick_irqn"                  type="int32_t"              offset="24" info="Tick timer IRQ number"/>
+      <member name="thread_run_curr"            type="*osRtxThread_t"       offset="28" info="Current running thread"/>
+      <member name="thread_run_next"            type="*osRtxThread_t"       offset="32" info="Next thread to run"/>
 
       <!-- Inlined "os_object_t" structure at offset: 36 -->
-      <!-- <member name="thread_ready"          type="os_object_t"  offset="36" info="Ready list object"/>-->
-      <member name="thread_ready_id"            type="uint8_t"       offset="36+0" info="Object Identifier" />
-      <member name="thread_ready_state"         type="uint8_t"       offset="36+1" info="Object State" />
-      <member name="thread_ready_flags"         type="uint8_t"       offset="36+2" info="Object Flags" />
-      <member name="thread_ready_rsvd"          type="uint8_t"       offset="36+3" info="Reserved" />
-      <member name="thread_ready_name"          type="uint32_t"      offset="36+4" info="Object Name (type is *uint8_t)" />
-      <member name="thread_ready_thread_list"   type="*os_thread_t"  offset="36+8" info="Threads List" />
+      <member name="thread_ready_id"            type="uint8_t"              offset="36+0" info="Object Identifier" />
+      <member name="thread_ready_state"         type="uint8_t"              offset="36+1" info="Object State" />
+      <member name="thread_ready_flags"         type="uint8_t"              offset="36+2" info="Object Flags" />
+      <member name="thread_ready_rsvd"          type="uint8_t"              offset="36+3" info="Reserved" />
+      <member name="thread_ready_name"          type="uint32_t"             offset="36+4" info="Object Name (type is *uint8_t)" />
+      <member name="thread_ready_thread_list"   type="*osRtxThread_t"       offset="36+8" info="Threads List" />
 
-      <member name="thread_idle"                type="*os_thread_t"  offset="48" info="Idle thread"/>
-      <member name="thread_delay_list"          type="*os_thread_t"  offset="52" info="Delay list"/>
-      <member name="thread_wait_list"           type="*os_thread_t"  offset="56" info="Wait list (no timeout)"/>
-      <member name="thread_terminate_list"      type="*os_thread_t"  offset="60" info="Terminate list"/>
+      <member name="thread_idle"                type="*osRtxThread_t"       offset="48"  info="Idle thread"/>
+      <member name="thread_delay_list"          type="*osRtxThread_t"       offset="52"  info="Delay list"/>
+      <member name="thread_wait_list"           type="*osRtxThread_t"       offset="56"  info="Wait list (no timeout)"/>
+      <member name="thread_terminate_list"      type="*osRtxThread_t"       offset="60"  info="Terminate list"/>
 
-      <member name="thread_robin_thread"        type="*os_thread_t"  offset="64" info="Round Robin thread"/>
-      <member name="thread_robin_tick"          type="uint32_t"      offset="68" info="Round Robin time tick"/>
-      <member name="thread_timeout"             type="uint32_t"      offset="72" info="Round Robin timeout"/>
+      <member name="thread_robin_thread"        type="*osRtxThread_t"       offset="64"  info="Round Robin thread"/>
+      <member name="thread_robin_tick"          type="uint32_t"             offset="68"  info="Round Robin time tick"/>
+      <member name="thread_timeout"             type="uint32_t"             offset="72"  info="Round Robin timeout"/>
 
-      <member name="timer_list"                 type="*os_timer_t"   offset="76" info="Active timer list"/>
-      <member name="timer_thread"               type="*os_thread_t"  offset="80" info="Timer thread"/>
-      <member name="timer_mq"                   type="*os_message_queue_t" offset="84" info="Timer message queue"/>
+      <member name="timer_list"                 type="*osRtxTimer_t"        offset="76"  info="Active timer list"/>
+      <member name="timer_thread"               type="*osRtxThread_t"       offset="80"  info="Timer thread"/>
+      <member name="timer_mq"                   type="*osRtxMessageQueue_t" offset="84"  info="Timer message queue"/>
 
-      <member name="isr_queue_max"              type="uint16_t"      offset="88" info="Maximum items"/>
-      <member name="isr_queue_cnt"              type="uint16_t"      offset="90" info="Item count"/>
-      <member name="isr_queue_in"               type="uint16_t"      offset="92" info="Incoming item index"/>
-      <member name="isr_queue_out"              type="uint16_t"      offset="94" info="Outgoing item index"/>
-      <member name="isr_queue_data"             type="uint32_t"      offset="96" info="Queue data (value is void **)"/>
+      <member name="isr_queue_max"              type="uint16_t"             offset="88"  info="Maximum items"/>
+      <member name="isr_queue_cnt"              type="uint16_t"             offset="90"  info="Item count"/>
+      <member name="isr_queue_in"               type="uint16_t"             offset="92"  info="Incoming item index"/>
+      <member name="isr_queue_out"              type="uint16_t"             offset="94"  info="Outgoing item index"/>
+      <member name="isr_queue_data"             type="uint32_t"             offset="96"  info="Queue data (value is void **)"/>
 
-      <member name="post_process_thread"        type="uint32_t"      offset="100" info="Thread post processing function (value is func *)"/>
-      <member name="post_process_event_flags"   type="uint32_t"      offset="104" info="Event flags post processing function (value is func *)"/>
-      <member name="post_process_semaphore"     type="uint32_t"      offset="108" info="Semaphore post processing function (value is func *)"/>
-      <member name="post_process_memory_pool"   type="uint32_t"      offset="112" info="Memory pool post processing function (value is func *)"/>
-      <member name="post_process_message_queue" type="uint32_t"      offset="116" info="Message queue post processing function (value is func *)"/>
+      <member name="post_process_thread"        type="uint32_t"             offset="100" info="Thread post processing function (value is func *)"/>
+      <member name="post_process_event_flags"   type="uint32_t"             offset="104" info="Event flags post processing function (value is func *)"/>
+      <member name="post_process_semaphore"     type="uint32_t"             offset="108" info="Semaphore post processing function (value is func *)"/>
+      <member name="post_process_memory_pool"   type="uint32_t"             offset="112" info="Memory pool post processing function (value is func *)"/>
+      <member name="post_process_message_queue" type="uint32_t"             offset="116" info="Message queue post processing function (value is func *)"/>
 
-      <member name="mem_stack"                  type="uint32_t"      offset="120" info="Stack memory (value is void *)"/>
-      <member name="mem_mp_data"                type="uint32_t"      offset="124" info="Memory pool data memory (value is void *)"/>
-      <member name="mem_mq_data"                type="uint32_t"      offset="128" info="Message queue Data memory (value is void *)"/>
-      <member name="mem_common"                 type="uint32_t"      offset="132" info="Common memory address (value is void *)"/>
+      <member name="mem_stack"                  type="uint32_t"             offset="120" info="Stack memory (value is void *)"/>
+      <member name="mem_mp_data"                type="uint32_t"             offset="124" info="Memory pool data memory (value is void *)"/>
+      <member name="mem_mq_data"                type="uint32_t"             offset="128" info="Message queue Data memory (value is void *)"/>
+      <member name="mem_common"                 type="uint32_t"             offset="132" info="Common memory address (value is void *)"/>
 
-      <member name="mpi_stack"                  type="*os_mp_info_t" offset="136" info="Stack for threads"/>
-      <member name="mpi_thread"                 type="*os_mp_info_t" offset="140" info="Thread control blocks"/>
-      <member name="mpi_timer"                  type="*os_mp_info_t" offset="144" info="Timer control blocks"/>
-      <member name="mpi_event_flags"            type="*os_mp_info_t" offset="148" info="Event flags control blocks"/>
-      <member name="mpi_mutex"                  type="*os_mp_info_t" offset="152" info="Mutex control blocks"/>
-      <member name="mpi_semaphore"              type="*os_mp_info_t" offset="156" info="Semaphore control blocks"/>
-      <member name="mpi_memory_pool"            type="*os_mp_info_t" offset="160" info="Memory pool control blocks"/>
-      <member name="mpi_message_queue"          type="*os_mp_info_t" offset="164" info="Message queue control blocks"/>
+      <member name="mpi_stack"                  type="*osRtxMpInfo_t"       offset="136" info="Stack for threads"/>
+      <member name="mpi_thread"                 type="*osRtxMpInfo_t"       offset="140" info="Thread control blocks"/>
+      <member name="mpi_timer"                  type="*osRtxMpInfo_t"       offset="144" info="Timer control blocks"/>
+      <member name="mpi_event_flags"            type="*osRtxMpInfo_t"       offset="148" info="Event flags control blocks"/>
+      <member name="mpi_mutex"                  type="*osRtxMpInfo_t"       offset="152" info="Mutex control blocks"/>
+      <member name="mpi_semaphore"              type="*osRtxMpInfo_t"       offset="156" info="Semaphore control blocks"/>
+      <member name="mpi_memory_pool"            type="*osRtxMpInfo_t"       offset="160" info="Memory pool control blocks"/>
+      <member name="mpi_message_queue"          type="*osRtxMpInfo_t"       offset="164" info="Message queue control blocks"/>
     </typedef>
 
     <!-- OS Configuration structure -->
-    <typedef name="os_config_t" const="1" info="OS Configuration Structure" size="100">
+    <typedef name="osRtxConfig_t" const="1" info="OS Configuration Structure" size="100">
       <member name="flags"                 type="uint32_t" offset="0" info="OS configuration flags"/>
       <member name="tick_freq"             type="uint32_t" offset="4" info="Kernel tick frequency"/>
 
-      <member name="robin_timeout"         type="uint32_t" offset="8" info="Round Robim timeout tick"/>
+      <member name="robin_timeout"         type="uint32_t" offset="8"  info="Round Robim timeout tick"/>
       <member name="isr_queue_data"        type="uint32_t" offset="12" info="ISR post processing queue (value is void **)"/>
       <member name="isr_queue_max"         type="uint16_t" offset="14" info="Maximum data"/>
       <member name="isr_queue_padding"     type="uint16_t" offset="16" info="Padding bytes"/>
@@ -380,14 +441,14 @@
       <member name="mem_common_addr"       type="uint32_t" offset="44" info="Common memory address"/>
       <member name="mem_common_size"       type="uint32_t" offset="48" info="Common memory size"/>
 
-      <member name="mpi_stack"             type="*os_mp_info_t" offset="52" info="Stack for threads"/>
-      <member name="mpi_thread"            type="*os_mp_info_t" offset="56" info="Thread control blocks"/>
-      <member name="mpi_timer"             type="*os_mp_info_t" offset="60" info="Timer control blocks"/>
-      <member name="mpi_event_flags"       type="*os_mp_info_t" offset="64" info="Event flags control blocks"/>
-      <member name="mpi_mutex"             type="*os_mp_info_t" offset="68" info="Mutex control blocks"/>
-      <member name="mpi_semaphore"         type="*os_mp_info_t" offset="72" info="Semaphore control blocks"/>
-      <member name="mpi_memory_pool"       type="*os_mp_info_t" offset="76" info="Memory pool control blocks"/>
-      <member name="mpi_message_queue"     type="*os_mp_info_t" offset="80" info="Message queue control blocks"/>
+      <member name="mpi_stack"             type="*osRtxMpInfo_t" offset="52" info="Stack for threads"/>
+      <member name="mpi_thread"            type="*osRtxMpInfo_t" offset="56" info="Thread control blocks"/>
+      <member name="mpi_timer"             type="*osRtxMpInfo_t" offset="60" info="Timer control blocks"/>
+      <member name="mpi_event_flags"       type="*osRtxMpInfo_t" offset="64" info="Event flags control blocks"/>
+      <member name="mpi_mutex"             type="*osRtxMpInfo_t" offset="68" info="Mutex control blocks"/>
+      <member name="mpi_semaphore"         type="*osRtxMpInfo_t" offset="72" info="Semaphore control blocks"/>
+      <member name="mpi_memory_pool"       type="*osRtxMpInfo_t" offset="76" info="Memory pool control blocks"/>
+      <member name="mpi_message_queue"     type="*osRtxMpInfo_t" offset="80" info="Message queue control blocks"/>
 
       <member name="thread_stack_size"     type="uint32_t" offset="84"  info="Default thread stack size"/>
       <member name="idle_thread_attr"      type="uint32_t" offset="88"  info="Idle thread attributes (value is osThreadAttr_s *)"/>
@@ -409,6 +470,52 @@
       <member name="id"       type="uint8_t"      offset="8"  info="Object Identifier"/>
     </typedef>
 
+    <!-- Helper typedefs -->
+    <typedef name="rtx_t" info="Various RTX Definitions" size="8">
+      <member name="status" type="int32_t" offset="0" info="RTX5 operations status">
+        <enum name="osOK"                          value="0"   info="Operation completed successfully"/>
+        <enum name="osError"                       value="-1"  info="Unspecified RTOS error: run-time error but no other error message fits."/>
+        <enum name="osErrorTimeout"                value="-2"  info="Operation not completed within the timeout period."/>
+        <enum name="osErrorResource"               value="-3"  info="Resource not available"/>
+        <enum name="osErrorParameter"              value="-4"  info="Parameter error"/>
+        <enum name="osErrorNoMemory"               value="-5"  info="System is out of memory: it was impossible to allocate or reserve memory for the operation"/>
+        <enum name="osErrorISR"                    value="-6"  info="Not allowed in ISR context: the function cannot be called from interrupt service routines"/>
+        <enum name="osRtxErrorKernelNotReady"      value="-7"  info="RTOS Kernel scheduler is not ready"/>
+        <enum name="osRtxErrorKernelNotRunning"    value="-8"  info="RTOS Kernel scheduler is not running"/>
+        <enum name="osRtxErrorInvalidControlBlock" value="-9"  info="Object control block is not properly aligned or has an invalid size"/>
+        <enum name="osRtxErrorInvalidDataMemory"   value="-10" info="Data memory is not is not properly aligned or has an invalid size"/>
+        <enum name="osRtxErrorInvalidThreadStack"  value="-11" info="Thread stack is invalid"/>
+        <enum name="osRtxErrorInvalidPriority"     value="-12" info="Thread priority is invalid"/>
+        <enum name="osRtxErrorThreadNotJoinable"   value="-13" info="Thread is not joinable"/>
+        <enum name="osRtxErrorMutexNotOwned"       value="-14" info="Mutex is not owned by the current running thread"/>
+        <enum name="osRtxErrorMutexNotLocked"      value="-15" info="Mutex is not locked"/>
+        <enum name="osRtxErrorMutexLockLimit"      value="-16" info="Maximum number of recursive mutex locks reached"/>
+        <enum name="osRtxErrorSemaphoreCountLimit" value="-17" info="Semaphore count limit reached"/>
+        <enum name="osRtxErrorTZ_InitContext_S"    value="-18" info=""/>
+        <enum name="osRtxErrorTZ_AllocContext_S"   value="-19" info=""/>
+        <enum name="osRtxErrorTZ_FreeContext_S"    value="-20" info=""/>
+        <enum name="osRtxErrorTZ_LoadContext_S"    value="-21" info=""/>
+        <enum name="osRtxErrorTZ_SaveContext_S"    value="-22" info=""/>
+      </member>
+
+      <member name="thread_state" type="int32_t" offset="0" info="RTX5 thread state">
+        <enum name="os_ThreadInactive"           value="0x00"   info=""/>
+        <enum name="os_ThreadReady"              value="0x01"   info=""/>
+        <enum name="os_ThreadRunning"            value="0x02"   info=""/>
+        <enum name="os_ThreadBlocked"            value="0x03"   info=""/>
+        <enum name="os_ThreadTerminated"         value="0x04"   info=""/>
+        <enum name="os_ThreadWaitingDelay"       value="0x13"   info=""/>
+        <enum name="os_ThreadWaitingJoin"        value="0x23"   info=""/>
+        <enum name="os_ThreadWaitingThreadFlags" value="0x33"   info=""/>
+        <enum name="os_ThreadWaitingEventFlags"  value="0x43"   info=""/>
+        <enum name="os_ThreadWaitingMutex"       value="0x53"   info=""/>
+        <enum name="os_ThreadWaitingSemaphore"   value="0x63"   info=""/>
+        <enum name="os_ThreadWaitingMemoryPool"  value="0x73"   info=""/>
+        <enum name="os_ThreadWaitingMessageGet"  value="0x83"   info=""/>
+        <enum name="os_ThreadWaitingMessagePut"  value="0x93"   info=""/>
+      </member>
+    </typedef>
+
   </typedefs>
 
   <objects>
@@ -432,17 +539,17 @@
       <var name="StaticMp_En" type="uint8_t" value="0" />
 
       <!-- Read main OS information and configuration structures -->
-      <readlist name="os_Info"   type="os_info_t"   symbol="os_Info"   count="1" init="1"/>
-      <readlist name="os_Config" type="os_config_t" symbol="os_Config" count="1" init="1"/>
+      <readlist name="os_Info"   type="osRtxInfo_t"   symbol="osRtxInfo"   count="1" init="1"/>
+      <readlist name="os_Config" type="osRtxConfig_t" symbol="osRtxConfig" count="1" init="1"/>
 
       <!-- Read statically allocated control blocks -->
-      <readlist name="cfg_mp_thread"    cond="os_Config.mpi_thread"        type="os_mp_info_t" offset="os_Config.mpi_thread"        const="1" count="1" init="1"/>
-      <readlist name="cfg_mp_timer"     cond="os_Config.mpi_timer"         type="os_mp_info_t" offset="os_Config.mpi_timer"         const="1" count="1" init="1"/>
-      <readlist name="cfg_mp_events"    cond="os_Config.mpi_event_flags"   type="os_mp_info_t" offset="os_Config.mpi_event_flags"   const="1" count="1" init="1"/>
-      <readlist name="cfg_mp_mutex"     cond="os_Config.mpi_mutex"         type="os_mp_info_t" offset="os_Config.mpi_mutex"         const="1" count="1" init="1"/>
-      <readlist name="cfg_mp_semaphore" cond="os_Config.mpi_semaphore"     type="os_mp_info_t" offset="os_Config.mpi_semaphore"     const="1" count="1" init="1"/>
-      <readlist name="cfg_mp_mpool"     cond="os_Config.mpi_memory_pool"   type="os_mp_info_t" offset="os_Config.mpi_memory_pool"   const="1" count="1" init="1"/>
-      <readlist name="cfg_mp_mqueue"    cond="os_Config.mpi_message_queue" type="os_mp_info_t" offset="os_Config.mpi_message_queue" const="1" count="1" init="1"/>
+      <readlist name="cfg_mp_thread"    cond="os_Config.mpi_thread"        type="osRtxMpInfo_t" offset="os_Config.mpi_thread"        const="1" count="1" init="1"/>
+      <readlist name="cfg_mp_timer"     cond="os_Config.mpi_timer"         type="osRtxMpInfo_t" offset="os_Config.mpi_timer"         const="1" count="1" init="1"/>
+      <readlist name="cfg_mp_events"    cond="os_Config.mpi_event_flags"   type="osRtxMpInfo_t" offset="os_Config.mpi_event_flags"   const="1" count="1" init="1"/>
+      <readlist name="cfg_mp_mutex"     cond="os_Config.mpi_mutex"         type="osRtxMpInfo_t" offset="os_Config.mpi_mutex"         const="1" count="1" init="1"/>
+      <readlist name="cfg_mp_semaphore" cond="os_Config.mpi_semaphore"     type="osRtxMpInfo_t" offset="os_Config.mpi_semaphore"     const="1" count="1" init="1"/>
+      <readlist name="cfg_mp_mpool"     cond="os_Config.mpi_memory_pool"   type="osRtxMpInfo_t" offset="os_Config.mpi_memory_pool"   const="1" count="1" init="1"/>
+      <readlist name="cfg_mp_mqueue"    cond="os_Config.mpi_message_queue" type="osRtxMpInfo_t" offset="os_Config.mpi_message_queue" const="1" count="1" init="1"/>
 
       <calc cond="((os_Info.version / 10000000) == 5) &amp;&amp; (os_Info.kernel_state &gt; 0) &amp;&amp; (os_Info.kernel_state &lt; 5)">
         RTX_En = 1;
@@ -459,36 +566,36 @@
       <read name="ISR_FIFO" cond="RTX_En" type="uint32_t" offset="os_Config.isr_queue_data" size="os_Config.isr_queue_max"/>
 
       <!-- Read idle and timer thread control blocks -->
-      <readlist name="TCB" cond="RTX_En &amp;&amp; os_Info.thread_idle"  type="os_thread_t" offset="os_Info.thread_idle"  count="1" />
-      <readlist name="TCB" cond="RTX_En &amp;&amp; os_Info.timer_thread" type="os_thread_t" offset="os_Info.timer_thread" count="1" />
+      <readlist name="TCB" cond="RTX_En &amp;&amp; os_Info.thread_idle"  type="osRtxThread_t" offset="os_Info.thread_idle"  count="1" />
+      <readlist name="TCB" cond="RTX_En &amp;&amp; os_Info.timer_thread" type="osRtxThread_t" offset="os_Info.timer_thread" count="1" />
 
       <!-- Read thread control blocks (MPI) -->
-      <readlist name="mp_thread" cond="RTX_En &amp;&amp; os_Info.mpi_thread" type="os_mp_info_t" offset="os_Info.mpi_thread"   count="1" init="1"/>
-      <readlist name="TCB"       cond="RTX_En &amp;&amp; os_Info.mpi_thread" type="os_thread_t"  offset="mp_thread.block_base" count="mp_thread.max_blocks" />
+      <readlist name="mp_thread" cond="RTX_En &amp;&amp; os_Info.mpi_thread" type="osRtxMpInfo_t" offset="os_Info.mpi_thread"   count="1" init="1"/>
+      <readlist name="TCB"       cond="RTX_En &amp;&amp; os_Info.mpi_thread" type="osRtxThread_t" offset="mp_thread.block_base" count="mp_thread.max_blocks" />
 
       <!-- Read timer control blocks (MPI) -->
-      <readlist name="mp_timer" cond="RTX_En &amp;&amp; os_Info.mpi_timer" type="os_mp_info_t" offset="os_Info.mpi_timer"   count="1" init="1"/>
-      <readlist name="CCB"      cond="RTX_En &amp;&amp; os_Info.mpi_timer" type="os_timer_t"   offset="mp_timer.block_base" count="mp_timer.max_blocks" />
+      <readlist name="mp_timer" cond="RTX_En &amp;&amp; os_Info.mpi_timer" type="osRtxMpInfo_t" offset="os_Info.mpi_timer"   count="1" init="1"/>
+      <readlist name="CCB"      cond="RTX_En &amp;&amp; os_Info.mpi_timer" type="osRtxTimer_t"  offset="mp_timer.block_base" count="mp_timer.max_blocks" />
 
       <!-- Read event flags control blocks (MPI) -->
-      <readlist name="mp_events" cond="RTX_En &amp;&amp; os_Info.mpi_event_flags" type="os_mp_info_t"     offset="os_Info.mpi_event_flags" count="1" init="1"/>
-      <readlist name="ECB"       cond="RTX_En &amp;&amp; os_Info.mpi_event_flags" type="os_event_flags_t" offset="mp_events.block_base"    count="mp_events.max_blocks" />
+      <readlist name="mp_events" cond="RTX_En &amp;&amp; os_Info.mpi_event_flags" type="osRtxMpInfo_t"     offset="os_Info.mpi_event_flags" count="1" init="1"/>
+      <readlist name="ECB"       cond="RTX_En &amp;&amp; os_Info.mpi_event_flags" type="osRtxEventFlags_t" offset="mp_events.block_base"    count="mp_events.max_blocks" />
 
       <!-- Read mutex control blocks (MPI) -->
-      <readlist name="mp_mutex" cond="RTX_En &amp;&amp; os_Info.mpi_mutex" type="os_mp_info_t" offset="os_Info.mpi_mutex"   count="1" init="1"/>
-      <readlist name="MCB"      cond="RTX_En &amp;&amp; os_Info.mpi_mutex" type="os_mutex_t"   offset="mp_mutex.block_base" count="mp_mutex.max_blocks" />
+      <readlist name="mp_mutex" cond="RTX_En &amp;&amp; os_Info.mpi_mutex" type="osRtxMpInfo_t" offset="os_Info.mpi_mutex"   count="1" init="1"/>
+      <readlist name="MCB"      cond="RTX_En &amp;&amp; os_Info.mpi_mutex" type="osRtxMutex_t"  offset="mp_mutex.block_base" count="mp_mutex.max_blocks" />
 
       <!-- Read semaphore control blocks (MPI) -->
-      <readlist name="mp_semaphore" cond="RTX_En &amp;&amp; os_Info.mpi_semaphore" type="os_mp_info_t"   offset="os_Info.mpi_semaphore"   count="1" init="1"/>
-      <readlist name="SCB"          cond="RTX_En &amp;&amp; os_Info.mpi_semaphore" type="os_semaphore_t" offset="mp_semaphore.block_base" count="mp_semaphore.max_blocks" />
+      <readlist name="mp_semaphore" cond="RTX_En &amp;&amp; os_Info.mpi_semaphore" type="osRtxMpInfo_t"    offset="os_Info.mpi_semaphore"   count="1" init="1"/>
+      <readlist name="SCB"          cond="RTX_En &amp;&amp; os_Info.mpi_semaphore" type="osRtxSemaphore_t" offset="mp_semaphore.block_base" count="mp_semaphore.max_blocks" />
 
       <!-- Read memory pool control blocks (MPI) -->
-      <readlist name="mp_mpool" cond="RTX_En &amp;&amp; os_Info.mpi_memory_pool" type="os_mp_info_t"     offset="os_Info.mpi_memory_pool" count="1" init="1"/>
-      <readlist name="PCB"      cond="RTX_En &amp;&amp; os_Info.mpi_memory_pool" type="os_memory_pool_t" offset="mp_mpool.block_base"     count="mp_mpool.max_blocks" />
+      <readlist name="mp_mpool" cond="RTX_En &amp;&amp; os_Info.mpi_memory_pool" type="osRtxMpInfo_t"     offset="os_Info.mpi_memory_pool" count="1" init="1"/>
+      <readlist name="PCB"      cond="RTX_En &amp;&amp; os_Info.mpi_memory_pool" type="osRtxMemoryPool_t" offset="mp_mpool.block_base"     count="mp_mpool.max_blocks" />
 
       <!-- Read message queue control blocks (MPI) -->
-      <readlist name="mp_mqueue" cond="RTX_En &amp;&amp; os_Info.mpi_message_queue" type="os_mp_info_t"       offset="os_Info.mpi_message_queue" count="1" init="1"/>
-      <readlist name="QCB"       cond="RTX_En &amp;&amp; os_Info.mpi_message_queue" type="os_message_queue_t" offset="mp_mqueue.block_base"      count="mp_mqueue.max_blocks" />
+      <readlist name="mp_mqueue" cond="RTX_En &amp;&amp; os_Info.mpi_message_queue" type="osRtxMpInfo_t"       offset="os_Info.mpi_message_queue" count="1" init="1"/>
+      <readlist name="QCB"       cond="RTX_En &amp;&amp; os_Info.mpi_message_queue" type="osRtxMessageQueue_t" offset="mp_mqueue.block_base"      count="mp_mqueue.max_blocks" />
 
       <!-- Read common memory pool block info (MEM) -->
       <readlist name="mem_bl" cond="RTX_En &amp;&amp; os_Info.mem_common" type="mem_block_t" offset="os_Info.mem_common + 8" next="next"/>
@@ -500,29 +607,29 @@
         </calc>
 
         <!-- Read Thread Control Block -->
-        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 1)" name="TCB" type="os_thread_t" offset="addr" count="1" />
+        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 1)" name="TCB" type="osRtxThread_t" offset="addr" count="1" />
 
         <!-- Read Timer Control Block -->
-        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 2)" name="CCB" type="os_timer_t" offset="addr" count="1" />
+        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 2)" name="CCB" type="osRtxTimer_t" offset="addr" count="1" />
 
         <!-- Read EventFlags Control Block -->
-        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 3)" name="ECB" type="os_event_flags_t" offset="addr" count="1" />
+        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 3)" name="ECB" type="osRtxEventFlags_t" offset="addr" count="1" />
 
         <!-- Read Mutex Control Block -->
-        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 4)" name="MCB" type="os_mutex_t" offset="addr" count="1" />
+        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 4)" name="MCB" type="osRtxMutex_t" offset="addr" count="1" />
 
         <!-- Read Semaphore Control Block -->
-        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 5)" name="SCB" type="os_semaphore_t" offset="addr" count="1" />
+        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 5)" name="SCB" type="osRtxSemaphore_t" offset="addr" count="1" />
 
         <!-- Read MemoryPool Control Block -->
-        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 6)" name="PCB" type="os_memory_pool_t" offset="addr" count="1" />
+        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 6)" name="PCB" type="osRtxMemoryPool_t" offset="addr" count="1" />
 
         <!-- Read MessageQueue Control Block -->
-        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 8)" name="QCB" type="os_message_queue_t" offset="addr" count="1" />
+        <readlist cond="(mem_bl[i].len &amp; 1) &amp;&amp; (mem_bl[i].id == 8)" name="QCB" type="osRtxMessageQueue_t" offset="addr" count="1" />
       </list>
 
       <!-- Read thread wait list -->
-      <readlist name="TWL" cond="RTX_En &amp;&amp; os_Info.thread_wait_list" type="os_thread_t" offset="os_Info.thread_wait_list" next="delay_next"/>
+      <readlist name="TWL" cond="RTX_En &amp;&amp; os_Info.thread_wait_list" type="osRtxThread_t" offset="os_Info.thread_wait_list" next="delay_next"/>
 
       <!-- Validate and process Thread control blocks -->
       <list name="i" start="0" limit="TCB._count">
@@ -600,7 +707,7 @@
         </calc>
 
         <!-- Create Thread Delay List (TDL) -->
-        <readlist cond="TCB[i].delay != -1" name="TDL" type="os_thread_t" offset="TCB[i].delay_prev" next="delay_prev" init="1"/>
+        <readlist cond="TCB[i].delay != -1" name="TDL" type="osRtxThread_t" offset="TCB[i].delay_prev" next="delay_prev" init="1"/>
 
         <list cond="TCB[i].delay != -1" name="j" start="0" limit="TDL._count">
           <calc>
@@ -635,7 +742,7 @@
         </calc>
 
         <!-- Create Timer Execution List (TEL) -->
-        <readlist name="TEL" type="os_timer_t" offset="CCB[i].prev" next="prev" init="1"/>
+        <readlist name="TEL" type="osRtxTimer_t" offset="CCB[i].prev" next="prev" init="1"/>
 
         <list name="j" start="0" limit="TEL._count">
           <calc>
@@ -671,7 +778,7 @@
         </calc>
 
         <!-- Create a list of threads waiting for event flags -->
-        <readlist name="EWL" type="os_thread_t" offset="ECB[i].thread_list" next="thread_next" />
+        <readlist name="EWL" type="osRtxThread_t" offset="ECB[i].thread_list" next="thread_next" />
 
         <calc>
           ECB[i].wl_cnt = (EWL._count - k);
@@ -706,7 +813,7 @@
         </calc>
 
         <!-- Create a list of threads waiting for mutex -->
-        <readlist name="MWL" type="os_thread_t" offset="MCB[i].thread_list" next="thread_next" />
+        <readlist name="MWL" type="osRtxThread_t" offset="MCB[i].thread_list" next="thread_next" />
 
         <calc>
           MCB[i].wl_cnt = (MWL._count - k);
@@ -742,7 +849,7 @@
         </calc>
 
         <!-- Create a list of threads waiting for semaphore -->
-        <readlist name="SWL" type="os_thread_t" offset="SCB[i].thread_list" next="thread_next" />
+        <readlist name="SWL" type="osRtxThread_t" offset="SCB[i].thread_list" next="thread_next" />
 
         <calc>
           SCB[i].wl_cnt = (SWL._count - k);
@@ -777,7 +884,7 @@
         </calc>
 
         <!-- Create a list of threads waiting for memory pool -->
-        <readlist name="PWL" type="os_thread_t" offset="PCB[i].thread_list" next="thread_next" />
+        <readlist name="PWL" type="osRtxThread_t" offset="PCB[i].thread_list" next="thread_next" />
 
         <calc>
           PCB[i].wl_cnt = (PWL._count - k);
@@ -813,7 +920,7 @@
         </calc>
 
         <!-- Create a list of threads waiting for message queue -->
-        <readlist name="QWL" type="os_thread_t" offset="QCB[i].thread_list" next="thread_next" />
+        <readlist name="QWL" type="osRtxThread_t" offset="QCB[i].thread_list" next="thread_next" />
 
         <calc>
           QCB[i].wl_cnt = (QWL._count - k);
@@ -838,7 +945,7 @@
         </list>
 
         <!-- Create a list of enqueued messages -->
-        <readlist name="QML" type="os_message_t" offset="QCB[i].msg_first" next="next" />
+        <readlist name="QML" type="osRtxMessage_t" offset="QCB[i].msg_first" next="next" />
 
         <calc>
           QCB[i].ml_idx = j;
@@ -1148,4 +1255,202 @@
       </out>
     </object>
   </objects>
+
+  <events>
+
+    <group name="RTX5 RTOS">
+      <component name="Memory Events"       brief="RTX Memory"    no="0xF0" prefix="EvrRtx" info="RTX5 RTOS Memory Management Events" />
+      <component name="Kernel Events"       brief="RTX Kernel"    no="0xF1" prefix="EvrRtx" info="RTX5 RTOS Kernel Events" />
+      <component name="Thread Events"       brief="RTX Thread"    no="0xF2" prefix="EvrRtx" info="RTX5 RTOS Thread Events" />
+      <component name="Timer Events"        brief="RTX Timer"     no="0xF3" prefix="EvrRtx" info="RTX5 RTOS Timer Events" />
+      <component name="EventFlags Events"   brief="RTX EvFlags"   no="0xF4" prefix="EvrRtx" info="RTX5 RTOS EventFlags Events" />
+      <component name="Mutex Events"        brief="RTX Mutex"     no="0xF5" prefix="EvrRtx" info="RTX5 RTOS Mutex Events" />
+      <component name="Semaphore Events"    brief="RTX Semaphore" no="0xF6" prefix="EvrRtx" info="RTX5 RTOS Semaphore Events" />
+      <component name="MemoryPool Events"   brief="RTX MemPool"   no="0xF7" prefix="EvrRtx" info="RTX5 RTOS MemoryPool Events" />
+      <component name="MessageQueue Events" brief="RTX MsgQueue"  no="0xF8" prefix="EvrRtx" info="RTX5 RTOS MessageQueue Events" />
+    </group>
+
+    <event id="0xF000 + 0x00" level="Op" property="MemoryInit"       value="mem=%x[val1], size=%d[val2], result=%d[val3]" info=""/>
+    <event id="0xF000 + 0x01" level="Op" property="MemoryAlloc"      value="mem=%x[val1], size=%d[val2], type=%d[val3], block=%x[val4]" info=""/>
+    <event id="0xF000 + 0x02" level="Op" property="MemoryFree"       value="mem=%x[val1], block=%x[val2], result=%d[val3]" info=""/>
+    <event id="0xF000 + 0x03" level="Op" property="MemoryBlockInit"  value="mp_info=%x[val1], block_count=%d[val2], block_size=%d[val3], block_mem=%x[val4]" info=""/>
+    <event id="0xF000 + 0x04" level="Op" property="MemoryBlockAlloc" value="mp_info=%x[val1], block=%x[val2]" info=""/>
+    <event id="0xF000 + 0x05" level="Op" property="MemoryBlockFree"  value="mp_info=%x[val1], block=%x[val2], status=%E[val3, rtx_t:status]" info=""/>
+
+    <event id="0xF100 + 0x00" level="Error"  property="KernelError"               value="status=%E[val1, rtx_t:status]" info="Kernel error occurred."/>
+    <event id="0xF100 + 0x01" level="API"    property="KernelInitialize"          value="" info="osKernelInitialize function was called."/>
+    <event id="0xF100 + 0x02" level="Op"     property="KernelInitializeCompleted" value="" info="Kernel was initialized."/>
+    <event id="0xF100 + 0x03" level="API"    property="KernelGetInfo"             value="version=%x[val1], id_buf=%x[val2], id_size=%d[val3]" info="osKernelGetInfo function was called."/>
+    <event id="0xF100 + 0x04" level="Op"     property="KernelInfoRetrieved"       value="version=%x[val1], id_buf=%x[val2]" info="Kernel information was retrieved."/>
+    <event id="0xF100 + 0x05" level="Detail" property="KernelInfoRetrieved"       value="id_buf=%t[val1]" info="Kernel ID as ASCII string."/>
+    <event id="0xF100 + 0x06" level="API"    property="KernelGetState"            value="state=%E[val1, os_Info:kernel_state]" info="osKernelGetState function was called and state was retrieved."/>
+    <event id="0xF100 + 0x07" level="API"    property="KernelStart"               value="" info="osKernelStart function was called."/>
+    <event id="0xF100 + 0x08" level="Op"     property="KernelStarted"             value="" info="Kernel execution was started."/>
+    <event id="0xF100 + 0x09" level="API"    property="KernelLock"                value="" info="osKernelLock function was called."/>
+    <event id="0xF100 + 0x0A" level="Op"     property="KernelLocked"              value="lock=%d[val1]" info="Kernel was locked."/>
+    <event id="0xF100 + 0x0B" level="API"    property="KernelUnlock"              value="" info="osKernelUnlock function was called."/>
+    <event id="0xF100 + 0x0C" level="Op"     property="KernelUnlocked"            value="lock=%d[val1]" info="Kernel was unlocked."/>
+    <event id="0xF100 + 0x0D" level="API"    property="KernelRestoreLock"         value="lock=%d[val1]" info="osKernelRestoreLock function was called."/>
+    <event id="0xF100 + 0x0E" level="Op"     property="KernelLockRestored"        value="lock=%d[val1]" info="Kernel lock was restored."/>
+    <event id="0xF100 + 0x0F" level="API"    property="KernelSuspend"             value="" info="osKernelSuspend function was called."/>
+    <event id="0xF100 + 0x10" level="Op"     property="KernelSuspended"           value="sleep_ticks=%d[val1]" info="Kernel execution was suspended."/>
+    <event id="0xF100 + 0x11" level="API"    property="KernelResume"              value="sleep_ticks=%d[val1]" info="osKernelResume function was called."/>
+    <event id="0xF100 + 0x12" level="Op"     property="KernelResumed"             value="" info="Kernel execution was resumed."/>
+    <event id="0xF100 + 0x13" level="API"    property="KernelGetTickCount"        value="count=%d[((uint64)val2 &lt;&lt; 32) | val1]" info="osKernelGetTickCount function was called."/>
+    <event id="0xF100 + 0x14" level="API"    property="KernelGetTickFreq"         value="freq=%d[val1]" info="osKernelGetTickFreq function was called."/>
+    <event id="0xF100 + 0x15" level="API"    property="KernelGetSysTimerCount"    value="count=%d[val1]" info="osKernelGetSysTimerCount function was called."/>
+    <event id="0xF100 + 0x16" level="API"    property="KernelGetSysTimerFreq"     value="freq=%d[va1]" info="osKernelGetSysTimerFreq function was called."/>
+
+    <event id="0xF200 + 0x00" level="Error"  property="ThreadError"                 value="thread_id=%x[val1], status=%E[val2, rtx_t:status]" info="Thread error occurred."/>
+    <event id="0xF200 + 0x01" level="API"    property="ThreadNew"                   value="func=%S[val1], argument=%x[val2], attr=%x[val3]" info="osThreadNew function was called."/>
+    <event id="0xF200 + 0x02" level="Detail" property="ThreadNew"                   value="name=%x[val1.name], attr_bits=%x[val1.attr_bits], cb_mem=%x[val1.cb_mem], cb_size=%d[val1.cb_size], stack_mem=%x[val1.stack_mem], stack_size=%d[val1.stack_size], priority=%E[val1.priority, osRtxThread_t:priority]" val1="osThreadAttr_t" info="Attributes structure for thread object."/>
+    <event id="0xF200 + 0x03" level="Op"     property="ThreadCreated"               value="thread_id=%x[val1]" info="Thread object was created."/>
+    <event id="0xF200 + 0x04" level="API"    property="ThreadGetName"               value="thread_id=%x[val1], name=%x[val2]" info="osThreadGetName function was called and object name was retrieved."/>
+    <event id="0xF200 + 0x05" level="Detail" property="ThreadGetName"               value="name=%t[val1]" info="Thread object name as ASCII string."/>
+    <event id="0xF200 + 0x06" level="API"    property="ThreadGetId"                 value="thread_id=%x[val1]" info="osThreadGetId function was called and current running thread id was retrieved."/>
+    <event id="0xF200 + 0x07" level="API"    property="ThreadGetState"              value="thread_id=%x[val1], state=%E[val2, rtx_t:thread_state]" info="osThreadGetState function was called and thread state was retrieved."/>
+    <event id="0xF200 + 0x08" level="API"    property="ThreadGetStackSize"          value="thread_id=%x[val1], stack_size=%d[val2]" info="osThreadGetStackSize function was called and thread stack size was retrieved."/>
+    <event id="0xF200 + 0x09" level="API"    property="ThreadGetStackSpace"         value="thread_id=%x[val1], stack_space=%d[val2]" info="osThreadGetStackSpace function was called and thread stack space was retrieved."/>
+    <event id="0xF200 + 0x0A" level="API"    property="ThreadSetPriority"           value="thread_id=%x[val1], priority=%E[val1, osRtxThread_t:priority]" info="osThreadSetPriority function was called."/>
+    <event id="0xF200 + 0x0B" level="API"    property="ThreadGetPriority"           value="thread_id=%x[val1], priority=%E[val1, osRtxThread_t:priority]" info="osThreadGetPriority function was called and thread priority was retrieved."/>
+    <event id="0xF200 + 0x0C" level="API"    property="ThreadYield"                 value="" info="osThreadYield function was called."/>
+    <event id="0xF200 + 0x0D" level="API"    property="ThreadSuspend"               value="thread_id=%x[val1]" info="osThreadSuspend function was called."/>
+    <event id="0xF200 + 0x0E" level="Op"     property="ThreadSuspended"             value="thread_id=%x[val1]" info="Thread execution was suspended."/>
+    <event id="0xF200 + 0x0F" level="API"    property="ThreadResume"                value="thread_id=%x[val1]" info="osThreadResume function was called."/>
+    <event id="0xF200 + 0x10" level="Op"     property="ThreadResumed"               value="thread_id=%x[val1]" info="Thread execution was resumed."/>
+    <event id="0xF200 + 0x11" level="API"    property="ThreadDetach"                value="thread_id=%x[val1]" info="osThreadDetach function was called."/>
+    <event id="0xF200 + 0x12" level="Op"     property="ThreadDetached"              value="thread_id=%x[val1]" info="Thread was detached."/>
+    <event id="0xF200 + 0x13" level="API"    property="ThreadJoin"                  value="thread_id=%x[val1]" info="osThreadJoin function was called."/>
+    <event id="0xF200 + 0x14" level="Op"     property="ThreadJoinPending"           value="thread_id=%x[val1]" info="Thread join is pending."/>
+    <event id="0xF200 + 0x15" level="Op"     property="ThreadJoined"                value="thread_id=%x[val1]" info="Thread joined."/>
+    <event id="0xF200 + 0x16" level="Op"     property="ThreadBlocked"               value="thread=%x[val1], timeout=%d[val2]" info="Current running thread execution was blocked."/>
+    <event id="0xF200 + 0x17" level="Op"     property="ThreadUnblocked"             value="thread=%x[val1], ret_val=%E[val2, rtx_t:status]" info="Thread execution was unblocked."/>
+    <event id="0xF200 + 0x18" level="Op"     property="ThreadSwitch"                value="thread=%x[val1]" info="Switched execution of the current running thread."/>
+    <event id="0xF200 + 0x19" level="API"    property="ThreadExit"                  value="" info="osThreadExit function was called."/>
+    <event id="0xF200 + 0x1A" level="API"    property="ThreadTerminate"             value="thread_id=%x[val1]" info="osThreadTerminate function was called."/>
+    <event id="0xF200 + 0x1B" level="Op"     property="ThreadDestroyed"             value="thread_id=%x[val1]" info="Thread execution was terminated."/>
+    <event id="0xF200 + 0x1C" level="API"    property="ThreadGetCount"              value="count=%d[val1]" info="osThreadGetCount function was called and number of active threads was retrieved."/>
+    <event id="0xF200 + 0x1D" level="API"    property="ThreadEnumerate"             value="thread_array=%x[val1], array_items=%d[val2], count=%d[val3]" info="osThreadEnumerate function was called and active threads were enumerated."/>
+    <event id="0xF200 + 0x1E" level="API"    property="ThreadFlagsSet"              value="thread_id=%x[val1], flags=%x[val2]" info="osThreadFlagsSet function was called."/>
+    <event id="0xF200 + 0x1F" level="Op"     property="ThreadFlagsSetDone"          value="thread_id=%x[val1], thread_flags=%x[val2]" info="Thread flags were set."/>
+    <event id="0xF200 + 0x20" level="API"    property="ThreadFlagsClear"            value="flags=%x[val1]" info="osThreadFlagsClear function was called."/>
+    <event id="0xF200 + 0x21" level="Op"     property="ThreadFlagsClearDone"        value="thread_flags=%x[val1]" info="Thread flags were cleared."/>
+    <event id="0xF200 + 0x22" level="API"    property="ThreadFlagsGet"              value="thread_flags=%x[val1]" info="osThreadFlagsGet function was called and thread flags were retrieved."/>
+    <event id="0xF200 + 0x23" level="API"    property="ThreadFlagsWait"             value="flags=%x[val1], options=%x[val2], timeout=%d[val3]" info="osThreadFlagsWait function was called."/>
+    <event id="0xF200 + 0x24" level="Op"     property="ThreadFlagsWaitPending"      value="flags=%x[val1], options=%x[val2], timeout=%d[val3]" info="Waiting for thread flags to become signaled."/>
+    <event id="0xF200 + 0x25" level="Op"     property="ThreadFlagsWaitCompleted"    value="flags=%x[val1], options=%x[val2], thread_flags=%x[val3]" info="Wait for thread flags completed."/>
+    <event id="0xF200 + 0x26" level="Op"     property="ThreadFlagsWaitNotCompleted" value="flags=%x[val1], options=%x[val2]" info="Wait for thread flags not completed."/>
+    <event id="0xF200 + 0x27" level="API"    property="Delay"                       value="ticks=%d[val1]" info="osDelay function was called."/>
+    <event id="0xF200 + 0x28" level="API"    property="DelayUntil"                  value="ticks=%d[((uint64)val2 &lt;&lt; 32) | val1]" info="osDelayUntil function was called."/>
+
+    <event id="0xF300 + 0x00" level="Error"  property="TimerError"     value="timer_id=%x[val1], status=%E[val2, rtx_t:status]" info="Timer error occurred."/>
+    <event id="0xF300 + 0x01" level="Op"     property="TimerCallback"  value="func=%S[val1], argument=%x[val2]" info="Timer callback function was called."/>
+    <event id="0xF300 + 0x02" level="API"    property="TimerNew"       value="func=%S[val1], type=%E[val2, osRtxTimer_t:type], argument=%x[val3], attr=%x[val4]" info="osTimerNew function was called."/>
+    <event id="0xF300 + 0x03" level="Detail" property="TimerNew"       value="name=%x[val1.name], attr_bits=%x[val1.attr_bits], cb_mem=%x[val1.cb_mem], cb_size=%d[val1.cb_size]" val1="osTimerAttr_t" info="Attributes structure for timer object."/>
+    <event id="0xF300 + 0x04" level="Op"     property="TimerCreated"   value="timer_id=%x[val1]" info="Timer object was created."/>
+    <event id="0xF300 + 0x05" level="API"    property="TimerGetName"   value="timer_id=%x[val1], name=%x[val2]" info="osTimerGetName function was called and object name was retrieved."/>
+    <event id="0xF300 + 0x06" level="Detail" property="TimerGetName"   value="name=%t[val1]" info="Timer object name as ASCII string."/>
+    <event id="0xF300 + 0x07" level="API"    property="TimerStart"     value="timer_id=%x[val1], ticks=%d[val2]" info="osTimerStart function was called."/>
+    <event id="0xF300 + 0x08" level="Op"     property="TimerStarted"   value="timer_id=%x[val1]" info="Timer execution was started."/>
+    <event id="0xF300 + 0x09" level="API"    property="TimerStop"      value="timer_id=%x[val1]" info="osTimerStop function was called."/>
+    <event id="0xF300 + 0x0A" level="Op"     property="TimerStopped"   value="timer_id=%x[val1]" info="Timer execution was stopped."/>
+    <event id="0xF300 + 0x0B" level="API"    property="TimerIsRunning" value="timer_id=%x[val1], running=%d[val2]" info="osTimerIsRunning function was called and timer running state was retrieved."/>
+    <event id="0xF300 + 0x0C" level="API"    property="TimerDelete"    value="timer_id=%x[val1]" info="osTimerDelete function was called."/>
+    <event id="0xF300 + 0x0D" level="Op"     property="TimerDestroyed" value="timer_id=%x[val1]" info="Timer object was deleted."/>
+
+    <event id="0xF400 + 0x00" level="Error"  property="EventFlagsError"            value="ef_id=%x[val1], status=%E[val2, rtx_t:status]" info="Event flags error occurred."/>
+    <event id="0xF400 + 0x01" level="API"    property="EventFlagsNew"              value="attr=%x[val1]" info="osEventFlagsNew function was called."/>
+    <event id="0xF400 + 0x02" level="Detail" property="EventFlagsNew"              value="name=%x[val1.name], attr_bits=%x[val1.attr_bits], cb_mem=%x[val1.cb_mem], cb_size=%d[val1.cb_size]" val1="osEventFlagsAttr_t" info="Attributes structure for event flags object."/>
+    <event id="0xF400 + 0x03" level="Op"     property="EventFlagsCreated"          value="ef_id=%x[val1]" info="Event flags object was created."/>
+    <event id="0xF400 + 0x04" level="API"    property="EventFlagsGetName"          value="ef_id=%x[val1], name=%x[val2]" info="osEventFlagsGetName function was called and object name was retrieved."/>
+    <event id="0xF400 + 0x05" level="Detail" property="EventFlagsGetName"          value="name=%t[val1]" info="Event flags object name as ASCII string."/>
+    <event id="0xF400 + 0x06" level="API"    property="EventFlagsSet"              value="ef_id=%x[val1], flags=%x[val2]" info="osEventFlagsSet function was called."/>
+    <event id="0xF400 + 0x07" level="Op"     property="EventFlagsSetDone"          value="ef_id=%x[val1], event_flags=%x[val2]" info="Event flags were set."/>
+    <event id="0xF400 + 0x08" level="API"    property="EventFlagsClear"            value="ef_id=%x[val1], flags=%x[val2]" info="osEventFlagsClear function was called."/>
+    <event id="0xF400 + 0x09" level="Op"     property="EventFlagsClearDone"        value="ef_id=%x[val1], event_flags=%x[val2]" info="Event flags were cleared."/>
+    <event id="0xF400 + 0x0A" level="API"    property="EventFlagsGet"              value="ef_id=%x[val1], event_flags=%x[val2]" info="osEventFlagsGet function was called and current event flags were retrieved."/>
+    <event id="0xF400 + 0x0B" level="API"    property="EventFlagsWait"             value="ef_id=%x[val1], flags=%x[val2], options=%x[val3], timeout=%d[val4]" info="osEventFlagsWait function was called."/>
+    <event id="0xF400 + 0x0C" level="Op"     property="EventFlagsWaitPending"      value="ef_id=%x[val1], flags=%x[val2], options=%x[val3], timeout=%d[val4]" info="Event flags wait is pending."/>
+    <event id="0xF400 + 0x0D" level="Op"     property="EventFlagsWaitCompleted"    value="ef_id=%x[val1], flags=%x[val2], options=%x[val3], event_flags=%x[val4]" info="Event flags wait completed."/>
+    <event id="0xF400 + 0x0E" level="Op"     property="EventFlagsWaitNotCompleted" value="ef_id=%x[val1], flags=%x[val2], options=%x[val3]" info="Event flags wait not completed."/>
+    <event id="0xF400 + 0x0F" level="API"    property="EventFlagsDelete"           value="ef_id=%x[val1]" info="osEventFlagsDelete function was called."/>
+    <event id="0xF400 + 0x10" level="Op"     property="EventFlagsDestroyed"        value="ef_id=%x[val1]" info="Event flags object was deleted."/>
+
+    <event id="0xF500 + 0x00" level="Error"  property="MutexError"          value="mutex_id=%x[val1], status=%E[val2, rtx_t:status]" info="Mutex error occurred."/>
+    <event id="0xF500 + 0x01" level="API"    property="MutexNew"            value="attr=%x[val1]" info="osMutexNew function was called"/>
+    <event id="0xF500 + 0x02" level="Detail" property="MutexNew"            value="name=%x[val1.name], attr_bits=%x[val1.attr_bits], cb_mem=%x[val1.cb_mem], cb_size=%d[val1.cb_size]" val1="osMutexAttr_t" info="Attributes structure for mutex object."/>
+    <event id="0xF500 + 0x03" level="Op"     property="MutexCreated"        value="mutex_id=%x[val1]" info="Mutex object was created"/>
+    <event id="0xF500 + 0x04" level="API"    property="MutexGetName"        value="mutex_id=%x[val1], name=%x[val2]" info="osMutexGetName function was called and object name was retrieved."/>
+    <event id="0xF500 + 0x05" level="Detail" property="MutexGetName"        value="name=%t[val1]" info="Mutex object name as ASCII string."/>
+    <event id="0xF500 + 0x06" level="API"    property="MutexAcquire"        value="mutex_id=%x[val1], timeout=%d[val2]" info="osMutexAcquire function was called."/>
+    <event id="0xF500 + 0x07" level="Op"     property="MutexAcquirePending" value="mutex_id=%x[val1], timeout=%d[val2]" info="Mutex object acquire is pending."/>
+    <event id="0xF500 + 0x08" level="Op"     property="MutexAcquired"       value="mutex_id=%x[val1], lock=%d[val2]" info="Mutex object was acquired."/>
+    <event id="0xF500 + 0x09" level="Op"     property="MutexNotAcquired"    value="mutex_id=%x[val1]" info="Mutex object was not acquired."/>
+    <event id="0xF500 + 0x0A" level="API"    property="MutexRelease"        value="mutex_id=%x[val1]" info="osMutexRelease function was called."/>
+    <event id="0xF500 + 0x0B" level="Op"     property="MutexReleased"       value="mutex_id=%x[val1], lock=%d[val2]" info="Mutex object was released."/>
+    <event id="0xF500 + 0x0C" level="API"    property="MutexGetOwner"       value="mutex_id=%x[val1], thread_id=%x[val2]" info="osMutexGetOwner function was called and mutex owner thread was retrieved."/>
+    <event id="0xF500 + 0x0D" level="API"    property="MutexDelete"         value="mutex_id=%x[val1]" info="osMutexDelete function was called."/>
+    <event id="0xF500 + 0x0E" level="Op"     property="MutexDestroyed"      value="mutex_id=%x[val1]" info="Mutex object was deleted."/>
+
+    <event id="0xF600 + 0x00" level="Error"  property="SemaphoreError"          value="semaphore_id=%x[val1], status=%E[val2, rtx_t:status]" info="Semaphore error occurred."/>
+    <event id="0xF600 + 0x01" level="API"    property="SemaphoreNew"            value="max_count=%d[val1], initial_count=%d[val2], attr=%x[val3]" info="osSemaphoreNew function was called."/>
+    <event id="0xF600 + 0x02" level="Detail" property="SemaphoreNew"            value="name=%x[val1.name], attr_bits=%x[val1.attr_bits], cb_mem=%x[val1.cb_mem], cb_size=%d[val1.cb_size]" val1="osSemaphoreAttr_t" info="Attributes structure for semaphore object."/>
+    <event id="0xF600 + 0x03" level="Op"     property="SemaphoreCreated"        value="semaphore_id=%x[val1]" info="Semaphore object was created."/>
+    <event id="0xF600 + 0x04" level="API"    property="SemaphoreGetName"        value="semaphore_id=%x[val1], name=%x[val2]" info="osSemaphoreGetName function was called and object name was retrieved."/>
+    <event id="0xF600 + 0x05" level="Detail" property="SemaphoreGetName"        value="name=%t[val1]" info="Semaphore object name as ASCII string."/>
+    <event id="0xF600 + 0x06" level="API"    property="SemaphoreAcquire"        value="semaphore_id=%x[val1], timeout=%d[val2]" info="osSemaphoreAcquire function was called."/>
+    <event id="0xF600 + 0x07" level="Op"     property="SemaphoreAcquirePending" value="semaphore_id=%x[val1], timeout=%d[val2]" info="Semaphore object acquire is pending."/>
+    <event id="0xF600 + 0x08" level="Op"     property="SemaphoreAcquired"       value="semaphore_id=%x[val1]" info="Semaphore object was acquired."/>
+    <event id="0xF600 + 0x09" level="Op"     property="SemaphoreNotAcquired"    value="semaphore_id=%x[val1]" info="Semaphore object was not acquired."/>
+    <event id="0xF600 + 0x0A" level="API"    property="SemaphoreRelease"        value="semaphore_id=%x[val1]" info="osSemaphoreRelease function was called."/>
+    <event id="0xF600 + 0x0B" level="Op"     property="SemaphoreReleased"       value="semaphore_id=%x[val1]" info="Semaphore object was released."/>
+    <event id="0xF600 + 0x0C" level="API"    property="SemaphoreGetCount"       value="semaphore_id=%x[val1], count=%d[val2]" info="osSemaphoreGetCount function was called and current number of available tokens was retrieved."/>
+    <event id="0xF600 + 0x0D" level="API"    property="SemaphoreDelete"         value="semaphore_id=%x[val1]" info="osSemaphoreDelete function was called."/>
+    <event id="0xF600 + 0x0E" level="Op"     property="SemaphoreDestroyed"      value="semaphore_id=%x[val1]" info="Semaphore object was deleted."/>
+
+    <event id="0xF700 + 0x00" level="Error"  property="MemoryPoolError"        value="mp_id=%x[val1], status=%E[val2, rtx_t:status]" info="Memory pool error occurred."/>
+    <event id="0xF700 + 0x01" level="API"    property="MemoryPoolNew"          value="block_count=%d[val1], block_size=%d[val2], attr=%x[val3]" info="osMemoryPoolNew function was called."/>
+    <event id="0xF700 + 0x02" level="Detail" property="MemoryPoolNew"          value="name=%x[val1.name], attr_bits=%x[val1.attr_bits], cb_mem=%x[val1.cb_mem], cb_size=%d[val1.cb_size], mp_mem=%x[val1.mp_mem], mp_size=%d[val1.mp_size]" val1="osMemoryPoolAttr_t" info="Attributes structure for memory pool object."/>
+    <event id="0xF700 + 0x03" level="Op"     property="MemoryPoolCreated"      value="mp_id=%x[val1]" info="Memory Pool object was created"/>
+    <event id="0xF700 + 0x04" level="API"    property="MemoryPoolGetName"      value="mp_id=%x[val1], name=%x[val2]" info="osMemoryPoolGetName function was called and object name was retrieved."/>"/>
+    <event id="0xF700 + 0x05" level="Detail" property="MemoryPoolGetName"      value="name=%t[val1]" info="Memory pool object name as ASCII string."/>
+    <event id="0xF700 + 0x06" level="API"    property="MemoryPoolAlloc"        value="mp_id=%x[val1], timeout=%d[val2]" info="osMemoryPoolAlloc function was called."/>
+    <event id="0xF700 + 0x07" level="Op"     property="MemoryPoolAllocPending" value="mp_id=%x[val1], timeout=%d[val2]" info="Memory pool allocation is pending."/>
+    <event id="0xF700 + 0x08" level="Op"     property="MemoryPoolAllocated"    value="mp_id=%x[val1], block=%x[val2]" info="Memory pool was allocated."/>
+    <event id="0xF700 + 0x09" level="Op"     property="MemoryPoolAllocFailed"  value="mp_id=%x[val1]" info="Memory pool was not allocated."/>
+    <event id="0xF700 + 0x0A" level="API"    property="MemoryPoolFree"         value="mp_id=%x[val1], block=%x[val2]" info="osMemoryPoolFree function was called."/>
+    <event id="0xF700 + 0x0B" level="Op"     property="MemoryPoolDeallocated"  value="mp_id=%x[val1], block=%x[val2]" info="Memory pool was deallocated."/>
+    <event id="0xF700 + 0x0C" level="Op"     property="MemoryPoolFreeFailed"   value="mp_id=%x[val1], block=%x[val2]" info="Memory pool was not deallocated."/>
+    <event id="0xF700 + 0x0D" level="API"    property="MemoryPoolGetCapacity"  value="mp_id=%x[val1], capacity=%d[val2]" info="osMemoryPoolGetCapacity function was called and maximum number of memory blocks was retrieved."/>
+    <event id="0xF700 + 0x0E" level="API"    property="MemoryPoolGetBlockSize" value="mp_id=%x[val1], block_size=%d[val2]" info="osMemoryPoolGetBlockSize function was called and memory block size was retrieved."/>
+    <event id="0xF700 + 0x0F" level="API"    property="MemoryPoolGetCount"     value="mp_id=%x[val1], count=%d[val2]" info="osMemoryPoolGetCount function was called and number of used memory blocks was retrieved."/>
+    <event id="0xF700 + 0x10" level="API"    property="MemoryPoolGetSpace"     value="mp_id=%x[val1], space=%d[val2]" info="osMemoryPoolGetSpace function was called and number of available memory blocks was retrieved."/>
+    <event id="0xF700 + 0x11" level="API"    property="MemoryPoolDelete"       value="mp_id=%x[val1]" info="osMemoryPoolDelete function was called."/>
+    <event id="0xF700 + 0x12" level="Op"     property="MemoryPoolDestroyed"    value="mp_id=%x[val1]" info="Memory pool object was deleted."/>
+
+    <event id="0xF800 + 0x00" level="Error"  property="MessageQueueError"         value="mq_id=%x[val1], status=%E[val2, rtx_t:status]" info="Message queue error occurred."/>
+    <event id="0xF800 + 0x01" level="API"    property="MessageQueueNew"           value="msg_count=%d[val1], msg_size=%d[val2], attr=%x[val3]" info="osMessageQueueNew function was called."/>
+    <event id="0xF800 + 0x02" level="Detail" property="MessageQueueNew"           value="name=%x[val1.name], attr_bits=%x[val1.attr_bits], cb_mem=%x[val1.cb_mem], cb_size=%d[val1.cb_size], mq_mem=%x[val1.mq_mem], mq_size=%d[val1.mq_size]" val1="osMessageQueueAttr_t" info="Attributes structure for message queue object."/>
+    <event id="0xF800 + 0x03" level="Op"     property="MessageQueueCreated"       value="mq_id=%x[val1]" info="Message Queue object was created"/>
+    <event id="0xF800 + 0x04" level="API"    property="MessageQueueGetName"       value="mq_id=%x[val1], name=%x[val2]" info="osMessageQueueGetName function was called and object name was retrieved."/>
+    <event id="0xF800 + 0x05" level="Detail" property="MessageQueueGetName"       value="name=%t[val1]" info="Message queue object name as ASCII string."/>
+    <event id="0xF800 + 0x06" level="API"    property="MessageQueuePut"           value="mq_id=%x[val1], msg_ptr=%x[val2], msg_prio=%d[val3], timeout=%d[val4]" info="osMessageQueuePut function was called."/>
+    <event id="0xF800 + 0x07" level="Op"     property="MessageQueuePutPending"    value="mq_id=%x[val1], msg_ptr=%x[val2], timeout=%d[val3]" info="Message put is pending."/>
+    <event id="0xF800 + 0x08" level="Op"     property="MessageQueueInsertPending" value="mq_id=%x[val1], msg_ptr=%x[val2]" info="Message insert is pending."/>
+    <event id="0xF800 + 0x09" level="Op"     property="MessageQueueInserted"      value="mq_id=%x[val1], msg_ptr=%x[val2]" info="Message was inserted."/>
+    <event id="0xF800 + 0x0A" level="Op"     property="MessageQueueNotInserted"   value="mq_id=%x[val1], msg_ptr=%x[val2]" info="Message was not inserted"/>
+    <event id="0xF800 + 0x0B" level="API"    property="MessageQueueGet"           value="mq_id=%x[val1], msg_ptr=%x[val2], msg_prio=%d[val3], timeout=%d[val4]" info="osMessageQueueGet function was called."/>
+    <event id="0xF800 + 0x0C" level="Op"     property="MessageQueueGetPending"    value="mq_id=%x[val1], msg_ptr=%x[val2], timeout=%d[val3]" info="Message get is pending."/>
+    <event id="0xF800 + 0x0D" level="Op"     property="MessageQueueRetrieved"     value="mq_id=%x[val1], msg_ptr=%x[val2]" info="Message was retrieved."/>
+    <event id="0xF800 + 0x0E" level="Op"     property="MessageQueueNotRetrieved"  value="mq_id=%x[val1], msg_ptr=%x[val2]" info="Message was not retrieved."/>
+    <event id="0xF800 + 0x0F" level="API"    property="MessageQueueGetCapacity"   value="mq_id=%x[val1], capacity=%d[val2]" info="osMessageQueueGetCapacity function was called and maximum number of messages was retrieved."/>
+    <event id="0xF800 + 0x10" level="API"    property="MessageQueueGetMsgSize"    value="mq_id=%x[val1], msg_size=%d[val2]" info="osMessageQueueGetMsgSize function was called and maximum message size was retrieved."/>
+    <event id="0xF800 + 0x11" level="API"    property="MessageQueueGetCount"      value="mq_id=%x[val1], count=%d[val2]" info="osMessageQueueGetCount function was called and number of queued messages was retrieved."/>
+    <event id="0xF800 + 0x12" level="API"    property="MessageQueueGetSpace"      value="mq_id=%x[val1], space=%d[val2]" info="osMessageQueueGetSpace function was called and number of available message slots was retrieved."/>
+    <event id="0xF800 + 0x13" level="API"    property="MessageQueueReset"         value="mq_id=%x[val1]" info="osMessageQueueReset function was called."/>
+    <event id="0xF800 + 0x14" level="Op"     property="MessageQueueResetDone"     value="mq_id=%x[val1]" info="Message queue was reset."/>
+    <event id="0xF800 + 0x15" level="API"    property="MessageQueueDelete"        value="mq_id=%x[val1]" info="osMessageQueueDelete function was called."/>
+    <event id="0xF800 + 0x16" level="Op"     property="MessageQueueDestroyed"     value="mq_id=%x[val1]" info="Message queue object was deleted."/>
+
+  </events>
 </component_viewer>
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_delay.c b/CMSIS/RTOS2/RTX/Source/rtx_delay.c
index 9edfadc..287e129 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_delay.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_delay.c
@@ -52,6 +52,7 @@
 
   ticks -= osRtxInfo.kernel.tick;
   if (ticks >= 0xFFFFFFFFU) {
+    EvrRtxThreadError(NULL, osErrorParameter);
     return osErrorParameter;
   }
   if (ticks == 0U) {
@@ -68,7 +69,9 @@
 
 /// Wait for Timeout (Time Delay).
 osStatus_t osDelay (uint32_t ticks) {
+  EvrRtxThreadDelay(ticks);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(NULL, osErrorISR);
     return osErrorISR;
   }
   return __svcDelay(ticks);
@@ -76,7 +79,9 @@
 
 /// Wait until specified time.
 osStatus_t osDelayUntil (uint64_t ticks) {
+  EvrRtxThreadDelayUntil(ticks);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(NULL, osErrorISR);
     return osErrorISR;
   }
   return __svcDelayUntil((uint32_t)ticks, (uint32_t)(ticks >> 32));
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_evflags.c b/CMSIS/RTOS2/RTX/Source/rtx_evflags.c
index 4956976..013bf20 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_evflags.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_evflags.c
@@ -147,6 +147,7 @@
     if (event_flags > 0) {
       osRtxThreadListRemove(thread);
       osRtxThreadWaitExit(thread, (uint32_t)event_flags, false);
+      EvrRtxEventFlagsWaitCompleted(ef, thread->wait_flags, thread->flags_options, event_flags);
     }
     thread = thread_next;
   }
@@ -177,10 +178,12 @@
     ef   = attr->cb_mem;
     if (ef != NULL) {
       if (((uint32_t)ef & 3U) || (attr->cb_size < sizeof(os_event_flags_t))) {
+        EvrRtxEventFlagsError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     } else {
       if (attr->cb_size != 0U) {
+        EvrRtxEventFlagsError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     }
@@ -197,6 +200,7 @@
       ef = osRtxMemoryAlloc(osRtxInfo.mem.common, sizeof(os_event_flags_t), 1U);
     }
     if (ef == NULL) {
+      EvrRtxEventFlagsError(NULL, osErrorNoMemory);
       return NULL;
     }
     flags = osRtxFlagSystemObject;
@@ -215,6 +219,8 @@
   // Register post ISR processing function
   osRtxInfo.post_process.event_flags = osRtxEventFlagsPostProcess;
 
+  EvrRtxEventFlagsCreated(ef);
+
   return ef;
 }
 
@@ -225,14 +231,18 @@
 
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags)) {
+    EvrRtxEventFlagsGetName(ef, NULL);
     return NULL;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsGetName(ef, NULL);
     return NULL;
   }
 
+  EvrRtxEventFlagsGetName(ef, ef->name);
+
   return ef->name;
 }
 
@@ -248,11 +258,13 @@
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags) ||
       ((uint32_t)flags & ~((1U << osRtxEventFlagsLimit) - 1U))) {
+    EvrRtxEventFlagsError(ef, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsError(ef, osErrorResource);
     return osErrorResource;
   }
 
@@ -272,11 +284,14 @@
       }
       osRtxThreadListRemove(thread);
       osRtxThreadWaitExit(thread, (uint32_t)event_flags0, false);
+      EvrRtxEventFlagsWaitCompleted(ef, thread->wait_flags, thread->flags_options, event_flags0);
     }
     thread = thread_next;
   }
   osRtxThreadDispatch(NULL);
 
+  EvrRtxEventFlagsSetDone(ef, event_flags);
+
   return event_flags;
 }
 
@@ -289,17 +304,21 @@
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags) ||
       ((uint32_t)flags & ~((1U << osRtxEventFlagsLimit) - 1U))) {
+    EvrRtxEventFlagsError(ef, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsError(ef, osErrorResource);
     return osErrorResource;
   }
 
   // Clear Event Flags
   event_flags = EventFlagsClear(ef, flags);
 
+  EvrRtxEventFlagsClearDone(ef, event_flags);
+  
   return event_flags;
 }
 
@@ -310,14 +329,18 @@
 
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags)) {
+    EvrRtxEventFlagsGet(ef, 0);
     return 0;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsGet(ef, 0);
     return 0;
   }
 
+  EvrRtxEventFlagsGet(ef, ef->event_flags);
+
   return ef->event_flags;
 }
 
@@ -330,23 +353,27 @@
 
   running_thread = osRtxThreadGetRunning();
   if (running_thread == NULL) {
+    EvrRtxEventFlagsError(ef, osRtxErrorKernelNotRunning);
     return osError;
   }
 
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags) ||
       ((uint32_t)flags & ~((1U << osRtxEventFlagsLimit) - 1U))) {
+    EvrRtxEventFlagsError(ef, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsError(ef, osErrorResource);
     return osErrorResource;
   }
 
   // Check Event Flags
   event_flags = EventFlagsCheck(ef, flags, options);
   if (event_flags > 0) {
+    EvrRtxEventFlagsWaitCompleted(ef, flags, options, event_flags);
     return event_flags;
   }
 
@@ -358,9 +385,12 @@
     // Suspend current Thread
     osRtxThreadListPut((os_object_t*)ef, running_thread);
     osRtxThreadWaitEnter(osRtxThreadWaitingEventFlags, timeout);
+    EvrRtxEventFlagsWaitPending(ef, flags, options, timeout);
     return osErrorTimeout;
   }
 
+  EvrRtxEventFlagsWaitNotCompleted(ef, flags, options);
+
   return osErrorResource;
 }
 
@@ -372,11 +402,13 @@
 
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags)) {
+    EvrRtxEventFlagsError(ef, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsError(ef, osErrorResource);
     return osErrorResource;
   }
 
@@ -401,6 +433,8 @@
     }
   }
 
+  EvrRtxEventFlagsDestroyed(ef);
+
   return osOK;
 }
 
@@ -417,11 +451,13 @@
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags) ||
       ((uint32_t)flags & ~((1U << osRtxEventFlagsLimit) - 1U))) {
+    EvrRtxEventFlagsError(ef, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsError(ef, osErrorResource);
     return osErrorResource;
   }
 
@@ -431,6 +467,8 @@
   // Register post ISR processing
   osRtxPostProcess((os_object_t *)ef);
 
+  EvrRtxEventFlagsSetDone(ef, event_flags);
+
   return event_flags;
 }
 
@@ -444,20 +482,25 @@
   // Check parameters
   if ((ef == NULL) || (ef->id != osRtxIdEventFlags) || (timeout != 0U) ||
       ((uint32_t)flags & ~((1U << osRtxEventFlagsLimit) - 1U))) {
+    EvrRtxEventFlagsError(ef, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (ef->state == osRtxObjectInactive) {
+    EvrRtxEventFlagsError(ef, osErrorResource);
     return osErrorResource;
   }
 
   // Check Event Flags
   event_flags = EventFlagsCheck(ef, flags, options);
   if (event_flags > 0) {
+    EvrRtxEventFlagsWaitCompleted(ef, flags, options, event_flags);
     return event_flags;
   }
 
+  EvrRtxEventFlagsWaitNotCompleted(ef, flags, options);
+
   return osErrorResource;
 }
 
@@ -466,7 +509,9 @@
 
 /// Create and Initialize an Event Flags object.
 osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr) {
+  EvrRtxEventFlagsNew(attr);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxEventFlagsError(NULL, osErrorISR);
     return NULL;
   }
   return __svcEventFlagsNew(attr);
@@ -475,6 +520,7 @@
 /// Get name of an Event Flags object.
 const char *osEventFlagsGetName (osEventFlagsId_t ef_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxEventFlagsGetName(ef_id, NULL);
     return NULL;
   }
   return __svcEventFlagsGetName(ef_id);
@@ -482,6 +528,7 @@
 
 /// Set the specified Event Flags.
 int32_t osEventFlagsSet (osEventFlagsId_t ef_id, int32_t flags) {
+  EvrRtxEventFlagsSet(ef_id, flags);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxEventFlagsSet(ef_id, flags);
   } else {
@@ -491,6 +538,7 @@
 
 /// Clear the specified Event Flags.
 int32_t osEventFlagsClear (osEventFlagsId_t ef_id, int32_t flags) {
+  EvrRtxEventFlagsClear(ef_id, flags);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return svcRtxEventFlagsClear(ef_id, flags);
   } else {
@@ -509,6 +557,7 @@
 
 /// Wait for one or more Event Flags to become signaled.
 int32_t osEventFlagsWait (osEventFlagsId_t ef_id, int32_t flags, uint32_t options, uint32_t timeout) {
+  EvrRtxEventFlagsWait(ef_id, flags, options, timeout);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxEventFlagsWait(ef_id, flags, options, timeout);
   } else {
@@ -518,7 +567,9 @@
 
 /// Delete an Event Flags object.
 osStatus_t osEventFlagsDelete (osEventFlagsId_t ef_id) {
+  EvrRtxEventFlagsDelete(ef_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxEventFlagsError(ef_id, osErrorISR);
     return osErrorISR;
   }
   return __svcEventFlagsDelete(ef_id);
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_evr.c b/CMSIS/RTOS2/RTX/Source/rtx_evr.c
new file mode 100644
index 0000000..fde408e
--- /dev/null
+++ b/CMSIS/RTOS2/RTX/Source/rtx_evr.c
@@ -0,0 +1,1995 @@
+/*
+ * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * -----------------------------------------------------------------------------
+ *
+ * Project:     CMSIS-RTOS RTX
+ * Title:       RTX Event Recorder
+ *
+ * -----------------------------------------------------------------------------
+ */
+
+#include <string.h>
+#include "cmsis_compiler.h"
+#include "rtx_evr.h"                    // RTX Event Recorder definitions
+
+#include "RTE_Components.h"
+
+#ifdef RTE_Compiler_EventRecorder
+
+#include "EventRecorder.h"              // Keil::Compiler:Event Recorder
+
+/// RTOS component number
+#define EvtRtxMemoryNo                  (0xF0U)
+#define EvtRtxKernelNo                  (0xF1U)
+#define EvtRtxThreadNo                  (0xF2U)
+#define EvtRtxTimerNo                   (0xF3U)
+#define EvtRtxEventFlagsNo              (0xF4U)
+#define EvtRtxMutexNo                   (0xF5U)
+#define EvtRtxSemaphoreNo               (0xF6U)
+#define EvtRtxMemoryPoolNo              (0xF7U)
+#define EvtRtxMessageQueueNo            (0xF8U)
+
+/// Event IDs for "RTX Memory Management"
+#define EvtRtxMemoryInit                    EventID(EventLevelOp,     EvtRtxMemoryNo, 0x00U)
+#define EvtRtxMemoryAlloc                   EventID(EventLevelOp,     EvtRtxMemoryNo, 0x01U)
+#define EvtRtxMemoryFree                    EventID(EventLevelOp,     EvtRtxMemoryNo, 0x02U)
+#define EvtRtxMemoryBlockInit               EventID(EventLevelOp,     EvtRtxMemoryNo, 0x03U)
+#define EvtRtxMemoryBlockAlloc              EventID(EventLevelOp,     EvtRtxMemoryNo, 0x04U)
+#define EvtRtxMemoryBlockFree               EventID(EventLevelOp,     EvtRtxMemoryNo, 0x05U)
+
+/// Event IDs for "RTX Kernel"
+#define EvtRtxKernelError                   EventID(EventLevelError,  EvtRtxKernelNo, 0x00U)
+#define EvtRtxKernelInitialize              EventID(EventLevelAPI,    EvtRtxKernelNo, 0x01U)
+#define EvtRtxKernelInitializeCompleted     EventID(EventLevelOp,     EvtRtxKernelNo, 0x02U)
+#define EvtRtxKernelGetInfo                 EventID(EventLevelAPI,    EvtRtxKernelNo, 0x03U)
+#define EvtRtxKernelInfoRetrieved           EventID(EventLevelOp,     EvtRtxKernelNo, 0x04U)
+#define EvtRtxKernelInfoRetrieved_Detail    EventID(EventLevelDetail, EvtRtxKernelNo, 0x05U)
+#define EvtRtxKernelGetState                EventID(EventLevelAPI,    EvtRtxKernelNo, 0x06U)
+#define EvtRtxKernelStart                   EventID(EventLevelAPI,    EvtRtxKernelNo, 0x07U)
+#define EvtRtxKernelStarted                 EventID(EventLevelOp,     EvtRtxKernelNo, 0x08U)
+#define EvtRtxKernelLock                    EventID(EventLevelAPI,    EvtRtxKernelNo, 0x09U)
+#define EvtRtxKernelLocked                  EventID(EventLevelOp,     EvtRtxKernelNo, 0x0AU)
+#define EvtRtxKernelUnlock                  EventID(EventLevelAPI,    EvtRtxKernelNo, 0x0BU)
+#define EvtRtxKernelUnlocked                EventID(EventLevelOp,     EvtRtxKernelNo, 0x0CU)
+#define EvtRtxKernelRestoreLock             EventID(EventLevelAPI,    EvtRtxKernelNo, 0x0DU)
+#define EvtRtxKernelLockRestored            EventID(EventLevelOp,     EvtRtxKernelNo, 0x0EU)
+#define EvtRtxKernelSuspend                 EventID(EventLevelAPI,    EvtRtxKernelNo, 0x0FU)
+#define EvtRtxKernelSuspended               EventID(EventLevelOp,     EvtRtxKernelNo, 0x10U)
+#define EvtRtxKernelResume                  EventID(EventLevelAPI,    EvtRtxKernelNo, 0x11U)
+#define EvtRtxKernelResumed                 EventID(EventLevelOp,     EvtRtxKernelNo, 0x12U)
+#define EvtRtxKernelGetTickCount            EventID(EventLevelAPI,    EvtRtxKernelNo, 0x13U)
+#define EvtRtxKernelGetTickFreq             EventID(EventLevelAPI,    EvtRtxKernelNo, 0x14U)
+#define EvtRtxKernelGetSysTimerCount        EventID(EventLevelAPI,    EvtRtxKernelNo, 0x15U)
+#define EvtRtxKernelGetSysTimerFreq         EventID(EventLevelAPI,    EvtRtxKernelNo, 0x16U)
+
+/// Event IDs for "RTX Thread"
+#define EvtRtxThreadError                   EventID(EventLevelError,  EvtRtxThreadNo, 0x00U)
+#define EvtRtxThreadNew                     EventID(EventLevelAPI,    EvtRtxThreadNo, 0x01U)
+#define EvtRtxThreadNew_Detail              EventID(EventLevelDetail, EvtRtxThreadNo, 0x02U)
+#define EvtRtxThreadCreated                 EventID(EventLevelOp,     EvtRtxThreadNo, 0x03U)
+#define EvtRtxThreadGetName                 EventID(EventLevelAPI,    EvtRtxThreadNo, 0x04U)
+#define EvtRtxThreadGetName_Detail          EventID(EventLevelDetail, EvtRtxThreadNo, 0x05U)
+#define EvtRtxThreadGetId                   EventID(EventLevelAPI,    EvtRtxThreadNo, 0x06U)
+#define EvtRtxThreadGetState                EventID(EventLevelAPI,    EvtRtxThreadNo, 0x07U)
+#define EvtRtxThreadGetStackSize            EventID(EventLevelAPI,    EvtRtxThreadNo, 0x08U)
+#define EvtRtxThreadGetStackSpace           EventID(EventLevelAPI,    EvtRtxThreadNo, 0x09U)
+#define EvtRtxThreadSetPriority             EventID(EventLevelAPI,    EvtRtxThreadNo, 0x0AU)
+#define EvtRtxThreadGetPriority             EventID(EventLevelAPI,    EvtRtxThreadNo, 0x0BU)
+#define EvtRtxThreadYield                   EventID(EventLevelAPI,    EvtRtxThreadNo, 0x0CU)
+#define EvtRtxThreadSuspend                 EventID(EventLevelAPI,    EvtRtxThreadNo, 0x0DU)
+#define EvtRtxThreadSuspended               EventID(EventLevelOp,     EvtRtxThreadNo, 0x0EU)
+#define EvtRtxThreadResume                  EventID(EventLevelAPI,    EvtRtxThreadNo, 0x0FU)
+#define EvtRtxThreadResumed                 EventID(EventLevelOp,     EvtRtxThreadNo, 0x10U)
+#define EvtRtxThreadDetach                  EventID(EventLevelAPI,    EvtRtxThreadNo, 0x11U)
+#define EvtRtxThreadDetached                EventID(EventLevelOp,     EvtRtxThreadNo, 0x12U)
+#define EvtRtxThreadJoin                    EventID(EventLevelAPI,    EvtRtxThreadNo, 0x13U)
+#define EvtRtxThreadJoinPending             EventID(EventLevelOp,     EvtRtxThreadNo, 0x14U)
+#define EvtRtxThreadJoined                  EventID(EventLevelOp,     EvtRtxThreadNo, 0x15U)
+#define EvtRtxThreadBlocked                 EventID(EventLevelOp,     EvtRtxThreadNo, 0x16U)
+#define EvtRtxThreadUnblocked               EventID(EventLevelOp,     EvtRtxThreadNo, 0x17U)
+#define EvtRtxThreadSwitch                  EventID(EventLevelOp,     EvtRtxThreadNo, 0x18U)
+#define EvtRtxThreadExit                    EventID(EventLevelAPI,    EvtRtxThreadNo, 0x19U)
+#define EvtRtxThreadTerminate               EventID(EventLevelAPI,    EvtRtxThreadNo, 0x1AU)
+#define EvtRtxThreadDestroyed               EventID(EventLevelOp,     EvtRtxThreadNo, 0x1BU)
+#define EvtRtxThreadGetCount                EventID(EventLevelAPI,    EvtRtxThreadNo, 0x1CU)
+#define EvtRtxThreadEnumerate               EventID(EventLevelAPI,    EvtRtxThreadNo, 0x1DU)
+#define EvtRtxThreadFlagsSet                EventID(EventLevelAPI,    EvtRtxThreadNo, 0x1EU)
+#define EvtRtxThreadFlagsSetDone            EventID(EventLevelOp,     EvtRtxThreadNo, 0x1FU)
+#define EvtRtxThreadFlagsClear              EventID(EventLevelAPI,    EvtRtxThreadNo, 0x20U)
+#define EvtRtxThreadFlagsClearDone          EventID(EventLevelOp,     EvtRtxThreadNo, 0x21U)
+#define EvtRtxThreadFlagsGet                EventID(EventLevelAPI,    EvtRtxThreadNo, 0x22U)
+#define EvtRtxThreadFlagsWait               EventID(EventLevelAPI,    EvtRtxThreadNo, 0x23U)
+#define EvtRtxThreadFlagsWaitPending        EventID(EventLevelOp,     EvtRtxThreadNo, 0x24U)
+#define EvtRtxThreadFlagsWaitCompleted      EventID(EventLevelOp,     EvtRtxThreadNo, 0x25U)
+#define EvtRtxThreadFlagsWaitNotCompleted   EventID(EventLevelOp,     EvtRtxThreadNo, 0x26U)
+#define EvtRtxThreadDelay                   EventID(EventLevelAPI,    EvtRtxThreadNo, 0x27U)
+#define EvtRtxThreadDelayUntil              EventID(EventLevelAPI,    EvtRtxThreadNo, 0x28U)
+
+/// Event IDs for "RTX Timer"
+#define EvtRtxTimerError                    EventID(EventLevelError,  EvtRtxTimerNo, 0x00U)
+#define EvtRtxTimerCallback                 EventID(EventLevelOp,     EvtRtxTimerNo, 0x01U)
+#define EvtRtxTimerNew                      EventID(EventLevelAPI,    EvtRtxTimerNo, 0x02U)
+#define EvtRtxTimerNew_Detail               EventID(EventLevelDetail, EvtRtxTimerNo, 0x03U)
+#define EvtRtxTimerCreated                  EventID(EventLevelOp,     EvtRtxTimerNo, 0x04U)
+#define EvtRtxTimerGetName                  EventID(EventLevelAPI,    EvtRtxTimerNo, 0x05U)
+#define EvtRtxTimerGetName_Detail           EventID(EventLevelDetail, EvtRtxTimerNo, 0x06U)
+#define EvtRtxTimerStart                    EventID(EventLevelAPI,    EvtRtxTimerNo, 0x07U)
+#define EvtRtxTimerStarted                  EventID(EventLevelOp,     EvtRtxTimerNo, 0x08U)
+#define EvtRtxTimerStop                     EventID(EventLevelAPI,    EvtRtxTimerNo, 0x09U)
+#define EvtRtxTimerStopped                  EventID(EventLevelOp,     EvtRtxTimerNo, 0x0AU)
+#define EvtRtxTimerIsRunning                EventID(EventLevelAPI,    EvtRtxTimerNo, 0x0BU)
+#define EvtRtxTimerDelete                   EventID(EventLevelAPI,    EvtRtxTimerNo, 0x0CU)
+#define EvtRtxTimerDestroyed                EventID(EventLevelOp,     EvtRtxTimerNo, 0x0DU)
+
+/// Event IDs for "RTX Event Flags"
+#define EvtRtxEventFlagsError               EventID(EventLevelError,  EvtRtxEventFlagsNo, 0x00U)
+#define EvtRtxEventFlagsNew                 EventID(EventLevelAPI,    EvtRtxEventFlagsNo, 0x01U)
+#define EvtRtxEventFlagsNew_Detail          EventID(EventLevelDetail, EvtRtxEventFlagsNo, 0x02U)
+#define EvtRtxEventFlagsCreated             EventID(EventLevelOp,     EvtRtxEventFlagsNo, 0x03U)
+#define EvtRtxEventFlagsGetName             EventID(EventLevelAPI,    EvtRtxEventFlagsNo, 0x04U)
+#define EvtRtxEventFlagsGetName_Detail      EventID(EventLevelDetail, EvtRtxEventFlagsNo, 0x05U)
+#define EvtRtxEventFlagsSet                 EventID(EventLevelAPI,    EvtRtxEventFlagsNo, 0x06U)
+#define EvtRtxEventFlagsSetDone             EventID(EventLevelOp,     EvtRtxEventFlagsNo, 0x07U)
+#define EvtRtxEventFlagsClear               EventID(EventLevelAPI,    EvtRtxEventFlagsNo, 0x08U)
+#define EvtRtxEventFlagsClearDone           EventID(EventLevelOp,     EvtRtxEventFlagsNo, 0x09U)
+#define EvtRtxEventFlagsGet                 EventID(EventLevelAPI,    EvtRtxEventFlagsNo, 0x0AU)
+#define EvtRtxEventFlagsWait                EventID(EventLevelAPI,    EvtRtxEventFlagsNo, 0x0BU)
+#define EvtRtxEventFlagsWaitPending         EventID(EventLevelOp,     EvtRtxEventFlagsNo, 0x0CU)
+#define EvtRtxEventFlagsWaitCompleted       EventID(EventLevelOp,     EvtRtxEventFlagsNo, 0x0DU)
+#define EvtRtxEventFlagsWaitNotCompleted    EventID(EventLevelOp,     EvtRtxEventFlagsNo, 0x0EU)
+#define EvtRtxEventFlagsDelete              EventID(EventLevelAPI,    EvtRtxEventFlagsNo, 0x0FU)
+#define EvtRtxEventFlagsDestroyed           EventID(EventLevelOp,     EvtRtxEventFlagsNo, 0x10U)
+
+/// Event IDs for "RTX Mutex"
+#define EvtRtxMutexError                    EventID(EventLevelError,  EvtRtxMutexNo, 0x00U)
+#define EvtRtxMutexNew                      EventID(EventLevelAPI,    EvtRtxMutexNo, 0x01U)
+#define EvtRtxMutexNew_Detail               EventID(EventLevelDetail, EvtRtxMutexNo, 0x02U)
+#define EvtRtxMutexCreated                  EventID(EventLevelOp,     EvtRtxMutexNo, 0x03U)
+#define EvtRtxMutexGetName                  EventID(EventLevelAPI,    EvtRtxMutexNo, 0x04U)
+#define EvtRtxMutexGetName_Detail           EventID(EventLevelDetail, EvtRtxMutexNo, 0x05U)
+#define EvtRtxMutexAcquire                  EventID(EventLevelAPI,    EvtRtxMutexNo, 0x06U)
+#define EvtRtxMutexAcquirePending           EventID(EventLevelError,  EvtRtxMutexNo, 0x07U)
+#define EvtRtxMutexAcquired                 EventID(EventLevelOp,     EvtRtxMutexNo, 0x08U)
+#define EvtRtxMutexNotAcquired              EventID(EventLevelOp,     EvtRtxMutexNo, 0x09U)
+#define EvtRtxMutexRelease                  EventID(EventLevelAPI,    EvtRtxMutexNo, 0x0AU)
+#define EvtRtxMutexReleased                 EventID(EventLevelOp,     EvtRtxMutexNo, 0x0BU)
+#define EvtRtxMutexGetOwner                 EventID(EventLevelAPI,    EvtRtxMutexNo, 0x0CU)
+#define EvtRtxMutexDelete                   EventID(EventLevelAPI,    EvtRtxMutexNo, 0x0DU)
+#define EvtRtxMutexDestroyed                EventID(EventLevelOp,     EvtRtxMutexNo, 0x0EU)
+
+/// Event IDs for "RTX Semaphore"
+#define EvtRtxSemaphoreError                EventID(EventLevelError,  EvtRtxSemaphoreNo, 0x00U)
+#define EvtRtxSemaphoreNew                  EventID(EventLevelAPI,    EvtRtxSemaphoreNo, 0x01U)
+#define EvtRtxSemaphoreNew_Detail           EventID(EventLevelDetail, EvtRtxSemaphoreNo, 0x02U)
+#define EvtRtxSemaphoreCreated              EventID(EventLevelOp,     EvtRtxSemaphoreNo, 0x03U)
+#define EvtRtxSemaphoreGetName              EventID(EventLevelAPI,    EvtRtxSemaphoreNo, 0x04U)
+#define EvtRtxSemaphoreGetName_Detail       EventID(EventLevelDetail, EvtRtxSemaphoreNo, 0x05U)
+#define EvtRtxSemaphoreAcquire              EventID(EventLevelAPI,    EvtRtxSemaphoreNo, 0x06U)
+#define EvtRtxSemaphoreAcquirePending       EventID(EventLevelOp,     EvtRtxSemaphoreNo, 0x07U)
+#define EvtRtxSemaphoreAcquired             EventID(EventLevelOp,     EvtRtxSemaphoreNo, 0x08U)
+#define EvtRtxSemaphoreNotAcquired          EventID(EventLevelOp,     EvtRtxSemaphoreNo, 0x09U)
+#define EvtRtxSemaphoreRelease              EventID(EventLevelAPI,    EvtRtxSemaphoreNo, 0x0AU)
+#define EvtRtxSemaphoreReleased             EventID(EventLevelOp,     EvtRtxSemaphoreNo, 0x0BU)
+#define EvtRtxSemaphoreGetCount             EventID(EventLevelAPI,    EvtRtxSemaphoreNo, 0x0CU)
+#define EvtRtxSemaphoreDelete               EventID(EventLevelAPI,    EvtRtxSemaphoreNo, 0x0DU)
+#define EvtRtxSemaphoreDestroyed            EventID(EventLevelOp,     EvtRtxSemaphoreNo, 0x0EU)
+
+/// Event IDs for "RTX Memory Pool"
+#define EvtRtxMemoryPoolError               EventID(EventLevelError,  EvtRtxMemoryPoolNo, 0x00U)
+#define EvtRtxMemoryPoolNew                 EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x01U)
+#define EvtRtxMemoryPoolNew_Detail          EventID(EventLevelDetail, EvtRtxMemoryPoolNo, 0x02U)
+#define EvtRtxMemoryPoolCreated             EventID(EventLevelOp,     EvtRtxMemoryPoolNo, 0x03U)
+#define EvtRtxMemoryPoolGetName             EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x04U)
+#define EvtRtxMemoryPoolGetName_Detail      EventID(EventLevelDetail, EvtRtxMemoryPoolNo, 0x05U)
+#define EvtRtxMemoryPoolAlloc               EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x06U)
+#define EvtRtxMemoryPoolAllocPending        EventID(EventLevelOp,     EvtRtxMemoryPoolNo, 0x07U)
+#define EvtRtxMemoryPoolAllocated           EventID(EventLevelOp,     EvtRtxMemoryPoolNo, 0x08U)
+#define EvtRtxMemoryPoolAllocFailed         EventID(EventLevelOp,     EvtRtxMemoryPoolNo, 0x09U)
+#define EvtRtxMemoryPoolFree                EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x0AU)
+#define EvtRtxMemoryPoolDeallocated         EventID(EventLevelOp,     EvtRtxMemoryPoolNo, 0x0BU)
+#define EvtRtxMemoryPoolFreeFailed          EventID(EventLevelOp,     EvtRtxMemoryPoolNo, 0x0CU)
+#define EvtRtxMemoryPoolGetCapacity         EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x0DU)
+#define EvtRtxMemoryPoolGetBlockSize        EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x0EU)
+#define EvtRtxMemoryPoolGetCount            EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x0FU)
+#define EvtRtxMemoryPoolGetSpace            EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x10U)
+#define EvtRtxMemoryPoolDelete              EventID(EventLevelAPI,    EvtRtxMemoryPoolNo, 0x11U)
+#define EvtRtxMemoryPoolDestroyed           EventID(EventLevelOp,     EvtRtxMemoryPoolNo, 0x12U)
+
+/// Event IDs for "RTX Message Queue"
+#define EvtRtxMessageQueueError             EventID(EventLevelError,  EvtRtxMessageQueueNo, 0x00U)
+#define EvtRtxMessageQueueNew               EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x01U)
+#define EvtRtxMessageQueueNew_Detail        EventID(EventLevelDetail, EvtRtxMessageQueueNo, 0x02U)
+#define EvtRtxMessageQueueCreated           EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x03U)
+#define EvtRtxMessageQueueGetName           EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x04U)
+#define EvtRtxMessageQueueGetName_Detail    EventID(EventLevelDetail, EvtRtxMessageQueueNo, 0x05U)
+#define EvtRtxMessageQueuePut               EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x06U)
+#define EvtRtxMessageQueuePutPending        EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x07U)
+#define EvtRtxMessageQueueInsertPending     EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x08U)
+#define EvtRtxMessageQueueInserted          EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x09U)
+#define EvtRtxMessageQueueNotInserted       EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x0AU)
+#define EvtRtxMessageQueueGet               EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x0BU)
+#define EvtRtxMessageQueueGetPending        EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x0CU)
+#define EvtRtxMessageQueueRetrieved         EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x0DU)
+#define EvtRtxMessageQueueNotRetrieved      EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x0EU)
+#define EvtRtxMessageQueueGetCapacity       EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x0FU)
+#define EvtRtxMessageQueueGetMsgSize        EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x10U)
+#define EvtRtxMessageQueueGetCount          EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x11U)
+#define EvtRtxMessageQueueGetSpace          EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x12U)
+#define EvtRtxMessageQueueReset             EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x13U)
+#define EvtRtxMessageQueueResetDone         EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x14U)
+#define EvtRtxMessageQueueDelete            EventID(EventLevelAPI,    EvtRtxMessageQueueNo, 0x15U)
+#define EvtRtxMessageQueueDestroyed         EventID(EventLevelOp,     EvtRtxMessageQueueNo, 0x16U)
+
+#endif  // RTE_Compiler_EventRecorder
+
+
+//  ==== Memory Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_INIT_DISABLE))
+__WEAK void EvrRtxMemoryInit (void *mem, uint32_t size, uint32_t result) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMemoryInit, (uint32_t)mem, size, result, 0U);
+#else
+  (void)mem;
+  (void)size;
+  (void)result;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_ALLOC_DISABLE))
+__WEAK void EvrRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type, void *block) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMemoryAlloc, (uint32_t)mem, size, type, (uint32_t)block);
+#else
+  (void)mem;
+  (void)size;
+  (void)type;
+  (void)block;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_FREE_DISABLE))
+__WEAK void EvrRtxMemoryFree (void *mem, void *block, uint32_t result) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMemoryFree, (uint32_t)mem, (uint32_t)block, result, 0U);
+#else
+  (void)mem;
+  (void)block;
+  (void)result;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_BLOCK_INIT_DISABLE))
+__WEAK void EvrRtxMemoryBlockInit (osRtxMpInfo_t *mp_info, uint32_t block_count, uint32_t block_size, void *block_mem) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMemoryBlockInit, (uint32_t)mp_info, block_count, block_size, (uint32_t)block_mem);
+#else
+  (void)mp_info;
+  (void)block_count;
+  (void)block_size;
+  (void)block_mem;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_BLOCK_ALLOC_DISABLE))
+__WEAK void EvrRtxMemoryBlockAlloc (osRtxMpInfo_t *mp_info, void *block) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryBlockAlloc, (uint32_t)mp_info, (uint32_t)block);
+#else
+  (void)mp_info;
+  (void)block;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMORY != 0) && !defined(EVR_RTX_MEMORY_BLOCK_FREE_DISABLE))
+__WEAK void EvrRtxMemoryBlockFree (osRtxMpInfo_t *mp_info, void *block, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMemoryBlockFree, (uint32_t)mp_info, (uint32_t)block, (uint32_t)status, 0U);
+#else
+  (void)mp_info;
+  (void)block;
+  (void)status;
+#endif
+}
+#endif
+
+
+//  ==== Kernel Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_ERROR_DISABLE))
+__WEAK void EvrRtxKernelError (int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelError, (uint32_t)status, 0U); 
+#else
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_INITIALIZE_DISABLE))
+__WEAK void EvrRtxKernelInitialize (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelInitialize, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_INITIALIZE_COMPLETED_DISABLE))
+__WEAK void EvrRtxKernelInitializeCompleted (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelInitializeCompleted, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_INFO_DISABLE))
+__WEAK void EvrRtxKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxKernelGetInfo, (uint32_t)version, (uint32_t)id_buf, id_size, 0U);
+#else
+  (void)version;
+  (void)id_buf;
+  (void)id_size;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_INFO_RETRIEVED_DISABLE))
+__WEAK void EvrRtxKernelInfoRetrieved (osVersion_t *version, char *id_buf) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelInfoRetrieved, (uint32_t)version, (uint32_t)id_buf);
+  if (id_buf != NULL) {
+    EventRecordData(EvtRtxKernelInfoRetrieved_Detail, id_buf, strlen(id_buf));
+  }
+#else
+  (void)version;
+  (void)id_buf;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_STATE_DISABLE))
+__WEAK void EvrRtxKernelGetState (osKernelState_t state) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelGetState, (uint32_t)state, 0U);
+#else
+  (void)state;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_START_DISABLE))
+__WEAK void EvrRtxKernelStart (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelStart, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_STARTED_DISABLE))
+__WEAK void EvrRtxKernelStarted (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelStarted, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_LOCK_DISABLE))
+__WEAK void EvrRtxKernelLock (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelLock, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_LOCKED_DISABLE))
+__WEAK void EvrRtxKernelLocked (int32_t lock) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelLocked, (uint32_t)lock, 0U);
+#else
+  (void)lock;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_UNLOCK_DISABLE))
+__WEAK void EvrRtxKernelUnlock (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelUnlock, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_UNLOCKED_DISABLE))
+__WEAK void EvrRtxKernelUnlocked (int32_t lock) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelUnlocked, (uint32_t)lock, 0U);
+#else
+  (void)lock;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_RESTORE_LOCK_DISABLE))
+__WEAK void EvrRtxKernelRestoreLock (int32_t lock) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelRestoreLock, (uint32_t)lock, 0U);
+#else
+  (void)lock;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_LOCK_RESTORED_DISABLE))
+__WEAK void EvrRtxKernelLockRestored (int32_t lock) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelLockRestored, (uint32_t)lock, 0U);
+#else
+  (void)lock;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_SUSPEND_DISABLE))
+__WEAK void EvrRtxKernelSuspend (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelSuspend, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_SUSPENDED_DISABLE))
+__WEAK void EvrRtxKernelSuspended (uint32_t sleep_ticks) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelSuspended, sleep_ticks, 0U);
+#else
+  (void)sleep_ticks;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_RESUME_DISABLE))
+__WEAK void EvrRtxKernelResume (uint32_t sleep_ticks) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelResume, sleep_ticks, 0U);
+#else
+  (void)sleep_ticks;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_RESUMED_DISABLE))
+__WEAK void EvrRtxKernelResumed (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelResumed, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_TICK_COUNT_DISABLE))
+__WEAK void EvrRtxKernelGetTickCount (uint64_t count) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelGetTickCount, (uint32_t)count, (uint32_t)(count>>32));
+#else
+  (void)count;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_TICK_FREQ_DISABLE))
+__WEAK void EvrRtxKernelGetTickFreq (uint32_t freq) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelGetTickFreq, freq, 0U);
+#else
+  (void)freq;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_SYS_TIMER_COUNT_DISABLE))
+__WEAK void EvrRtxKernelGetSysTimerCount (uint32_t count) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelGetSysTimerCount, count, 0U);
+#else
+  (void)count;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_KERNEL != 0) && !defined(EVR_RTX_KERNEL_GET_SYS_TIMER_FREQ_DISABLE))
+__WEAK void EvrRtxKernelGetSysTimerFreq (uint32_t freq) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxKernelGetSysTimerFreq, freq, 0U);
+#else
+  (void)freq;
+#endif
+}
+#endif
+
+
+//  ==== Thread Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_ERROR_DISABLE))
+__WEAK void EvrRtxThreadError (osThreadId_t thread_id, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadError, (uint32_t)thread_id, (uint32_t)status);
+#else
+  (void)thread_id;
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_NEW_DISABLE))
+__WEAK void EvrRtxThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxThreadNew, (uint32_t)func, (uint32_t)argument, (uint32_t)attr, 0U);
+  if (attr != NULL) {
+    EventRecordData(EvtRtxThreadNew_Detail, attr, sizeof (osThreadAttr_t));
+  }
+#else
+  (void)func;
+  (void)argument;
+  (void)attr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_CREATED_DISABLE))
+__WEAK void EvrRtxThreadCreated (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadCreated, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_NAME_DISABLE))
+__WEAK void EvrRtxThreadGetName (osThreadId_t thread_id, const char *name) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadGetName, (uint32_t)thread_id, (uint32_t)name);
+  if (name != NULL) {
+    EventRecordData(EvtRtxThreadGetName_Detail, name, strlen(name));
+  }
+#else
+  (void)thread_id;
+  (void)name;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_ID_DISABLE))
+__WEAK void EvrRtxThreadGetId (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadGetId, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_STATE_DISABLE))
+__WEAK void EvrRtxThreadGetState (osThreadId_t thread_id, osThreadState_t state) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadGetState, (uint32_t)thread_id, (uint32_t)state);
+#else
+  (void)thread_id;
+  (void)state;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_STACK_SIZE_DISABLE))
+__WEAK void EvrRtxThreadGetStackSize (osThreadId_t thread_id, uint32_t stack_size) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadGetStackSize, (uint32_t)thread_id, stack_size);
+#else
+  (void)thread_id;
+  (void)stack_size;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_STACK_SPACE_DISABLE))
+__WEAK void EvrRtxThreadGetStackSpace (osThreadId_t thread_id, uint32_t stack_space) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadGetStackSpace, (uint32_t)thread_id, stack_space);
+#else
+  (void)thread_id;
+  (void)stack_space;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SET_PRIORITY_DISABLE))
+__WEAK void EvrRtxThreadSetPriority (osThreadId_t thread_id, osPriority_t priority) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadSetPriority, (uint32_t)thread_id, (uint32_t)priority);
+#else
+  (void)thread_id;
+  (void)priority;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_PRIORITY_DISABLE))
+__WEAK void EvrRtxThreadGetPriority (osThreadId_t thread_id, osPriority_t priority) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadGetPriority, (uint32_t)thread_id, (uint32_t)priority);
+#else
+  (void)thread_id;
+  (void)priority;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_YIELD_DISABLE))
+__WEAK void EvrRtxThreadYield (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadYield, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SUSPEND_DISABLE))
+__WEAK void EvrRtxThreadSuspend (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadSuspend, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SUSPENDED_DISABLE))
+__WEAK void EvrRtxThreadSuspended (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadSuspended, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_RESUME_DISABLE))
+__WEAK void EvrRtxThreadResume (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadResume, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_RESUMED_DISABLE))
+__WEAK void EvrRtxThreadResumed (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadResumed, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DETACH_DISABLE))
+__WEAK void EvrRtxThreadDetach (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadDetach, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DETACHED_DISABLE))
+__WEAK void EvrRtxThreadDetached (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadDetached, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_JOIN_DISABLE))
+__WEAK void EvrRtxThreadJoin (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadJoin, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_JOIN_PENDING_DISABLE))
+__WEAK void EvrRtxThreadJoinPending (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadJoinPending, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_JOINED_DISABLE))
+__WEAK void EvrRtxThreadJoined (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadJoined, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_BLOCKED_DISABLE))
+__WEAK void EvrRtxThreadBlocked (osThreadId_t thread_id, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadBlocked, (uint32_t)thread_id, timeout);
+#else
+  (void)thread_id;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_UNBLOCKED_DISABLE))
+__WEAK void EvrRtxThreadUnblocked (osThreadId_t thread_id, uint32_t ret_val) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadUnblocked, (uint32_t)thread_id, ret_val);
+#else
+  (void)thread_id;
+  (void)ret_val;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_SWITCH_DISABLE))
+__WEAK void EvrRtxThreadSwitch (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadSwitch, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_EXIT_DISABLE))
+__WEAK void EvrRtxThreadExit (void) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadExit, 0U, 0U);
+#else
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_TERMINATE_DISABLE))
+__WEAK void EvrRtxThreadTerminate (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadTerminate, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DESTROYED_DISABLE))
+__WEAK void EvrRtxThreadDestroyed (osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadDestroyed, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_GET_COUNT_DISABLE))
+__WEAK void EvrRtxThreadGetCount (uint32_t count) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadGetCount, count, 0U);
+#else
+  (void)count;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_ENUMERATE_DISABLE))
+__WEAK void EvrRtxThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items, uint32_t count) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxThreadEnumerate, (uint32_t)thread_array, array_items, count, 0U);
+#else
+  (void)thread_array;
+  (void)array_items;
+  (void)count;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_SET_DISABLE))
+__WEAK void EvrRtxThreadFlagsSet (osThreadId_t thread_id, int32_t flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadFlagsSet, (uint32_t)thread_id, (uint32_t)flags);
+#else
+  (void)thread_id;
+  (void)flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_SET_DONE_DISABLE))
+__WEAK void EvrRtxThreadFlagsSetDone (osThreadId_t thread_id, int32_t thread_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadFlagsSetDone, (uint32_t)thread_id, (uint32_t)thread_flags);
+#else
+  (void)thread_id;
+  (void)thread_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_CLEAR_DISABLE))
+__WEAK void EvrRtxThreadFlagsClear (int32_t flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadFlagsClear, (uint32_t)flags, 0U);
+#else
+  (void)flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_CLEAR_DONE_DISABLE))
+__WEAK void EvrRtxThreadFlagsClearDone (int32_t thread_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadFlagsClearDone, (uint32_t)thread_flags, 0U);
+#else
+  (void)thread_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_GET_DISABLE))
+__WEAK void EvrRtxThreadFlagsGet (int32_t thread_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadFlagsGet, (uint32_t)thread_flags, 0U);
+#else
+  (void)thread_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_DISABLE))
+__WEAK void EvrRtxThreadFlagsWait (int32_t flags, uint32_t options, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxThreadFlagsWait, (uint32_t)flags, options, timeout, 0U);
+#else
+  (void)flags;
+  (void)options;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_PENDING_DISABLE))
+__WEAK void EvrRtxThreadFlagsWaitPending (int32_t flags, uint32_t options, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxThreadFlagsWaitPending, (uint32_t)flags, options, timeout, 0U);
+#else
+  (void)flags;
+  (void)options;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_COMPLETED_DISABLE))
+__WEAK void EvrRtxThreadFlagsWaitCompleted (int32_t flags, uint32_t options, int32_t thread_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxThreadFlagsWaitCompleted, (uint32_t)flags, options, (uint32_t)thread_flags, 0U);
+#else
+  (void)flags;
+  (void)options;
+  (void)thread_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_NOT_COMPLETED_DISABLE))
+__WEAK void EvrRtxThreadFlagsWaitNotCompleted (int32_t flags, uint32_t options) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadFlagsWaitNotCompleted, (uint32_t)flags, options);
+#else
+  (void)flags;
+  (void)options;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DELAY_DISABLE))
+__WEAK void EvrRtxThreadDelay (uint32_t ticks) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadDelay, ticks, 0U);
+#else
+  (void)ticks;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THREAD != 0) && !defined(EVR_RTX_THREAD_DELAY_UNTIL_DISABLE))
+__WEAK void EvrRtxThreadDelayUntil (uint64_t ticks) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxThreadDelayUntil, (uint32_t)ticks, (uint32_t)(ticks >> 32));
+#else
+  (void)ticks;
+#endif
+}
+#endif
+
+
+//  ==== Timer Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_ERROR_DISABLE))
+__WEAK void EvrRtxTimerError (osTimerId_t timer_id, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerError, (uint32_t)timer_id, (uint32_t)status);
+#else
+  (void)timer_id;
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_CALLBACK_DISABLE))
+__WEAK void EvrRtxTimerCallback (osTimerFunc_t func, void *argument) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerCallback, (uint32_t)func, (uint32_t)argument);
+#else
+  (void)func;
+  (void)argument;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_NEW_DISABLE))
+__WEAK void EvrRtxTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxTimerNew, (uint32_t)func, (uint32_t)type, (uint32_t)argument, (uint32_t)attr);
+  if (attr != NULL) {
+    EventRecordData(EvtRtxTimerNew_Detail, attr, sizeof (osTimerAttr_t));
+  }
+#else
+  (void)func;
+  (void)type;
+  (void)argument;
+  (void)attr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_CREATED_DISABLE))
+__WEAK void EvrRtxTimerCreated (osTimerId_t timer_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerCreated, (uint32_t)timer_id, 0U);
+#else
+  (void)timer_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_GET_NAME_DISABLE))
+__WEAK void EvrRtxTimerGetName (osTimerId_t timer_id, const char *name) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerGetName, (uint32_t)timer_id, (uint32_t)name);
+  if (name != NULL) {
+    EventRecordData(EvtRtxTimerGetName_Detail, name, strlen(name));
+  }
+#else
+  (void)timer_id;
+  (void)name;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_START_DISABLE))
+__WEAK void EvrRtxTimerStart (osTimerId_t timer_id, uint32_t ticks) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerStart, (uint32_t)timer_id, ticks);
+#else
+  (void)timer_id;
+  (void)ticks;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_STARTED_DISABLE))
+__WEAK void EvrRtxTimerStarted (osTimerId_t timer_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerStarted, (uint32_t)timer_id, 0U);
+#else
+  (void)timer_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_STOP_DISABLE))
+__WEAK void EvrRtxTimerStop (osTimerId_t timer_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerStop, (uint32_t)timer_id, 0U);
+#else
+  (void)timer_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_STOPPED_DISABLE))
+__WEAK void EvrRtxTimerStopped (osTimerId_t timer_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerStopped, (uint32_t)timer_id, 0U);
+#else
+  (void)timer_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_IS_RUNNING_DISABLE))
+__WEAK void EvrRtxTimerIsRunning (osTimerId_t timer_id, uint32_t running) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerIsRunning, (uint32_t)timer_id, running);
+#else
+  (void)timer_id;
+  (void)running;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_DELETE_DISABLE))
+__WEAK void EvrRtxTimerDelete (osTimerId_t timer_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerDelete, (uint32_t)timer_id, 0U);
+#else
+  (void)timer_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_TIMER != 0) && !defined(EVR_RTX_TIMER_DESTROYED_DISABLE))
+__WEAK void EvrRtxTimerDestroyed (osTimerId_t timer_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxTimerDestroyed, (uint32_t)timer_id, 0U);
+#else
+  (void)timer_id;
+#endif
+}
+#endif
+
+
+//  ==== Event Flags Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_ERROR_DISABLE))
+__WEAK void EvrRtxEventFlagsError (osEventFlagsId_t ef_id, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsError, (uint32_t)ef_id, (uint32_t)status);
+#else
+  (void)ef_id;
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_NEW_DISABLE))
+__WEAK void EvrRtxEventFlagsNew (const osEventFlagsAttr_t *attr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsNew, (uint32_t)attr, 0U);
+  if (attr != NULL) {
+    EventRecordData(EvtRtxEventFlagsNew_Detail, attr, sizeof (osEventFlagsAttr_t));
+  }
+#else
+  (void)attr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_CREATED_DISABLE))
+__WEAK void EvrRtxEventFlagsCreated (osEventFlagsId_t ef_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsCreated, (uint32_t)ef_id, 0U);
+#else
+  (void)ef_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_GET_NAME_DISABLE))
+__WEAK void EvrRtxEventFlagsGetName (osEventFlagsId_t ef_id, const char *name) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsGetName, (uint32_t)ef_id, (uint32_t)name);
+  if (name != NULL) {
+    EventRecordData(EvtRtxEventFlagsGetName_Detail, name, strlen(name));
+  }
+#else
+  (void)ef_id;
+  (void)name;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_SET_DISABLE))
+__WEAK void EvrRtxEventFlagsSet (osEventFlagsId_t ef_id, int32_t flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsSet, (uint32_t)ef_id, (uint32_t)flags);
+#else
+  (void)ef_id;
+  (void)flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_SET_DONE_DISABLE))
+__WEAK void EvrRtxEventFlagsSetDone (osEventFlagsId_t ef_id, int32_t event_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsSetDone, (uint32_t)ef_id, (uint32_t)event_flags);
+#else
+  (void)ef_id;
+  (void)event_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_CLEAR_DISABLE))
+__WEAK void EvrRtxEventFlagsClear (osEventFlagsId_t ef_id, int32_t flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsClear, (uint32_t)ef_id, (uint32_t)flags);
+#else
+  (void)ef_id;
+  (void)flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_CLEAR_DONE_DISABLE))
+__WEAK void EvrRtxEventFlagsClearDone (osEventFlagsId_t ef_id, int32_t event_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsClearDone, (uint32_t)ef_id, (uint32_t)event_flags);
+#else
+  (void)ef_id;
+  (void)event_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_GET_DISABLE))
+__WEAK void EvrRtxEventFlagsGet (osEventFlagsId_t ef_id, int32_t event_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsGet, (uint32_t)ef_id, (uint32_t)event_flags);
+#else
+  (void)ef_id;
+  (void)event_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_DISABLE))
+__WEAK void EvrRtxEventFlagsWait (osEventFlagsId_t ef_id, int32_t flags, uint32_t options, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxEventFlagsWait, (uint32_t)ef_id, (uint32_t)flags, options, timeout);
+#else
+  (void)ef_id;
+  (void)flags;
+  (void)options;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_PENDING_DISABLE))
+__WEAK void EvrRtxEventFlagsWaitPending (osEventFlagsId_t ef_id, int32_t flags, uint32_t options, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxEventFlagsWaitPending, (uint32_t)ef_id, (uint32_t)flags, options, timeout);
+#else
+  (void)ef_id;
+  (void)flags;
+  (void)options;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_COMPLETED_DISABLE))
+__WEAK void EvrRtxEventFlagsWaitCompleted (osEventFlagsId_t ef_id, int32_t flags, uint32_t options, int32_t event_flags) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxEventFlagsWaitCompleted, (uint32_t)ef_id, (uint32_t)flags, options, (uint32_t)event_flags);
+#else
+  (void)ef_id;
+  (void)flags;
+  (void)options;
+  (void)event_flags;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_WAIT_NOT_COMPLETED_DISABLE))
+__WEAK void EvrRtxEventFlagsWaitNotCompleted (osEventFlagsId_t ef_id, int32_t flags, uint32_t options) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxEventFlagsWaitNotCompleted, (uint32_t)ef_id, (uint32_t)flags, options, 0U);
+#else
+  (void)ef_id;
+  (void)flags;
+  (void)options;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_DELETE_DISABLE))
+__WEAK void EvrRtxEventFlagsDelete (osEventFlagsId_t ef_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsDelete, (uint32_t)ef_id, 0U);
+#else
+  (void)ef_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_EVFLAGS != 0) && !defined(EVR_RTX_EVENT_FLAGS_DESTROYED_DISABLE))
+__WEAK void EvrRtxEventFlagsDestroyed (osEventFlagsId_t ef_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxEventFlagsDestroyed, (uint32_t)ef_id, 0U);
+#else
+  (void)ef_id;
+#endif
+}
+#endif
+
+
+//  ==== Mutex Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ERROR_DISABLE))
+__WEAK void EvrRtxMutexError (osMutexId_t mutex_id, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexError, (uint32_t)mutex_id, (uint32_t)status);
+#else
+  (void)mutex_id;
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_NEW_DISABLE))
+__WEAK void EvrRtxMutexNew (const osMutexAttr_t *attr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexNew, (uint32_t)attr, 0U);
+  if (attr != NULL) {
+    EventRecordData(EvtRtxMutexNew_Detail, attr, sizeof (osMutexAttr_t));
+  }
+#else
+  (void)attr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_CREATED_DISABLE))
+__WEAK void EvrRtxMutexCreated (osMutexId_t mutex_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexCreated, (uint32_t)mutex_id, 0U);
+#else
+  (void)mutex_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_GET_NAME_DISABLE))
+__WEAK void EvrRtxMutexGetName (osMutexId_t mutex_id, const char *name) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexGetName, (uint32_t)mutex_id, (uint32_t)name);
+  if (name != NULL) {
+    EventRecordData(EvtRtxMutexGetName_Detail, name, strlen(name));
+  }
+#else
+  (void)mutex_id;
+  (void)name;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ACQUIRE_DISABLE))
+__WEAK void EvrRtxMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexAcquire, (uint32_t)mutex_id, timeout);
+#else
+  (void)mutex_id;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ACQUIRE_PENDING_DISABLE))
+__WEAK void EvrRtxMutexAcquirePending (osMutexId_t mutex_id, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexAcquirePending, (uint32_t)mutex_id, timeout);
+#else
+  (void)mutex_id;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_ACQUIRED_DISABLE))
+__WEAK void EvrRtxMutexAcquired (osMutexId_t mutex_id, uint32_t lock) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexAcquired, (uint32_t)mutex_id, lock);
+#else
+  (void)mutex_id;
+  (void)lock;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_NOT_ACQUIRED_DISABLE))
+__WEAK void EvrRtxMutexNotAcquired (osMutexId_t mutex_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexNotAcquired, (uint32_t)mutex_id, 0U);
+#else
+  (void)mutex_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_RELEASE_DISABLE))
+__WEAK void EvrRtxMutexRelease (osMutexId_t mutex_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexRelease, (uint32_t)mutex_id, 0U);
+#else
+  (void)mutex_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_RELEASED_DISABLE))
+__WEAK void EvrRtxMutexReleased (osMutexId_t mutex_id, uint32_t lock) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexReleased, (uint32_t)mutex_id, lock);
+#else
+  (void)mutex_id;
+  (void)lock;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_GET_OWNER_DISABLE))
+__WEAK void EvrRtxMutexGetOwner (osMutexId_t mutex_id, osThreadId_t thread_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexGetOwner, (uint32_t)mutex_id, (uint32_t)thread_id);
+#else
+  (void)mutex_id;
+  (void)thread_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_DELETE_DISABLE))
+__WEAK void EvrRtxMutexDelete (osMutexId_t mutex_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexDelete, (uint32_t)mutex_id, 0U);
+#else
+  (void)mutex_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MUTEX != 0) && !defined(EVR_RTX_MUTEX_DESTROYED_DISABLE))
+__WEAK void EvrRtxMutexDestroyed (osMutexId_t mutex_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMutexDestroyed, (uint32_t)mutex_id, 0U);
+#else
+  (void)mutex_id;
+#endif
+}
+#endif
+
+
+//  ==== Semaphore Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ERROR_DISABLE))
+__WEAK void EvrRtxSemaphoreError (osSemaphoreId_t semaphore_id, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreError, (uint32_t)semaphore_id, (uint32_t)status);
+#else
+  (void)semaphore_id;
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_NEW_DISABLE))
+__WEAK void EvrRtxSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxSemaphoreNew, max_count, initial_count, (uint32_t)attr, 0U);
+  if (attr != NULL) {
+    EventRecordData(EvtRtxSemaphoreNew_Detail, attr, sizeof (osSemaphoreAttr_t));
+  }
+#else
+  (void)max_count;
+  (void)initial_count;
+  (void)attr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_CREATED_DISABLE))
+__WEAK void EvrRtxSemaphoreCreated (osSemaphoreId_t semaphore_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreCreated, (uint32_t)semaphore_id, 0U);
+#else
+  (void)semaphore_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_GET_NAME_DISABLE))
+__WEAK void EvrRtxSemaphoreGetName (osSemaphoreId_t semaphore_id, const char *name) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreGetName, (uint32_t)semaphore_id, (uint32_t)name);
+  if (name != NULL) {
+    EventRecordData(EvtRtxSemaphoreGetName_Detail, name, strlen(name));
+  }
+#else
+#endif
+  (void)semaphore_id;
+  (void)name;
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ACQUIRE_DISABLE))
+__WEAK void EvrRtxSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreAcquire, (uint32_t)semaphore_id, timeout);
+#else
+  (void)semaphore_id;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ACQUIRE_PENDING_DISABLE))
+__WEAK void EvrRtxSemaphoreAcquirePending (osSemaphoreId_t semaphore_id, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreAcquirePending, (uint32_t)semaphore_id, (uint32_t)timeout);
+#else
+  (void)semaphore_id;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_ACQUIRED_DISABLE))
+__WEAK void EvrRtxSemaphoreAcquired (osSemaphoreId_t semaphore_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreAcquired, (uint32_t)semaphore_id, 0U);
+#else
+  (void)semaphore_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_NOT_ACQUIRED_DISABLE))
+__WEAK void EvrRtxSemaphoreNotAcquired (osSemaphoreId_t semaphore_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreNotAcquired, (uint32_t)semaphore_id, 0U);
+#else
+  (void)semaphore_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_RELEASE_DISABLE))
+__WEAK void EvrRtxSemaphoreRelease (osSemaphoreId_t semaphore_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreRelease, (uint32_t)semaphore_id, 0U);
+#else
+  (void)semaphore_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_RELEASED_DISABLE))
+__WEAK void EvrRtxSemaphoreReleased (osSemaphoreId_t semaphore_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreReleased, (uint32_t)semaphore_id, 0U);
+#else
+  (void)semaphore_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_GET_COUNT_DISABLE))
+__WEAK void EvrRtxSemaphoreGetCount (osSemaphoreId_t semaphore_id, uint32_t count) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreGetCount, (uint32_t)semaphore_id, count);
+#else
+  (void)semaphore_id;
+  (void)count;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_DELETE_DISABLE))
+__WEAK void EvrRtxSemaphoreDelete (osSemaphoreId_t semaphore_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreDelete, (uint32_t)semaphore_id, 0U);
+#else
+  (void)semaphore_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_SEMAPHORE != 0) && !defined(EVR_RTX_SEMAPHORE_DESTROYED_DISABLE))
+__WEAK void EvrRtxSemaphoreDestroyed (osSemaphoreId_t semaphore_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxSemaphoreDestroyed, (uint32_t)semaphore_id, 0U);
+#else
+  (void)semaphore_id;
+#endif
+}
+#endif
+
+
+//  ==== Memory Pool Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ERROR_DISABLE))
+__WEAK void EvrRtxMemoryPoolError (osMemoryPoolId_t mp_id, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolError, (uint32_t)mp_id, (uint32_t)status);
+#else
+  (void)mp_id;
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_NEW_DISABLE))
+__WEAK void EvrRtxMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMemoryPoolNew, block_count, block_size, (uint32_t)attr, 0U);
+  if (attr != NULL) {
+    EventRecordData(EvtRtxMemoryPoolNew, attr, sizeof (osMemoryPoolAttr_t));
+  }
+#else
+  (void)block_count;
+  (void)block_size;
+  (void)attr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_CREATED_DISABLE))
+__WEAK void EvrRtxMemoryPoolCreated (osMemoryPoolId_t mp_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolCreated, (uint32_t)mp_id, 0U);
+#else
+  (void)mp_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_NAME_DISABLE))
+__WEAK void EvrRtxMemoryPoolGetName (osMemoryPoolId_t mp_id, const char *name) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolGetName, (uint32_t)mp_id, (uint32_t)name);
+  if (name != NULL) {
+    EventRecordData(EvtRtxMemoryPoolGetName_Detail, name, strlen(name));
+  }
+#else
+  (void)mp_id;
+  (void)name;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOC_DISABLE))
+__WEAK void EvrRtxMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolAlloc, (uint32_t)mp_id, timeout);
+#else
+  (void)mp_id;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOC_PENDING_DISABLE))
+__WEAK void EvrRtxMemoryPoolAllocPending (osMemoryPoolId_t mp_id, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolAllocPending, (uint32_t)mp_id, timeout);
+#else
+  (void)mp_id;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOCATED_DISABLE))
+__WEAK void EvrRtxMemoryPoolAllocated (osMemoryPoolId_t mp_id, void *block) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolAllocated, (uint32_t)mp_id, (uint32_t)block);
+#else
+  (void)mp_id;
+  (void)block;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_ALLOC_FAILED_DISABLE))
+__WEAK void EvrRtxMemoryPoolAllocFailed (osMemoryPoolId_t mp_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolAllocFailed, (uint32_t)mp_id, 0U);
+#else
+  (void)mp_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_FREE_DISABLE))
+__WEAK void EvrRtxMemoryPoolFree (osMemoryPoolId_t mp_id, void *block) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolFree, (uint32_t)mp_id, (uint32_t)block);
+#else
+  (void)mp_id;
+  (void)block;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_DEALLOCATED_DISABLE))
+__WEAK void EvrRtxMemoryPoolDeallocated (osMemoryPoolId_t mp_id, void *block) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolDeallocated, (uint32_t)mp_id, (uint32_t)block);
+#else
+  (void)mp_id;
+  (void)block;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_FREE_FAILED_DISABLE))
+__WEAK void EvrRtxMemoryPoolFreeFailed (osMemoryPoolId_t mp_id, void *block) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolFreeFailed, (uint32_t)mp_id, (uint32_t)block);
+#else
+  (void)mp_id;
+  (void)block;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_CAPACITY_DISABLE))
+__WEAK void EvrRtxMemoryPoolGetCapacity (osMemoryPoolId_t mp_id, uint32_t capacity) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolGetCapacity, (uint32_t)mp_id, capacity);
+#else
+  (void)mp_id;
+  (void)capacity;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_BLOCK_SZIE_DISABLE))
+__WEAK void EvrRtxMemoryPoolGetBlockSize (osMemoryPoolId_t mp_id, uint32_t block_size) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolGetBlockSize, (uint32_t)mp_id, block_size);
+#else
+  (void)mp_id;
+  (void)block_size;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_COUNT_DISABLE))
+__WEAK void EvrRtxMemoryPoolGetCount (osMemoryPoolId_t mp_id, uint32_t count) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolGetCount, (uint32_t)mp_id, count);
+#else
+  (void)mp_id;
+  (void)count;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_GET_SPACE_DISABLE))
+__WEAK void EvrRtxMemoryPoolGetSpace (osMemoryPoolId_t mp_id, uint32_t space) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolGetSpace, (uint32_t)mp_id, space);
+#else
+  (void)mp_id;
+  (void)space;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_DELETE_DISABLE))
+__WEAK void EvrRtxMemoryPoolDelete (osMemoryPoolId_t mp_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolDelete, (uint32_t)mp_id, 0U);
+#else
+  (void)mp_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MEMPOOL != 0) && !defined(EVR_RTX_MEMORY_POOL_DESTROYED_DISABLE))
+__WEAK void EvrRtxMemoryPoolDestroyed (osMemoryPoolId_t mp_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMemoryPoolDestroyed, (uint32_t)mp_id, 0U);
+#else
+  (void)mp_id;
+#endif
+}
+#endif
+
+
+//  ==== Message Queue Events ====
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_ERROR_DISABLE))
+__WEAK void EvrRtxMessageQueueError (osMessageQueueId_t mq_id, int32_t status) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2 (EvtRtxMessageQueueError, (uint32_t)mq_id, (uint32_t)status);
+#else
+  (void)mq_id;
+  (void)status;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_NEW_DISABLE))
+__WEAK void EvrRtxMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMessageQueueNew, msg_count, msg_size, (uint32_t)attr, 0U);
+  if (attr != NULL) {
+    EventRecordData(EvtRtxMessageQueueNew_Detail, attr, sizeof (osMemoryPoolAttr_t));
+  }
+#else
+  (void)msg_count;
+  (void)msg_size;
+  (void)attr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_CREATED_DISABLE))
+__WEAK void EvrRtxMessageQueueCreated (osMessageQueueId_t mq_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueCreated, (uint32_t)mq_id, 0U);
+#else
+  (void)mq_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_NAME_DISABLE))
+__WEAK void EvrRtxMessageQueueGetName (osMessageQueueId_t mq_id, const char *name) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueGetName, (uint32_t)mq_id, (uint32_t)name);
+  if (name != NULL) {
+    EventRecordData(EvtRtxMessageQueueGetName_Detail, name, strlen(name));
+  }
+#else
+  (void)mq_id;
+  (void)name;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_PUT_DISABLE))
+__WEAK void EvrRtxMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMessageQueuePut, (uint32_t)mq_id, (uint32_t)msg_ptr, (uint32_t)msg_prio, timeout);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+  (void)msg_prio;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_PUT_PENDING_DISABLE))
+__WEAK void EvrRtxMessageQueuePutPending (osMessageQueueId_t mq_id, const void *msg_ptr, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMessageQueuePutPending, (uint32_t)mq_id, (uint32_t)msg_ptr, timeout, 0U);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_INSERT_PENDING_DISABLE))
+__WEAK void EvrRtxMessageQueueInsertPending (osMessageQueueId_t mq_id, const void *msg_ptr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueInsertPending, (uint32_t)mq_id, (uint32_t)msg_ptr);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_INSERTED_DISABLE))
+__WEAK void EvrRtxMessageQueueInserted (osMessageQueueId_t mq_id, const void *msg_ptr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueInserted, (uint32_t)mq_id, (uint32_t)msg_ptr);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_NOT_INSERTED_DISABLE))
+__WEAK void EvrRtxMessageQueueNotInserted (osMessageQueueId_t mq_id, const void *msg_ptr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueNotInserted, (uint32_t)mq_id, (uint32_t)msg_ptr);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_DISABLE))
+__WEAK void EvrRtxMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMessageQueueGet, (uint32_t)mq_id, (uint32_t)msg_ptr, (uint32_t)msg_prio, timeout);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+  (void)msg_prio;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_PENDING_DISABLE))
+__WEAK void EvrRtxMessageQueueGetPending (osMessageQueueId_t mq_id, void *msg_ptr, uint32_t timeout) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord4(EvtRtxMessageQueueGetPending, (uint32_t)mq_id, (uint32_t)msg_ptr, timeout, 0U);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+  (void)timeout;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_RETRIEVED_DISABLE))
+__WEAK void EvrRtxMessageQueueRetrieved (osMessageQueueId_t mq_id, void *msg_ptr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueRetrieved, (uint32_t)mq_id, (uint32_t)msg_ptr);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_NOT_RETRIEVED_DISABLE))
+__WEAK void EvrRtxMessageQueueNotRetrieved (osMessageQueueId_t mq_id, void *msg_ptr) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueNotRetrieved, (uint32_t)mq_id, (uint32_t)msg_ptr);
+#else
+  (void)mq_id;
+  (void)msg_ptr;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_CAPACITY_DISABLE))
+__WEAK void EvrRtxMessageQueueGetCapacity (osMessageQueueId_t mq_id, uint32_t capacity) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueGetCapacity, (uint32_t)mq_id, capacity);
+#else
+  (void)mq_id;
+  (void)capacity;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_MSG_SIZE_DISABLE))
+__WEAK void EvrRtxMessageQueueGetMsgSize (osMessageQueueId_t mq_id, uint32_t msg_size) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueGetMsgSize, (uint32_t)mq_id, msg_size);
+#else
+  (void)mq_id;
+  (void)msg_size;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_COUNT_DISABLE))
+__WEAK void EvrRtxMessageQueueGetCount (osMessageQueueId_t mq_id, uint32_t count) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueGetCount, (uint32_t)mq_id, count);
+#else
+  (void)mq_id;
+  (void)count;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_GET_SPACE_DISABLE))
+__WEAK void EvrRtxMessageQueueGetSpace (osMessageQueueId_t mq_id, uint32_t space) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueGetSpace, (uint32_t)mq_id, space);
+#else
+  (void)mq_id;
+  (void)space;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_RESET_DISABLE))
+__WEAK void EvrRtxMessageQueueReset (osMessageQueueId_t mq_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueReset, (uint32_t)mq_id, 0U);
+#else
+  (void)mq_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_RESET_DONE_DISABLE))
+__WEAK void EvrRtxMessageQueueResetDone (osMessageQueueId_t mq_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueResetDone, (uint32_t)mq_id, 0U);
+#else
+  (void)mq_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_DELETE_DISABLE))
+__WEAK void EvrRtxMessageQueueDelete (osMessageQueueId_t mq_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueDelete, (uint32_t)mq_id, 0U);
+#else
+  (void)mq_id;
+#endif
+}
+#endif
+
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_MSGQUEUE != 0) && !defined(EVR_RTX_MESSAGE_QUEUE_DESTROYED_DISABLE))
+__WEAK void EvrRtxMessageQueueDestroyed (osMessageQueueId_t mq_id) {
+#if defined(RTE_Compiler_EventRecorder)
+  EventRecord2(EvtRtxMessageQueueDestroyed, (uint32_t)mq_id, 0U);
+#else
+  (void)mq_id;
+#endif
+}
+#endif
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_kernel.c b/CMSIS/RTOS2/RTX/Source/rtx_kernel.c
index eb8e21c..e2c205c 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_kernel.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_kernel.c
@@ -97,9 +97,11 @@
 osStatus_t svcRtxKernelInitialize (void) {
 
   if (osRtxInfo.kernel.state == osRtxKernelReady) {
+    EvrRtxKernelInitializeCompleted();
     return osOK;
   }
   if (osRtxInfo.kernel.state != osKernelInactive) {
+    EvrRtxKernelError(osError);
     return osError;
   }
 
@@ -107,10 +109,12 @@
   memset(&osRtxInfo.kernel, 0, sizeof(osRtxInfo) - offsetof(osRtxInfo_t, kernel));
 
   if (osRtxConfig.thread_stack_size < (64U + 8U)) {
+    EvrRtxKernelError(osRtxErrorInvalidThreadStack);
     return osError;
   }
 
   if ((osRtxConfig.isr_queue.data == NULL) || (osRtxConfig.isr_queue.max == 0U)) {
+    EvrRtxKernelError(osError);
     return osError;
   }
   osRtxInfo.isr_queue.data = osRtxConfig.isr_queue.data;
@@ -199,6 +203,7 @@
 #if (__DOMAIN_NS == 1U)
   // Initialize Secure Process Stack
   if (TZ_InitContextSystem_S() == 0U) {
+    EvrRtxKernelError(osRtxErrorTZ_InitContext_S);
     return osError;
   }
 #endif
@@ -208,6 +213,8 @@
 
   osRtxInfo.kernel.state = osRtxKernelReady;
 
+  EvrRtxKernelInitializeCompleted();
+
   return osOK;
 }
 
@@ -227,12 +234,15 @@
     memcpy(id_buf, osRtxKernelId, id_size);
   }
 
+  EvrRtxKernelInfoRetrieved(version, id_buf);
+
   return osOK;
 }
 
 /// Get the current RTOS Kernel state.
 /// \note API identical to osKernelGetState
 osKernelState_t svcRtxKernelGetState (void) {
+  EvrRtxKernelGetState((osKernelState_t)(osRtxInfo.kernel.state));
   return ((osKernelState_t)(osRtxInfo.kernel.state));
 }
 
@@ -242,6 +252,7 @@
   os_thread_t *thread;
 
   if (osRtxInfo.kernel.state != osRtxKernelReady) {
+    EvrRtxKernelError(osRtxErrorKernelNotReady);
     return osError;
   }
 
@@ -249,6 +260,7 @@
   if (osRtxInfo.thread.idle == NULL) {
     osRtxInfo.thread.idle = svcRtxThreadNew(osRtxIdleThread, NULL, osRtxConfig.idle_thread_attr);
     if (osRtxInfo.thread.idle == NULL) {
+      EvrRtxKernelError(osError);
       return osError;
     }
   }
@@ -256,6 +268,7 @@
   // Switch to Ready Thread with highest Priority
   thread = osRtxThreadListGet(&osRtxInfo.thread.ready);
   if (thread == NULL) {
+    EvrRtxKernelError(osError);
     return osError;
   }
   osRtxThreadSwitch(thread);
@@ -279,6 +292,8 @@
 
   osRtxInfo.kernel.state = osRtxKernelRunning;
 
+  EvrRtxKernelStarted();
+
   return osOK;
 }
 
@@ -287,13 +302,16 @@
 int32_t svcRtxKernelLock (void) {
 
   if (osRtxInfo.kernel.state == osRtxKernelLocked) {
+    EvrRtxKernelLocked(1);
     return 1;
   }
   if (osRtxInfo.kernel.state == osRtxKernelRunning) {
     osRtxInfo.kernel.state = osRtxKernelLocked;
+    EvrRtxKernelLocked(0);
     return 0;
   }
 
+  EvrRtxKernelError(osError);
   return osError;
 }
  
@@ -303,12 +321,15 @@
 
   if (osRtxInfo.kernel.state == osRtxKernelLocked) {
     osRtxInfo.kernel.state = osRtxKernelRunning;
+    EvrRtxKernelUnlocked(1);
     return 1;
   }
   if (osRtxInfo.kernel.state == osRtxKernelRunning) {
+    EvrRtxKernelUnlocked(0);
     return 0;
   }
 
+  EvrRtxKernelError(osError);
   return osError;
 }
 
@@ -321,15 +342,18 @@
     switch (lock) {
       case 1:
         osRtxInfo.kernel.state = osRtxKernelLocked;
+        EvrRtxKernelLockRestored(1);
         return 1;
       case 0:
         osRtxInfo.kernel.state = osRtxKernelRunning;
+        EvrRtxKernelLockRestored(0);
         return 0;
       default:
         break;
     }
   }
 
+  EvrRtxKernelError(osError);
   return osError;
 }
 
@@ -341,6 +365,7 @@
   uint32_t     delay;
 
   if (osRtxInfo.kernel.state != osRtxKernelRunning) {
+    EvrRtxKernelError(osRtxErrorKernelNotRunning);
     return 0U;
   }
 
@@ -364,6 +389,8 @@
 
   osRtxInfo.kernel.state = osRtxKernelSuspended;
 
+  EvrRtxKernelSuspended(delay);
+
   return delay;
 }
 
@@ -375,6 +402,7 @@
   uint32_t     delay;
 
   if (osRtxInfo.kernel.state != osRtxKernelSuspended) {
+    EvrRtxKernelResumed();
     return;
   }
 
@@ -426,17 +454,20 @@
 
   KernelUnblock();
 
+  EvrRtxKernelResumed();
 }
 
 /// Get the RTOS kernel tick count.
 /// \note API identical to osKernelGetTickCount
 uint64_t svcRtxKernelGetTickCount (void) {
+  EvrRtxKernelGetTickCount(osRtxInfo.kernel.tick);
   return osRtxInfo.kernel.tick;
 }
 
 /// Get the RTOS kernel tick frequency.
 /// \note API identical to osKernelGetTickFreq
 uint32_t svcRtxKernelGetTickFreq (void) {
+  EvrRtxKernelGetTickFreq(osRtxConfig.tick_freq);
   return osRtxConfig.tick_freq;
 }
 
@@ -444,6 +475,7 @@
 /// \note API identical to osKernelGetSysTimerCount
 uint32_t svcRtxKernelGetSysTimerCount (void) {
   uint32_t count = osRtxSysTimerGetCount();
+  EvrRtxKernelGetSysTimerCount(count);
   return count;
 }
 
@@ -451,6 +483,7 @@
 /// \note API identical to osKernelGetSysTimerFreq
 uint32_t svcRtxKernelGetSysTimerFreq (void) {
   uint32_t freq = osRtxSysTimerGetFreq();
+  EvrRtxKernelGetSysTimerFreq(freq);
   return freq;
 }
 
@@ -459,7 +492,9 @@
 
 /// Initialize the RTOS Kernel.
 osStatus_t osKernelInitialize (void) {
+  EvrRtxKernelInitialize();
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return osErrorISR;
   }
   return __svcKernelInitialize();
@@ -467,7 +502,9 @@
 
 ///  Get RTOS Kernel Information.
 osStatus_t osKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size) {
+  EvrRtxKernelGetInfo(version, id_buf, id_size);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return osErrorISR;
   }
   if (IS_PRIVILEGED()) {
@@ -480,6 +517,7 @@
 /// Get the current RTOS Kernel state.
 osKernelState_t osKernelGetState (void) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelGetState(osKernelError);
     return osKernelError;
   }
   if (IS_PRIVILEGED()) {
@@ -491,7 +529,9 @@
 
 /// Start the RTOS Kernel scheduler.
 osStatus_t osKernelStart (void) {
+  EvrRtxKernelStart();
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return osErrorISR;
   }
   return __svcKernelStart();
@@ -499,7 +539,9 @@
 
 /// Lock the RTOS Kernel scheduler.
 int32_t osKernelLock (void) {
+  EvrRtxKernelLock();
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return osErrorISR;
   }
   return __svcKernelLock();
@@ -507,7 +549,9 @@
  
 /// Unlock the RTOS Kernel scheduler.
 int32_t osKernelUnlock (void) {
+  EvrRtxKernelUnlock();
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return osErrorISR;
   }
   return __svcKernelUnlock();
@@ -515,7 +559,9 @@
 
 /// Restore the RTOS Kernel scheduler lock state.
 int32_t osKernelRestoreLock (int32_t lock) {
+  EvrRtxKernelRestoreLock(lock);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return osErrorISR;
   }
   return __svcKernelRestoreLock(lock);
@@ -523,7 +569,9 @@
 
 /// Suspend the RTOS Kernel scheduler.
 uint32_t osKernelSuspend (void) {
+  EvrRtxKernelSuspend();
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return 0U;
   }
   return __svcKernelSuspend();
@@ -531,7 +579,9 @@
 
 /// Resume the RTOS Kernel scheduler.
 void osKernelResume (uint32_t sleep_ticks) {
+  EvrRtxKernelResume(sleep_ticks);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelError(osErrorISR);
     return;
   }
   __svcKernelResume(sleep_ticks);
@@ -540,6 +590,7 @@
 /// Get the RTOS kernel tick count.
 uint64_t osKernelGetTickCount (void) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelGetTickCount(0U);
     return  0U;
   } else {
     return  __svcKernelGetTickCount();
@@ -549,6 +600,7 @@
 /// Get the RTOS kernel tick frequency.
 uint32_t osKernelGetTickFreq (void) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxKernelGetTickFreq(0U);
     return  0U;
   } else {
     return  __svcKernelGetTickFreq();
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_lib.h b/CMSIS/RTOS2/RTX/Source/rtx_lib.h
index b4bff73..607916f 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_lib.h
+++ b/CMSIS/RTOS2/RTX/Source/rtx_lib.h
@@ -32,6 +32,7 @@
 #include "tz_context.h"                 // TrustZone Context API
 #include "cmsis_os2.h"                  // CMSIS RTOS API
 #include "rtx_os.h"                     // RTX OS definitions
+#include "rtx_evr.h"                    // RTX Event Recorder definitions
 
 
 //  ==== Library defines ====
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_memory.c b/CMSIS/RTOS2/RTX/Source/rtx_memory.c
index 8e75cf3..793b603 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_memory.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_memory.c
@@ -54,6 +54,7 @@
 
   if ((mem == NULL) || ((uint32_t)mem & 7U) || (size & 7U) ||
       (size < (sizeof(mem_head_t) + 2*sizeof(mem_block_t)))) {
+    EvrRtxMemoryInit(mem, size, 0U);
     return 0U;
   }
 
@@ -66,6 +67,8 @@
   ptr->next->next = NULL;
   ptr->info = 0U;
 
+  EvrRtxMemoryInit(mem, size, 1U);
+
   return 1U;
 }
 
@@ -79,6 +82,7 @@
   uint32_t     hole_size;
 
   if ((mem == NULL) || (size == 0U) || (type & ~MB_INFO_TYPE_MASK)) {
+    EvrRtxMemoryAlloc(mem, size, type, NULL);
     return NULL;
   }
 
@@ -99,6 +103,7 @@
     p = p->next;
     if (p->next == NULL) {
       // Failed (end of list)
+      EvrRtxMemoryAlloc(mem, size, type, NULL);
       return NULL;
     }
   }
@@ -118,6 +123,8 @@
     ptr = (mem_block_t *)((uint32_t)p_new + sizeof(mem_block_t));
   }
 
+  EvrRtxMemoryAlloc(mem, size, type, ptr);
+
   return ptr;
 }
 
@@ -129,6 +136,7 @@
   mem_block_t *p, *p_prev, *ptr;
 
   if ((mem == NULL) || (block == NULL)) {
+    EvrRtxMemoryFree(mem, block, 0U);
     return 0U;
   }
 
@@ -142,6 +150,7 @@
     p = p->next;
     if (p == NULL) {
       // Not found
+      EvrRtxMemoryFree(mem, block, 0U);
       return 0U;
     }
   }
@@ -156,5 +165,7 @@
     p_prev->next = p->next;
   }
 
+  EvrRtxMemoryFree(mem, block, 1U);
+
   return 1U;
 }
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_mempool.c b/CMSIS/RTOS2/RTX/Source/rtx_mempool.c
index bd00306..1bcd976 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_mempool.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_mempool.c
@@ -58,6 +58,8 @@
   }
   *((void **)block_mem) = NULL;
 
+  EvrRtxMemoryBlockInit(mp_info, block_count, block_size, block_mem);
+
   return 1U;
 }
 
@@ -71,6 +73,7 @@
   void *block;
 
   if (mp_info == NULL) {
+    EvrRtxMemoryBlockAlloc(NULL, NULL);
     return NULL;
   }
 
@@ -98,6 +101,8 @@
   }
 #endif
 
+  EvrRtxMemoryBlockAlloc(mp_info, block);
+
   return block;
 }
 
@@ -112,6 +117,7 @@
   osStatus_t status;
 
   if ((mp_info == NULL) || (block < mp_info->block_base) || (block >= mp_info->block_lim)) {
+    EvrRtxMemoryBlockFree(mp_info, block, osErrorParameter);
     return osErrorParameter;
   }
 
@@ -139,6 +145,8 @@
   }
 #endif
 
+  EvrRtxMemoryBlockFree(mp_info, block, status);
+
   return status;
 }
 
@@ -160,6 +168,7 @@
       // Wakeup waiting Thread with highest Priority
       thread = osRtxThreadListGet((os_object_t*)mp);
       osRtxThreadWaitExit(thread, (uint32_t)block, false);
+      EvrRtxMemoryPoolAllocated(mp, block);
     }
   }
 }
@@ -190,10 +199,12 @@
 
   // Check parameters
   if ((block_count == 0U) || (block_size  == 0U)) {
+    EvrRtxMemoryPoolError(NULL, osErrorParameter);
     return NULL;
   }
   block_size = (block_size + 3U) & ~3UL;
   if ((__CLZ(block_count) + __CLZ(block_size)) < 32) {
+    EvrRtxMemoryPoolError(NULL, osErrorParameter);
     return NULL;
   }
 
@@ -207,19 +218,23 @@
     mp_size = attr->mp_size;
     if (mp != NULL) {
       if (((uint32_t)mp & 3U) || (attr->cb_size < sizeof(os_memory_pool_t))) {
+        EvrRtxMemoryPoolError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     } else {
       if (attr->cb_size != 0U) {
+        EvrRtxMemoryPoolError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     }
     if (mp_mem != NULL) {
       if (((uint32_t)mp_mem & 3U) || (mp_size < size)) {
+        EvrRtxMemoryPoolError(NULL, osRtxErrorInvalidDataMemory);
         return NULL;
       }
     } else {
       if (mp_size != 0U) {
+        EvrRtxMemoryPoolError(NULL, osRtxErrorInvalidDataMemory);
         return NULL;
       }
     }
@@ -237,6 +252,7 @@
       mp = osRtxMemoryAlloc(osRtxInfo.mem.common, sizeof(os_memory_pool_t), 1U);
     }
     if (mp == NULL) {
+      EvrRtxMemoryPoolError(NULL, osErrorNoMemory);
       return NULL;
     }
     flags = osRtxFlagSystemObject;
@@ -248,6 +264,7 @@
   if (mp_mem == NULL) {
     mp_mem = osRtxMemoryAlloc(osRtxInfo.mem.mp_data, size, 0U);
     if (mp_mem == NULL) {
+      EvrRtxMemoryPoolError(NULL, osErrorNoMemory);
       if (flags & osRtxFlagSystemObject) {
         if (osRtxInfo.mpi.memory_pool != NULL) {
           osRtxMemoryPoolFree(osRtxInfo.mpi.memory_pool, mp);
@@ -272,6 +289,8 @@
   // Register post ISR processing function
   osRtxInfo.post_process.memory_pool = osRtxMemoryPoolPostProcess;
 
+  EvrRtxMemoryPoolCreated(mp);
+
   return mp;
 }
 
@@ -282,14 +301,18 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolGetName(mp, NULL);
     return NULL;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolGetName(mp, NULL);
     return NULL;
   }
 
+  EvrRtxMemoryPoolGetName(mp, mp->name);
+
   return mp->name;
 }
 
@@ -301,11 +324,13 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolError(mp, osErrorParameter);
     return NULL;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolError(mp, osErrorResource);
     return NULL;
   }
 
@@ -317,7 +342,12 @@
       // Suspend current Thread
       osRtxThreadListPut((os_object_t*)mp, osRtxThreadGetRunning());
       osRtxThreadWaitEnter(osRtxThreadWaitingMemoryPool, timeout);
+      EvrRtxMemoryPoolAllocPending(mp, timeout);
+    } else {
+      EvrRtxMemoryPoolAllocFailed(mp);
     }
+  } else {
+    EvrRtxMemoryPoolAllocated(mp, block);
   }
 
   return block;
@@ -332,17 +362,20 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolError(mp, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolError(mp, osErrorResource);
     return osErrorResource;
   }
 
   // Free memory
   status = osRtxMemoryPoolFree(&mp->mp_info, block);
   if (status == osOK) {
+    EvrRtxMemoryPoolDeallocated(mp, block);
     // Check if Thread is waiting to allocate memory
     if (mp->thread_list != NULL) {
       // Allocate memory
@@ -351,8 +384,11 @@
         // Wakeup waiting Thread with highest Priority
         thread = osRtxThreadListGet((os_object_t*)mp);
         osRtxThreadWaitExit(thread, (uint32_t)block, true);
+        EvrRtxMemoryPoolAllocated(mp, block);
       }
     }
+  } else {
+    EvrRtxMemoryPoolFreeFailed(mp, block);
   }
 
   return status;
@@ -365,14 +401,18 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolGetCapacity(mp, 0U);
     return 0U;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolGetCapacity(mp, 0U);
     return 0U;
   }
 
+  EvrRtxMemoryPoolGetCapacity(mp, mp->mp_info.max_blocks);
+
   return mp->mp_info.max_blocks;
 }
 
@@ -383,14 +423,18 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolGetBlockSize(mp, 0U);
     return 0U;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolGetBlockSize(mp, 0U);
     return 0U;
   }
 
+  EvrRtxMemoryPoolGetBlockSize(mp, mp->mp_info.block_size);
+
   return mp->mp_info.block_size;
 }
 
@@ -401,14 +445,18 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolGetCount(mp, 0U);
     return 0U;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolGetCount(mp, 0U);
     return 0U;
   }
 
+  EvrRtxMemoryPoolGetCount(mp, mp->mp_info.used_blocks);
+
   return mp->mp_info.used_blocks;
 }
 
@@ -419,14 +467,18 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolGetSpace(mp, 0U);
     return 0U;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolGetSpace(mp, 0U);
     return 0U;
   }
 
+  EvrRtxMemoryPoolGetSpace(mp, mp->mp_info.max_blocks - mp->mp_info.used_blocks);
+
   return (mp->mp_info.max_blocks - mp->mp_info.used_blocks);
 }
 
@@ -438,11 +490,13 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolError(mp, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolError(mp, osErrorResource);
     return osErrorResource;
   }
 
@@ -472,6 +526,8 @@
     }
   }
 
+  EvrRtxMemoryPoolDestroyed(mp);
+
   return osOK;
 }
 
@@ -487,16 +543,23 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool) || (timeout != 0U)) {
+    EvrRtxMemoryPoolError(mp, osErrorParameter);
     return NULL;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolError(mp, osErrorResource);
     return NULL;
   }
 
   // Allocate memory
   block = osRtxMemoryPoolAlloc(&mp->mp_info);
+  if (block == NULL) {
+    EvrRtxMemoryPoolAllocFailed(mp);
+  } else {
+    EvrRtxMemoryPoolAllocated(mp, block);
+  }
 
   return block;
 }
@@ -510,11 +573,13 @@
 
   // Check parameters
   if ((mp == NULL) || (mp->id != osRtxIdMemoryPool)) {
+    EvrRtxMemoryPoolError(mp, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mp->state == osRtxObjectInactive) {
+    EvrRtxMemoryPoolError(mp, osErrorResource);
     return osErrorResource;
   }
 
@@ -523,6 +588,9 @@
   if (status == osOK) {
     // Register post ISR processing
     osRtxPostProcess((os_object_t *)mp);
+    EvrRtxMemoryPoolDeallocated(mp, block);
+  } else {
+    EvrRtxMemoryPoolFreeFailed(mp, block);
   }
 
   return status;
@@ -533,7 +601,9 @@
 
 /// Create and Initialize a Memory Pool object.
 osMemoryPoolId_t osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr) {
+  EvrRtxMemoryPoolNew(block_count, block_size, attr);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMemoryPoolError(NULL, osErrorISR);
     return NULL;
   }
   return __svcMemoryPoolNew(block_count, block_size, attr);
@@ -542,6 +612,7 @@
 /// Get name of a Memory Pool object.
 const char *osMemoryPoolGetName (osMemoryPoolId_t mp_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMemoryPoolGetName(mp_id, NULL);
     return NULL;
   }
   return __svcMemoryPoolGetName(mp_id);
@@ -549,6 +620,7 @@
 
 /// Allocate a memory block from a Memory Pool.
 void *osMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout) {
+  EvrRtxMemoryPoolAlloc(mp_id, timeout);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxMemoryPoolAlloc(mp_id, timeout);
   } else {
@@ -558,6 +630,7 @@
 
 /// Return an allocated memory block back to a Memory Pool.
 osStatus_t osMemoryPoolFree (osMemoryPoolId_t mp_id, void *block) {
+  EvrRtxMemoryPoolFree(mp_id, block);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxMemoryPoolFree(mp_id, block);
   } else {
@@ -603,7 +676,9 @@
 
 /// Delete a Memory Pool object.
 osStatus_t osMemoryPoolDelete (osMemoryPoolId_t mp_id) {
+  EvrRtxMemoryPoolDelete(mp_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMemoryPoolError(mp_id, osErrorISR);
     return osErrorISR;
   }
   return __svcMemoryPoolDelete(mp_id);
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_msgqueue.c b/CMSIS/RTOS2/RTX/Source/rtx_msgqueue.c
index 81e928b..3574b3b 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_msgqueue.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_msgqueue.c
@@ -190,6 +190,7 @@
         msg->flags    = 0U;
         msg->priority = (uint8_t)reg[3];
         MessageQueuePut(mq, msg);
+        EvrRtxMessageQueueInserted(mq, (void *)reg[2]);
       }
     }
   } else {
@@ -201,6 +202,7 @@
     }
     // Check if Thread is waiting to receive a Message
     if ((mq->thread_list != NULL) && (mq->thread_list->state == osRtxThreadWaitingMessageGet)) {
+      EvrRtxMessageQueueInserted(mq, (uint8_t *)msg + sizeof(os_message_t));
       // Wakeup waiting Thread with highest Priority
       thread = osRtxThreadListGet((os_object_t*)mq);
       osRtxThreadWaitExit(thread, (uint32_t)osOK, false);
@@ -210,11 +212,13 @@
       if (reg[3] != 0U) {
         *((uint8_t *)reg[3]) = msg->priority;
       }
+      EvrRtxMessageQueueRetrieved(mq, (void *)reg[2]);
       // Free memory
       msg->state = osRtxObjectInactive;
       osRtxMemoryPoolFree(&mq->mp_info, msg);
     } else {
       MessageQueuePut(mq, msg);
+      EvrRtxMessageQueueInserted(mq, (uint8_t *)msg + sizeof(os_message_t));
     }
   }
 }
@@ -246,11 +250,13 @@
 
   // Check parameters
   if ((msg_count == 0U) || (msg_size  == 0U)) {
+    EvrRtxMessageQueueError(NULL, osErrorParameter);
     return NULL;
   }
   msg_size = (msg_size + 3U) & ~3UL;
   block_size = msg_size + sizeof(os_message_t);
   if ((__CLZ(msg_count) + __CLZ(block_size)) < 32) {
+    EvrRtxMessageQueueError(NULL, osErrorParameter);
     return NULL;
   }
 
@@ -264,19 +270,23 @@
     mq_size = attr->mq_size;
     if (mq != NULL) {
       if (((uint32_t)mq & 3U) || (attr->cb_size < sizeof(os_message_queue_t))) {
+        EvrRtxMessageQueueError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     } else {
       if (attr->cb_size != 0U) {
+        EvrRtxMessageQueueError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     }
     if (mq_mem != NULL) {
       if (((uint32_t)mq_mem & 3U) || (mq_size < size)) {
+        EvrRtxMessageQueueError(NULL, osRtxErrorInvalidDataMemory);
         return NULL;
       }
     } else {
       if (mq_size != 0U) {
+        EvrRtxMessageQueueError(NULL, osRtxErrorInvalidDataMemory);
         return NULL;
       }
     }
@@ -294,6 +304,7 @@
       mq = osRtxMemoryAlloc(osRtxInfo.mem.common, sizeof(os_message_queue_t), 1U);
     }
     if (mq == NULL) {
+      EvrRtxMessageQueueError(NULL, osErrorNoMemory);
       return NULL;
     }
     flags = osRtxFlagSystemObject;
@@ -305,6 +316,7 @@
   if (mq_mem == NULL) {
     mq_mem = osRtxMemoryAlloc(osRtxInfo.mem.mq_data, size, 0U);
     if (mq_mem == NULL) {
+      EvrRtxMessageQueueError(NULL, osErrorNoMemory);
       if (flags & osRtxFlagSystemObject) {
         if (osRtxInfo.mpi.message_queue != NULL) {
           osRtxMemoryPoolFree(osRtxInfo.mpi.message_queue, mq);
@@ -333,6 +345,8 @@
   // Register post ISR processing function
   osRtxInfo.post_process.message_queue = osRtxMessageQueuePostProcess;
 
+  EvrRtxMessageQueueCreated(mq);
+
   return mq;
 }
 
@@ -343,14 +357,18 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue)) {
+    EvrRtxMessageQueueGetName(mq, NULL);
     return NULL;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueGetName(mq, NULL);
     return NULL;
   }
 
+  EvrRtxMessageQueueGetName(mq, mq->name);
+
   return mq->name;
 }
 
@@ -364,16 +382,19 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue) || (msg_ptr == NULL)) {
+    EvrRtxMessageQueueError(mq, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueError(mq, osErrorResource);
     return osErrorResource;
   }
 
   // Check if Thread is waiting to receive a Message
   if ((mq->thread_list != NULL) && (mq->thread_list->state == osRtxThreadWaitingMessageGet)) {
+    EvrRtxMessageQueueInserted(mq, msg_ptr);
     // Wakeup waiting Thread with highest Priority
     thread = osRtxThreadListGet((os_object_t*)mq);
     osRtxThreadWaitExit(thread, (uint32_t)osOK, true);
@@ -383,6 +404,7 @@
     if (reg[3] != 0U) {
       *((uint8_t *)reg[3]) = msg_prio;
     }
+    EvrRtxMessageQueueRetrieved(mq, (void *)reg[2]);
     return osOK;
   }
 
@@ -407,12 +429,16 @@
       reg = (uint32_t *)(__get_PSP());
       reg[2] = (uint32_t)msg_ptr;
       reg[3] = (uint32_t)msg_prio;
+      EvrRtxMessageQueuePutPending(mq, msg_ptr, timeout);
       return osErrorTimeout;
     } else {
+      EvrRtxMessageQueueNotInserted(mq, msg_ptr);
       return osErrorResource;
     }
   }
 
+  EvrRtxMessageQueueInserted(mq, msg_ptr);
+
   return osOK;
 }
 
@@ -426,11 +452,13 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue) || (msg_ptr == NULL)) {
+    EvrRtxMessageQueueError(mq, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueError(mq, osErrorResource);
     return osErrorResource;
   }
 
@@ -443,6 +471,7 @@
     if (msg_prio != NULL) {
       *msg_prio = msg->priority;
     }
+    EvrRtxMessageQueueRetrieved(mq, msg_ptr);
     // Free memory
     msg->state = osRtxObjectInactive;
     osRtxMemoryPoolFree(&mq->mp_info, msg);
@@ -456,8 +485,10 @@
       reg = (uint32_t *)(__get_PSP());
       reg[2] = (uint32_t)msg_ptr;
       reg[3] = (uint32_t)msg_prio;
+      EvrRtxMessageQueueGetPending(mq, msg_ptr, timeout);
       return osErrorTimeout;
     } else {
+      EvrRtxMessageQueueNotRetrieved(mq, msg_ptr);
       return osErrorResource;
     }
   }
@@ -479,6 +510,7 @@
       msg->flags    = 0U;
       msg->priority = (uint8_t)reg[3];
       MessageQueuePut(mq, msg);
+      EvrRtxMessageQueueInserted(mq, (void *)reg[2]);
     }
   }
 
@@ -492,14 +524,18 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue)) {
+    EvrRtxMessageQueueGetCapacity(mq, 0U);
     return 0U;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueGetCapacity(mq, 0U);
     return 0U;
   }
 
+  EvrRtxMessageQueueGetCapacity(mq, mq->mp_info.max_blocks);
+
   return mq->mp_info.max_blocks;
 }
 
@@ -510,14 +546,18 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue)) {
+    EvrRtxMessageQueueGetCapacity(mq, 0U);
     return 0U;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueGetCapacity(mq, 0U);
     return 0U;
   }
 
+  EvrRtxMessageQueueGetCapacity(mq, mq->msg_size);
+
   return mq->msg_size;
 }
 
@@ -528,14 +568,18 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue)) {
+    EvrRtxMessageQueueGetCount(mq, 0U);
     return 0U;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueGetCount(mq, 0U);
     return 0U;
   }
 
+  EvrRtxMessageQueueGetCount(mq, mq->msg_count);
+
   return mq->msg_count;
 }
 
@@ -546,14 +590,18 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue)) {
+    EvrRtxMessageQueueGetSpace(mq, 0U);
     return 0U;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueGetSpace(mq, 0U);
     return 0U;
   }
 
+  EvrRtxMessageQueueGetSpace(mq, mq->mp_info.max_blocks - mq->msg_count);
+
   return (mq->mp_info.max_blocks - mq->msg_count);
 }
 
@@ -567,11 +615,13 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue)) {
+    EvrRtxMessageQueueError(mq, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueError(mq, osErrorResource);
     return osErrorResource;
   }
 
@@ -583,6 +633,7 @@
       break;
     }
     MessageQueueRemove(mq, msg);
+    EvrRtxMessageQueueRetrieved(mq, NULL);
     // Free memory
     msg->state = osRtxObjectInactive;
     osRtxMemoryPoolFree(&mq->mp_info, msg);
@@ -606,11 +657,14 @@
         msg->flags    = 0U;
         msg->priority = (uint8_t)reg[3];
         MessageQueuePut(mq, msg);
+        EvrRtxMessageQueueInserted(mq, (void *)reg[2]);
       }
     } while ((msg != NULL) && (mq->thread_list != NULL));
     osRtxThreadDispatch(NULL);
   }
 
+  EvrRtxMessageQueueResetDone(mq);
+
   return osOK;
 }
 
@@ -622,11 +676,13 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue)) {
+    EvrRtxMessageQueueError(mq, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueError(mq, osErrorResource);
     return osErrorResource;
   }
 
@@ -656,6 +712,8 @@
     }
   }
 
+  EvrRtxMessageQueueDestroyed(mq);
+
   return osOK;
 }
 
@@ -672,11 +730,13 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue) || (msg_ptr == NULL) || (timeout != 0U)) {
+    EvrRtxMessageQueueError(mq, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueError(mq, osErrorResource);
     return osErrorResource;
   }
 
@@ -695,9 +755,12 @@
     osRtxPostProcess((os_object_t *)msg);
   } else {
     // No memory available
+    EvrRtxMessageQueueNotInserted(mq, msg_ptr);
     return osErrorResource;
   }
 
+  EvrRtxMessageQueueInsertPending(mq, msg_ptr);
+
   return osOK;
 }
 
@@ -711,11 +774,13 @@
 
   // Check parameters
   if ((mq == NULL) || (mq->id != osRtxIdMessageQueue) || (msg_ptr == NULL) || (timeout != 0U)) {
+    EvrRtxMessageQueueError(mq, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mq->state == osRtxObjectInactive) {
+    EvrRtxMessageQueueError(mq, osErrorResource);
     return osErrorResource;
   }
 
@@ -727,12 +792,14 @@
     if (msg_prio != NULL) {
       *msg_prio = msg->priority;
     }
+    EvrRtxMessageQueueRetrieved(mq, msg_ptr);
     // Register post ISR processing
      ptr = (void *)((uint8_t *)msg + sizeof(os_message_t));
     *ptr = mq;
     osRtxPostProcess((os_object_t *)msg);
   } else {
     // No Message available
+    EvrRtxMessageQueueNotRetrieved(mq, msg_ptr);
     return osErrorResource;
   }
 
@@ -744,7 +811,9 @@
 
 /// Create and Initialize a Message Queue object.
 osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr) {
+  EvrRtxMessageQueueNew(msg_count, msg_size, attr);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMessageQueueError(NULL, osErrorISR);
     return NULL;
   }
   return __svcMessageQueueNew(msg_count, msg_size, attr);
@@ -753,6 +822,7 @@
 /// Get name of a Message Queue object.
 const char *osMessageQueueGetName (osMessageQueueId_t mq_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMessageQueueGetName(mq_id, NULL);
     return NULL;
   }
   return __svcMessageQueueGetName(mq_id);
@@ -760,6 +830,7 @@
 
 /// Put a Message into a Queue or timeout if Queue is full.
 osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout) {
+  EvrRtxMessageQueuePut(mq_id, msg_ptr, msg_prio, timeout);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxMessageQueuePut(mq_id, msg_ptr, msg_prio, timeout);
   } else {
@@ -769,6 +840,7 @@
 
 /// Get a Message from a Queue or timeout if Queue is empty.
 osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) {
+  EvrRtxMessageQueueGet(mq_id, msg_ptr, msg_prio, timeout);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxMessageQueueGet(mq_id, msg_ptr, msg_prio, timeout);
   } else {
@@ -814,7 +886,9 @@
 
 /// Reset a Message Queue to initial empty state.
 osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id) {
+  EvrRtxMessageQueueReset(mq_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMessageQueueError(mq_id, osErrorISR);
     return osErrorISR;
   }
   return __svcMessageQueueReset(mq_id);
@@ -822,7 +896,9 @@
 
 /// Delete a Message Queue object.
 osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id) {
+  EvrRtxMessageQueueDelete(mq_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMessageQueueError(mq_id, osErrorISR);
     return osErrorISR;
   }
   return __svcMessageQueueDelete(mq_id);
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_mutex.c b/CMSIS/RTOS2/RTX/Source/rtx_mutex.c
index 4804a00..8288a39 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_mutex.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_mutex.c
@@ -42,6 +42,7 @@
     if (mutex->attr & osMutexRobust) {
       // Clear Lock counter
       mutex->lock = 0U;
+      EvrRtxMutexReleased(mutex, 0U);
       // Check if Thread is waiting for a Mutex
       if (mutex->thread_list != NULL) {
         // Wakeup waiting Thread with highest Priority
@@ -53,6 +54,7 @@
         mutex->owner_prev   = NULL;
         thread->mutex_list  = mutex;
         mutex->lock = 1U;
+        EvrRtxMutexAcquired(mutex, 1U);
       }
     }
     mutex = mutex_list;
@@ -85,10 +87,12 @@
     mutex     = attr->cb_mem;
     if (mutex != NULL) {
       if (((uint32_t)mutex & 3U) || (attr->cb_size < sizeof(os_mutex_t))) {
+        EvrRtxMutexError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     } else {
       if (attr->cb_size != 0U) {
+        EvrRtxMutexError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     }
@@ -106,6 +110,7 @@
       mutex = osRtxMemoryAlloc(osRtxInfo.mem.common, sizeof(os_mutex_t), 1U);
     }
     if (mutex == NULL) {
+      EvrRtxMutexError(NULL, osErrorNoMemory);
       return NULL;
     }
     flags = osRtxFlagSystemObject;
@@ -125,6 +130,8 @@
   mutex->owner_next   = NULL;
   mutex->lock         = 0U;
 
+  EvrRtxMutexCreated(mutex);
+
   return mutex;
 }
 
@@ -135,14 +142,18 @@
 
   // Check parameters
   if ((mutex == NULL) || (mutex->id != osRtxIdMutex)) {
+    EvrRtxMutexGetName(mutex, NULL);
     return NULL;
   }
 
   // Check object state
   if (mutex->state == osRtxObjectInactive) {
+    EvrRtxMutexGetName(mutex, NULL);
     return NULL;
   }
 
+  EvrRtxMutexGetName(mutex, mutex->name);
+
   return mutex->name;
 }
 
@@ -154,16 +165,19 @@
 
   runnig_thread = osRtxThreadGetRunning();
   if (runnig_thread == NULL) {
+    EvrRtxMutexError(mutex, osRtxErrorKernelNotRunning);
     return osError;
   }
 
   // Check parameters
   if ((mutex == NULL) || (mutex->id != osRtxIdMutex)) {
+    EvrRtxMutexError(mutex, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mutex->state == osRtxObjectInactive) {
+    EvrRtxMutexError(mutex, osErrorResource);
     return osErrorResource;
   }
 
@@ -175,6 +189,7 @@
     mutex->owner_prev   = NULL;
     runnig_thread->mutex_list = mutex;
     mutex->lock = 1U;
+    EvrRtxMutexAcquired(mutex, mutex->lock);
     return osOK;
   }
 
@@ -182,9 +197,11 @@
   if ((mutex->attr & osMutexRecursive) && (mutex->owner_thread == runnig_thread)) {
     // Increment lock counter
     if (mutex->lock == osRtxMutexLockLimit) {
+      EvrRtxMutexError(mutex, osRtxErrorMutexLockLimit);
       return osErrorResource;
     }
     mutex->lock++;
+    EvrRtxMutexAcquired(mutex, mutex->lock);
     return osOK;
   }
 
@@ -201,10 +218,13 @@
     // Suspend current Thread
     osRtxThreadListPut((os_object_t*)mutex, runnig_thread);
     osRtxThreadWaitEnter(osRtxThreadWaitingMutex, timeout);
+    EvrRtxMutexAcquirePending(mutex, timeout);
     return osErrorTimeout;
   }
 
   // Mutex was not acquired
+  EvrRtxMutexNotAcquired(mutex);
+
   return osErrorResource;
 }
 
@@ -219,31 +239,37 @@
 
   runnig_thread = osRtxThreadGetRunning();
   if (runnig_thread == NULL) {
+    EvrRtxMutexError(mutex, osRtxErrorKernelNotRunning);
     return osError;
   }
 
   // Check parameters
   if ((mutex == NULL) || (mutex->id != osRtxIdMutex)) {
+    EvrRtxMutexError(mutex, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mutex->state == osRtxObjectInactive) {
+    EvrRtxMutexError(mutex, osErrorResource);
     return osErrorResource;
   }
 
   // Check if running Thread is not the owner
   if (mutex->owner_thread != runnig_thread) {
+    EvrRtxMutexError(mutex, osRtxErrorMutexNotOwned);
     return osErrorResource;
   }
 
   // Check if Mutex is not locked
   if (mutex->lock == 0U) {
+    EvrRtxMutexError(mutex, osRtxErrorMutexNotLocked);
     return osErrorResource;
   }
 
   // Decrement Lock counter
   mutex->lock--;
+  EvrRtxMutexReleased(mutex, mutex->lock);
 
   // Check Lock counter
   if (mutex->lock != 0U) {
@@ -286,6 +312,7 @@
     mutex->owner_prev   = NULL;
     thread->mutex_list  = mutex;
     mutex->lock = 1U;
+    EvrRtxMutexAcquired(mutex, 1U);
   }
 
   osRtxThreadDispatch(NULL);
@@ -300,19 +327,24 @@
 
   // Check parameters
   if ((mutex == NULL) || (mutex->id != osRtxIdMutex)) {
+    EvrRtxMutexGetOwner(mutex, NULL);
     return NULL;
   }
 
   // Check object state
   if (mutex->state == osRtxObjectInactive) {
+    EvrRtxMutexGetOwner(mutex, NULL);
     return NULL;
   }
 
   // Check if Mutex is not locked
   if (mutex->lock == 0U) {
+    EvrRtxMutexGetOwner(mutex, NULL);
     return NULL;
   }
 
+  EvrRtxMutexGetOwner(mutex, mutex->owner_thread);
+
   return mutex->owner_thread;
 }
 
@@ -326,11 +358,13 @@
 
   // Check parameters
   if ((mutex == NULL) || (mutex->id != osRtxIdMutex)) {
+    EvrRtxMutexError(mutex, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (mutex->state == osRtxObjectInactive) {
+    EvrRtxMutexError(mutex, osErrorResource);
     return osErrorResource;
   }
 
@@ -390,6 +424,8 @@
     }
   }
 
+  EvrRtxMutexDestroyed(mutex);
+
   return osOK;
 }
 
@@ -398,7 +434,9 @@
 
 /// Create and Initialize a Mutex object.
 osMutexId_t osMutexNew (const osMutexAttr_t *attr) {
+  EvrRtxMutexNew(attr);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMutexError(NULL, osErrorISR);
     return NULL;
   }
   return __svcMutexNew(attr);
@@ -407,6 +445,7 @@
 /// Get name of a Mutex object.
 const char *osMutexGetName (osMutexId_t mutex_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMutexGetName(mutex_id, NULL);
     return NULL;
   }
   return __svcMutexGetName(mutex_id);
@@ -414,7 +453,9 @@
 
 /// Acquire a Mutex or timeout if it is locked.
 osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
+  EvrRtxMutexAcquire(mutex_id, timeout);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMutexError(mutex_id, osErrorISR);
     return osErrorISR;
   }
   return __svcMutexAcquire(mutex_id, timeout);
@@ -422,7 +463,9 @@
 
 /// Release a Mutex that was acquired by \ref osMutexAcquire.
 osStatus_t osMutexRelease (osMutexId_t mutex_id) {
+  EvrRtxMutexRelease(mutex_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMutexError(mutex_id, osErrorISR);
     return osErrorISR;
   }
   return __svcMutexRelease(mutex_id);
@@ -431,6 +474,7 @@
 /// Get Thread which owns a Mutex object.
 osThreadId_t osMutexGetOwner (osMutexId_t mutex_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMutexGetOwner(mutex_id, NULL);
     return NULL;
   }
   return __svcMutexGetOwner(mutex_id);
@@ -438,7 +482,9 @@
 
 /// Delete a Mutex object.
 osStatus_t osMutexDelete (osMutexId_t mutex_id) {
+  EvrRtxMutexDelete(mutex_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxMutexError(mutex_id, osErrorISR);
     return osErrorISR;
   }
   return __svcMutexDelete(mutex_id);
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_semaphore.c b/CMSIS/RTOS2/RTX/Source/rtx_semaphore.c
index 186a14d..44fbe89 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_semaphore.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_semaphore.c
@@ -113,6 +113,7 @@
       // Wakeup waiting Thread with highest Priority
       thread = osRtxThreadListGet((os_object_t*)semaphore);
       osRtxThreadWaitExit(thread, (uint32_t)osOK, false);
+      EvrRtxSemaphoreAcquired(semaphore);
     }
   }
 }
@@ -137,6 +138,7 @@
 
   // Check parameters
   if ((max_count == 0U) || (max_count > osRtxSemaphoreTokenLimit) || (initial_count > max_count)) {
+    EvrRtxSemaphoreError(NULL, osErrorParameter);
     return NULL;
   }
 
@@ -146,10 +148,12 @@
     semaphore = attr->cb_mem;
     if (semaphore != NULL) {
       if (((uint32_t)semaphore & 3U) || (attr->cb_size < sizeof(os_semaphore_t))) {
+        EvrRtxSemaphoreError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     } else {
       if (attr->cb_size != 0U) {
+        EvrRtxSemaphoreError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     }
@@ -166,6 +170,7 @@
       semaphore = osRtxMemoryAlloc(osRtxInfo.mem.common, sizeof(os_semaphore_t), 1U);
     }
     if (semaphore == NULL) {
+      EvrRtxSemaphoreError(NULL, osErrorNoMemory);
       return NULL;
     }
     flags = osRtxFlagSystemObject;
@@ -185,6 +190,8 @@
   // Register post ISR processing function
   osRtxInfo.post_process.semaphore = osRtxSemaphorePostProcess;
 
+  EvrRtxSemaphoreCreated(semaphore);
+
   return semaphore;
 }
 
@@ -195,14 +202,18 @@
 
   // Check parameters
   if ((semaphore == NULL) || (semaphore->id != osRtxIdSemaphore)) {
+    EvrRtxSemaphoreGetName(semaphore, NULL);
     return NULL;
   }
 
   // Check object state
   if (semaphore->state == osRtxObjectInactive) {
+    EvrRtxSemaphoreGetName(semaphore, NULL);
     return NULL;
   }
 
+  EvrRtxSemaphoreGetName(semaphore, semaphore->name);
+
   return semaphore->name;
 }
 
@@ -213,11 +224,13 @@
 
   // Check parameters
   if ((semaphore == NULL) || (semaphore->id != osRtxIdSemaphore)) {
+    EvrRtxSemaphoreError(semaphore, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (semaphore->state == osRtxObjectInactive) {
+    EvrRtxSemaphoreError(semaphore, osErrorResource);
     return osErrorResource;
   }
 
@@ -228,12 +241,16 @@
       // Suspend current Thread
       osRtxThreadListPut((os_object_t*)semaphore, osRtxThreadGetRunning());
       osRtxThreadWaitEnter(osRtxThreadWaitingSemaphore, timeout);
+      EvrRtxSemaphoreAcquirePending(semaphore, timeout);
       return osErrorTimeout;
     } else {
+      EvrRtxSemaphoreNotAcquired(semaphore);
       return osErrorResource;
     }
   }
 
+  EvrRtxSemaphoreAcquired(semaphore);
+
   return osOK;
 }
 
@@ -245,24 +262,30 @@
 
   // Check parameters
   if ((semaphore == NULL) || (semaphore->id != osRtxIdSemaphore)) {
+    EvrRtxSemaphoreError(semaphore, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (semaphore->state == osRtxObjectInactive) {
+    EvrRtxSemaphoreError(semaphore, osErrorResource);
     return osErrorResource;
   }
 
   // Check if Thread is waiting for a token
   if (semaphore->thread_list != NULL) {
+    EvrRtxSemaphoreReleased(semaphore);
     // Wakeup waiting Thread with highest Priority
     thread = osRtxThreadListGet((os_object_t*)semaphore);
     osRtxThreadWaitExit(thread, (uint32_t)osOK, true);
+    EvrRtxSemaphoreAcquired(semaphore);
   } else {
     // Try to release token
     if (SemaphoreTokenIncrement(semaphore) == 0U) {
+      EvrRtxSemaphoreError(semaphore, osRtxErrorSemaphoreCountLimit);
       return osErrorResource;
     }
+    EvrRtxSemaphoreReleased(semaphore);
   }
 
   return osOK;
@@ -275,14 +298,18 @@
 
   // Check parameters
   if ((semaphore == NULL) || (semaphore->id != osRtxIdSemaphore)) {
+    EvrRtxSemaphoreGetCount(semaphore, 0U);
     return 0U;
   }
 
   // Check object state
   if (semaphore->state == osRtxObjectInactive) {
+    EvrRtxSemaphoreGetCount(semaphore, 0U);
     return 0U;
   }
 
+  EvrRtxSemaphoreGetCount(semaphore, semaphore->tokens);
+
   return semaphore->tokens;
 }
 
@@ -294,11 +321,13 @@
 
   // Check parameters
   if ((semaphore == NULL) || (semaphore->id != osRtxIdSemaphore)) {
+    EvrRtxSemaphoreError(semaphore, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (semaphore->state == osRtxObjectInactive) {
+    EvrRtxSemaphoreError(semaphore, osErrorResource);
     return osErrorResource;
   }
 
@@ -323,6 +352,8 @@
     }
   }
 
+  EvrRtxSemaphoreDestroyed(semaphore);
+
   return osOK;
 }
 
@@ -337,20 +368,25 @@
 
   // Check parameters
   if ((semaphore == NULL) || (semaphore->id != osRtxIdSemaphore) || (timeout != 0U)) {
+    EvrRtxSemaphoreError(semaphore, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (semaphore->state == osRtxObjectInactive) {
+    EvrRtxSemaphoreError(semaphore, osErrorResource);
     return osErrorResource;
   }
 
   // Try to acquire token
   if (SemaphoreTokenDecrement(semaphore) == 0U) {
     // No token available
+    EvrRtxSemaphoreNotAcquired(semaphore);
     return osErrorResource;
   }
 
+  EvrRtxSemaphoreAcquired(semaphore);
+
   return osOK;
 }
 
@@ -362,11 +398,13 @@
 
   // Check parameters
   if ((semaphore == NULL) || (semaphore->id != osRtxIdSemaphore)) {
+    EvrRtxSemaphoreError(semaphore, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (semaphore->state == osRtxObjectInactive) {
+    EvrRtxSemaphoreError(semaphore, osErrorResource);
     return osErrorResource;
   }
 
@@ -375,9 +413,12 @@
     // Register post ISR processing
     osRtxPostProcess((os_object_t *)semaphore);
   } else {
+    EvrRtxSemaphoreError(semaphore, osRtxErrorSemaphoreCountLimit);
     return osErrorResource;
   }
 
+  EvrRtxSemaphoreReleased(semaphore);
+
   return osOK;
 }
 
@@ -386,7 +427,9 @@
 
 /// Create and Initialize a Semaphore object.
 osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr) {
+  EvrRtxSemaphoreNew(max_count, initial_count, attr);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxSemaphoreError(NULL, osErrorISR);
     return NULL;
   }
   return __svcSemaphoreNew(max_count, initial_count, attr);
@@ -395,6 +438,7 @@
 /// Get name of a Semaphore object.
 const char *osSemaphoreGetName (osSemaphoreId_t semaphore_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxSemaphoreGetName(semaphore_id, NULL);
     return NULL;
   }
   return __svcSemaphoreGetName(semaphore_id);
@@ -402,6 +446,7 @@
 
 /// Acquire a Semaphore token or timeout if no tokens are available.
 osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout) {
+  EvrRtxSemaphoreAcquire(semaphore_id, timeout);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxSemaphoreAcquire(semaphore_id, timeout);
   } else {
@@ -411,6 +456,7 @@
 
 /// Release a Semaphore token that was acquired by osSemaphoreAcquire.
 osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id) {
+  EvrRtxSemaphoreRelease(semaphore_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxSemaphoreRelease(semaphore_id);
   } else {
@@ -429,7 +475,9 @@
 
 /// Delete a Semaphore object.
 osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id) {
+  EvrRtxSemaphoreDelete(semaphore_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxSemaphoreError(semaphore_id, osErrorISR);
     return osErrorISR;
   }
   return __svcSemaphoreDelete(semaphore_id);
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_thread.c b/CMSIS/RTOS2/RTX/Source/rtx_thread.c
index ad5eb75..380ab09 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_thread.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_thread.c
@@ -385,6 +385,7 @@
   thread->state = osRtxThreadRunning;
   osRtxInfo.thread.run.next = thread;
   osRtxThreadStackCheck();
+  EvrRtxThreadSwitch(thread);
 }
 
 /// Dispatch specified Thread or Ready Thread with Highest Priority.
@@ -436,6 +437,8 @@
   } else {
     osRtxThreadReadyPut(thread);
   }
+
+  EvrRtxThreadUnblocked(thread, ret_val);
 }
 
 /// Enter Thread wait state.
@@ -464,6 +467,8 @@
   thread = osRtxThreadListGet(&osRtxInfo.thread.ready);
   osRtxThreadSwitch(thread);
 
+  EvrRtxThreadBlocked(thread, timeout);
+
   return true;
 }
 
@@ -495,6 +500,7 @@
     thread_flags = ThreadFlagsCheck(thread, thread->wait_flags, thread->flags_options);
     if (thread_flags > 0) {
       osRtxThreadWaitExit(thread, (uint32_t)thread_flags, false);
+      EvrRtxThreadFlagsWaitCompleted(thread->wait_flags, thread->flags_options, thread_flags);
     }
   }
 }
@@ -544,6 +550,7 @@
 
   // Check parameters
   if (func == NULL) {
+    EvrRtxThreadError(NULL, osErrorParameter);
     return NULL;
   }
 
@@ -560,15 +567,18 @@
 #endif
     if (thread != NULL) {
       if (((uint32_t)thread & 3U) || (attr->cb_size < sizeof(os_thread_t))) {
+        EvrRtxThreadError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     } else {
       if (attr->cb_size != 0U) {
+        EvrRtxThreadError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     }
     if (stack_mem != NULL) {
       if (((uint32_t)stack_mem & 7U) || (stack_size == 0U)) {
+        EvrRtxThreadError(NULL, osRtxErrorInvalidThreadStack);
         return NULL;
       }
     }
@@ -576,6 +586,7 @@
       priority = osPriorityNormal;
     } else {
       if ((priority < osPriorityIdle) || (priority > osPriorityISR)) {
+        EvrRtxThreadError(NULL, osRtxErrorInvalidPriority);
         return NULL;
       }
     }
@@ -593,6 +604,7 @@
 
   // Check stack size
   if ((stack_size != 0U) && ((stack_size & 7U) || (stack_size < (64U + 8U)))) {
+    EvrRtxThreadError(NULL, osRtxErrorInvalidThreadStack);
     return NULL;
   }
 
@@ -604,6 +616,7 @@
       thread = osRtxMemoryAlloc(osRtxInfo.mem.common, sizeof(os_thread_t), 1U);
     }
     if (thread == NULL) {
+      EvrRtxThreadError(NULL, osErrorNoMemory);
       return NULL;
     }
     flags = osRtxFlagSystemObject;
@@ -626,6 +639,7 @@
       stack_mem = osRtxMemoryAlloc(osRtxInfo.mem.stack, stack_size, 0U);
     }
     if (stack_mem == NULL) {
+      EvrRtxThreadError(NULL, osErrorNoMemory);
       if (flags & osRtxFlagSystemObject) {
         if (osRtxInfo.mpi.thread != NULL) {
           osRtxMemoryPoolFree(osRtxInfo.mpi.thread, thread);
@@ -643,6 +657,7 @@
   if (tz_module != 0U) {
     tz_memory = TZ_AllocModuleContext_S(tz_module);
     if (tz_memory == 0U) {
+      EvrRtxThreadError(NULL, osRtxErrorTZ_AllocContext_S);
       if (flags & osRtxFlagSystemMemory) {
         if (flags & osRtxThreadFlagDefStack) {
           osRtxMemoryPoolFree(osRtxInfo.mpi.stack, thread->stack_mem);
@@ -712,6 +727,8 @@
   // Register post ISR processing function
   osRtxInfo.post_process.thread = osRtxThreadPostProcess;
 
+  EvrRtxThreadCreated(thread);
+
   osRtxThreadDispatch(thread);
 
   return thread;
@@ -724,14 +741,18 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadGetName(thread, NULL);
     return NULL;
   }
 
   // Check object state
   if (thread->state == osRtxObjectInactive) {
+    EvrRtxThreadGetName(thread, NULL);
     return NULL;
   }
 
+  EvrRtxThreadGetName(thread, thread->name);
+
   return thread->name;
 }
 
@@ -741,6 +762,7 @@
   os_thread_t *thread;
 
   thread = osRtxThreadGetRunning();
+  EvrRtxThreadGetId(thread);
   return thread;
 }
 
@@ -751,9 +773,12 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadGetState(thread, osThreadError);
     return osThreadError;
   }
 
+  EvrRtxThreadGetState(thread, (osThreadState_t)(thread->state & osRtxThreadStateMask));
+
   return ((osThreadState_t)(thread->state & osRtxThreadStateMask));
 }
 
@@ -764,14 +789,18 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadGetStackSize(thread, 0U);
     return 0U;
   }
 
   // Check object state
   if (thread->state == osRtxObjectInactive) {
+    EvrRtxThreadGetStackSize(thread, 0U);
     return 0U;
   }
 
+  EvrRtxThreadGetStackSize(thread, thread->stack_size);
+
   return thread->stack_size;
 }
 
@@ -784,20 +813,24 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadGetStackSpace(thread, 0U);
     return 0U;
   }
 
   // Check object state
   if (thread->state == osRtxObjectInactive) {
+    EvrRtxThreadGetStackSpace(thread, 0U);
     return 0U;
   }
 
   if ((osRtxConfig.flags & osRtxConfigStackWatermark) == 0U) {
+    EvrRtxThreadGetStackSpace(thread, 0U);
     return 0U;
   }
 
   stack = thread->stack_mem;
   if (*stack++ != osRtxStackMagicWord) {
+    EvrRtxThreadGetStackSpace(thread, 0U);
     return 0U;
   }
   for (space = 4U; space < thread->stack_size; space += 4U) {
@@ -806,6 +839,8 @@
     }
   }
 
+  EvrRtxThreadGetStackSpace(thread, space);
+
   return space;
 }
 
@@ -817,12 +852,14 @@
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread) ||
       (priority < osPriorityIdle) || (priority > osPriorityISR)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if ((thread->state == osRtxThreadInactive) ||
       (thread->state == osRtxThreadTerminated)) {
+    EvrRtxThreadError(thread, osErrorResource);
     return osErrorResource;
   }
 
@@ -843,15 +880,19 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadGetPriority(thread, osPriorityError);
     return osPriorityError;
   }
 
   // Check object state
   if ((thread->state == osRtxThreadInactive) ||
       (thread->state == osRtxThreadTerminated)) {
+    EvrRtxThreadGetPriority(thread, osPriorityError);
     return osPriorityError;
   }
 
+  EvrRtxThreadGetPriority(thread, (osPriority_t)thread->priority);
+
   return ((osPriority_t)thread->priority);
 }
 
@@ -883,6 +924,7 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
@@ -891,6 +933,7 @@
     case osRtxThreadRunning:
       if ((osRtxKernelGetState() != osRtxKernelRunning) ||
           (osRtxInfo.thread.ready.thread_list == NULL)) {
+        EvrRtxThreadError(thread, osErrorResource);
         return osErrorResource;
       }
       osRtxThreadSwitch(osRtxThreadListGet(&osRtxInfo.thread.ready));
@@ -905,6 +948,7 @@
     case osRtxThreadInactive:
     case osRtxThreadTerminated:
     default:
+      EvrRtxThreadError(thread, osErrorResource);
       return osErrorResource;
   }
 
@@ -914,6 +958,8 @@
   thread->thread_next = NULL;
   osRtxThreadDelayInsert(thread, osWaitForever);
 
+  EvrRtxThreadSuspended(thread);
+
   return osOK;
 }
 
@@ -924,11 +970,13 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if ((thread->state & osRtxThreadStateMask) != osRtxThreadBlocked) {
+    EvrRtxThreadError(thread, osErrorResource);
     return osErrorResource;
   }
 
@@ -937,6 +985,8 @@
   osRtxThreadDelayRemove(thread);
   osRtxThreadDispatch(thread);
 
+  EvrRtxThreadResumed(thread);
+
   return osOK;
 }
 
@@ -980,16 +1030,19 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object attributes
   if ((thread->attr & osThreadJoinable) == 0U) {
+    EvrRtxThreadError(thread, osRtxErrorThreadNotJoinable);
     return osErrorResource;
   }
 
   // Check object state
   if (thread->state == osRtxThreadInactive) {
+    EvrRtxThreadError(thread, osErrorResource);
     return osErrorResource;
   }
 
@@ -1000,6 +1053,8 @@
     thread->attr &= ~osThreadJoinable;
   }
 
+  EvrRtxThreadDetached(thread);
+
   return osOK;
 }
 
@@ -1010,17 +1065,20 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object attributes
   if ((thread->attr & osThreadJoinable) == 0U) {
+    EvrRtxThreadError(thread, osRtxErrorThreadNotJoinable);
     return osErrorResource;
   }
 
   // Check object state
   if ((thread->state == osRtxThreadInactive) ||
       (thread->state == osRtxThreadRunning)) {
+    EvrRtxThreadError(thread, osErrorResource);
     return osErrorResource;
   }
 
@@ -1032,9 +1090,12 @@
     if (osRtxThreadWaitEnter(osRtxThreadWaitingJoin, osWaitForever)) {
       thread->thread_join = osRtxThreadGetRunning();
     }
+    EvrRtxThreadJoinPending(thread);
     return osErrorResource;
   }
 
+  EvrRtxThreadJoined(thread);
+
   return osOK;
 }
 
@@ -1054,6 +1115,7 @@
   // Wakeup Thread waiting to Join
   if (thread->thread_join != NULL) {
     osRtxThreadWaitExit(thread->thread_join, (uint32_t)osOK, false);
+    EvrRtxThreadJoined(thread->thread_join);
   }
 
   // Switch to next Ready Thread
@@ -1074,6 +1136,8 @@
     thread->thread_next = osRtxInfo.thread.terminate_list;
     osRtxInfo.thread.terminate_list = thread;
   }
+
+  EvrRtxThreadDestroyed(thread);
 }
 
 /// Terminate execution of a thread.
@@ -1083,6 +1147,7 @@
 
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
@@ -1100,6 +1165,7 @@
     case osRtxThreadInactive:
     case osRtxThreadTerminated:
     default:
+      EvrRtxThreadError(thread, osErrorResource);
       return osErrorResource;
   }
 
@@ -1109,12 +1175,14 @@
   // Wakeup Thread waiting to Join
   if (thread->thread_join != NULL) {
     osRtxThreadWaitExit(thread->thread_join, (uint32_t)osOK, false);
+    EvrRtxThreadJoined(thread->thread_join);
   }
 
   // Switch to next Ready Thread when terminating running Thread
   if (thread->state == osRtxThreadRunning) {
     if ((osRtxKernelGetState() != osRtxKernelRunning) ||
         (osRtxInfo.thread.ready.thread_list == NULL)) {
+      EvrRtxThreadError(thread, osErrorResource);
       return osErrorResource;
     }
     thread->sp = __get_PSP();
@@ -1134,6 +1202,8 @@
     osRtxInfo.thread.terminate_list = thread;
   }
 
+  EvrRtxThreadDestroyed(thread);
+
   return osOK;
 }
 
@@ -1158,6 +1228,8 @@
   for (thread = osRtxInfo.thread.wait_list;
        (thread != NULL); thread = thread->delay_next,  count++) {};
 
+  EvrRtxThreadGetCount(count);
+
   return count;
 }
 
@@ -1169,6 +1241,7 @@
 
   // Check parameters
   if ((thread_array == NULL) || (array_items == 0U)) {
+    EvrRtxThreadEnumerate(thread_array, array_items, 0U);
     return 0U;
   }
 
@@ -1194,6 +1267,8 @@
     *thread_array++ = thread;
   }
 
+  EvrRtxThreadEnumerate(thread_array, array_items, count);
+
   return count;
 }
 
@@ -1207,12 +1282,14 @@
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread) ||
       ((uint32_t)flags & ~((1U << osRtxThreadFlagsLimit) - 1U))) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if ((thread->state == osRtxThreadInactive) ||
       (thread->state == osRtxThreadTerminated)) {
+    EvrRtxThreadError(thread, osErrorResource);
     return osErrorResource;
   }
 
@@ -1229,9 +1306,12 @@
         thread_flags = thread_flags0;
       }
       osRtxThreadWaitExit(thread, (uint32_t)thread_flags0, true);
+      EvrRtxThreadFlagsWaitCompleted(thread->wait_flags, thread->flags_options, thread_flags0);
     }
   }
 
+  EvrRtxThreadFlagsSetDone(thread, thread_flags);
+
   return thread_flags;
 }
 
@@ -1243,23 +1323,28 @@
 
   thread = osRtxThreadGetRunning();
   if (thread == NULL) {
+    EvrRtxThreadError(NULL, osRtxErrorKernelNotRunning);
     return osError;
   }
 
   // Check parameters
   if ((uint32_t)flags & ~((1U << osRtxThreadFlagsLimit) - 1U)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if ((thread->state == osRtxThreadInactive) ||
       (thread->state == osRtxThreadTerminated)) {
+    EvrRtxThreadError(thread, osErrorResource);
     return osErrorResource;
   }
 
   // Clear Thread Flags
   thread_flags = ThreadFlagsClear(thread, flags);
 
+  EvrRtxThreadFlagsClearDone(thread_flags);
+
   return thread_flags;
 }
 
@@ -1270,15 +1355,19 @@
 
   thread = osRtxThreadGetRunning();
   if (thread == NULL) {
+    EvrRtxThreadFlagsGet(0);
     return 0;
   }
 
   // Check object state
   if ((thread->state == osRtxThreadInactive) ||
       (thread->state == osRtxThreadTerminated)) {
+    EvrRtxThreadFlagsGet(0);
     return 0;
   }
 
+  EvrRtxThreadFlagsGet(thread->thread_flags);
+
   return thread->thread_flags;
 }
 
@@ -1290,17 +1379,20 @@
 
   thread = osRtxThreadGetRunning();
   if (thread == NULL) {
+    EvrRtxThreadError(NULL, osRtxErrorKernelNotRunning);
     return osError;
   }
 
   // Check parameters
   if ((uint32_t)flags & ~((1U << osRtxThreadFlagsLimit) - 1U)) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check Thread Flags
   thread_flags = ThreadFlagsCheck(thread, flags, options);
   if (thread_flags > 0) {
+    EvrRtxThreadFlagsWaitCompleted(flags, options, thread_flags);
     return thread_flags;
   }
 
@@ -1311,9 +1403,12 @@
     thread->flags_options = (uint8_t)options;
     // Suspend current Thread
     osRtxThreadWaitEnter(osRtxThreadWaitingThreadFlags, timeout);
+    EvrRtxThreadFlagsWaitPending(flags, options, timeout);
     return osErrorTimeout;
   }
 
+  EvrRtxThreadFlagsWaitNotCompleted(flags, options);
+
   return osErrorResource;
 }
 
@@ -1330,12 +1425,14 @@
   // Check parameters
   if ((thread == NULL) || (thread->id != osRtxIdThread) ||
       ((uint32_t)flags & ~((1U << osRtxThreadFlagsLimit) - 1U))) {
+    EvrRtxThreadError(thread, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if ((thread->state == osRtxThreadInactive) ||
       (thread->state == osRtxThreadTerminated)) {
+    EvrRtxThreadError(thread, osErrorResource);
     return osErrorResource;
   }
 
@@ -1345,6 +1442,8 @@
   // Register post ISR processing
   osRtxPostProcess((os_object_t *)thread);
 
+  EvrRtxThreadFlagsSetDone(thread, thread_flags);
+
   return thread_flags;
 }
 
@@ -1353,7 +1452,9 @@
 
 /// Create a thread and add it to Active Threads.
 osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) {
+  EvrRtxThreadNew(func, argument, attr);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(NULL, osErrorISR);
     return NULL;
   }
   return __svcThreadNew(func, argument, attr);
@@ -1362,6 +1463,7 @@
 /// Get name of a thread.
 const char *osThreadGetName (osThreadId_t thread_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadGetName(thread_id, NULL);
     return NULL;
   }
   return __svcThreadGetName(thread_id);
@@ -1370,6 +1472,7 @@
 /// Return the thread ID of the current running thread.
 osThreadId_t osThreadGetId (void) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadGetId(NULL);
     return NULL;
   }
   return __svcThreadGetId();
@@ -1378,6 +1481,7 @@
 /// Get current thread state of a thread.
 osThreadState_t osThreadGetState (osThreadId_t thread_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadGetState(thread_id, osThreadError);
     return osThreadError;
   }
   return __svcThreadGetState(thread_id);
@@ -1386,6 +1490,7 @@
 /// Get stack size of a thread.
 uint32_t osThreadGetStackSize (osThreadId_t thread_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadGetStackSize(thread_id, 0U);
     return 0U;
   }
   return __svcThreadGetStackSize(thread_id);
@@ -1394,6 +1499,7 @@
 /// Get available stack space of a thread based on stack watermark recording during execution.
 uint32_t osThreadGetStackSpace (osThreadId_t thread_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadGetStackSpace(thread_id, 0U);
     return 0U;
   }
   return __svcThreadGetStackSpace(thread_id);
@@ -1401,7 +1507,9 @@
 
 /// Change priority of a thread.
 osStatus_t osThreadSetPriority (osThreadId_t thread_id, osPriority_t priority) {
+  EvrRtxThreadSetPriority(thread_id, priority);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(thread_id, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadSetPriority(thread_id, priority);
@@ -1410,6 +1518,7 @@
 /// Get current priority of a thread.
 osPriority_t osThreadGetPriority (osThreadId_t thread_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadGetPriority(thread_id, osPriorityError);
     return osPriorityError;
   }
   return __svcThreadGetPriority(thread_id);
@@ -1417,7 +1526,9 @@
 
 /// Pass control to next thread that is in state READY.
 osStatus_t osThreadYield (void) {
+  EvrRtxThreadYield();
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(NULL, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadYield();
@@ -1425,7 +1536,9 @@
 
 /// Suspend execution of a thread.
 osStatus_t osThreadSuspend (osThreadId_t thread_id) {
+  EvrRtxThreadSuspend(thread_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(thread_id, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadSuspend(thread_id);
@@ -1433,7 +1546,9 @@
 
 /// Resume execution of a thread.
 osStatus_t osThreadResume (osThreadId_t thread_id) {
+  EvrRtxThreadResume(thread_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(thread_id, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadResume(thread_id);
@@ -1441,7 +1556,9 @@
 
 /// Detach a thread (thread storage can be reclaimed when thread terminates).
 osStatus_t osThreadDetach (osThreadId_t thread_id) {
+  EvrRtxThreadDetach(thread_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(thread_id, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadDetach(thread_id);
@@ -1449,7 +1566,9 @@
 
 /// Wait for specified thread to terminate.
 osStatus_t osThreadJoin (osThreadId_t thread_id) {
+  EvrRtxThreadJoin(thread_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(thread_id, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadJoin(thread_id);
@@ -1457,13 +1576,17 @@
 
 /// Terminate execution of current running thread.
 __NO_RETURN void osThreadExit (void) {
+  EvrRtxThreadExit();
   __svcThreadExit();
+  EvrRtxThreadError(NULL, osError);
   for (;;);
 }
 
 /// Terminate execution of a thread.
 osStatus_t osThreadTerminate (osThreadId_t thread_id) {
+  EvrRtxThreadTerminate(thread_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(thread_id, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadTerminate(thread_id);
@@ -1472,7 +1595,8 @@
 /// Get number of active threads.
 uint32_t osThreadGetCount (void) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
-    return 0U;                                  // Not allowed in ISR
+    EvrRtxThreadGetCount(0U);
+    return 0U;
   }
   return __svcThreadGetCount();
 }
@@ -1480,13 +1604,15 @@
 /// Enumerate active threads.
 uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
-    return 0U;                                  // Not allowed in ISR
+    EvrRtxThreadEnumerate(thread_array, array_items, 0U);
+    return 0U;
   }
   return __svcThreadEnumerate(thread_array, array_items);
 }
 
 /// Set the specified Thread Flags of a thread.
 int32_t osThreadFlagsSet (osThreadId_t thread_id, int32_t flags) {
+  EvrRtxThreadFlagsSet(thread_id, flags);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
     return isrRtxThreadFlagsSet(thread_id, flags);
   } else {
@@ -1496,7 +1622,9 @@
 
 /// Clear the specified Thread Flags of current running thread.
 int32_t osThreadFlagsClear (int32_t flags) {
+  EvrRtxThreadFlagsClear(flags);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(NULL, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadFlagsClear(flags);
@@ -1505,14 +1633,17 @@
 /// Get the current Thread Flags of current running thread.
 int32_t osThreadFlagsGet (void) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadFlagsGet(0);
     return 0;
-  }                               
+  }
   return __svcThreadFlagsGet();
 }
 
 /// Wait for one or more Thread Flags of the current running thread to become signaled.
 int32_t osThreadFlagsWait (int32_t flags, uint32_t options, uint32_t timeout) {
+  EvrRtxThreadFlagsWait(flags, options, timeout);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxThreadError(NULL, osErrorISR);
     return osErrorISR;
   }
   return __svcThreadFlagsWait(flags, options, timeout);
diff --git a/CMSIS/RTOS2/RTX/Source/rtx_timer.c b/CMSIS/RTOS2/RTX/Source/rtx_timer.c
index 622b518..23552b2 100644
--- a/CMSIS/RTOS2/RTX/Source/rtx_timer.c
+++ b/CMSIS/RTOS2/RTX/Source/rtx_timer.c
@@ -118,6 +118,7 @@
   for (;;) {
     status = osMessageQueueGet(osRtxInfo.timer.mq, &finfo, NULL, osWaitForever);
     if (status == osOK) {
+      EvrRtxTimerCallback(*(osTimerFunc_t)finfo.fp, finfo.arg);
       (*(osTimerFunc_t)finfo.fp)(finfo.arg);
     }
   }
@@ -144,6 +145,7 @@
   if (osRtxInfo.timer.mq == NULL) {
     osRtxInfo.timer.mq = svcRtxMessageQueueNew(osRtxConfig.timer_mq_mcnt, sizeof(os_timer_finfo_t), osRtxConfig.timer_mq_attr);
     if (osRtxInfo.timer.mq == NULL) {
+      EvrRtxTimerError(NULL, osErrorResource);
       return NULL;
     }
   }
@@ -152,12 +154,14 @@
   if (osRtxInfo.timer.thread == NULL) {
     osRtxInfo.timer.thread = svcRtxThreadNew(osRtxTimerThread, NULL, osRtxConfig.timer_thread_attr);
     if (osRtxInfo.timer.thread == NULL) {
+      EvrRtxTimerError(NULL, osErrorResource);
       return NULL;
     }
   }
 
   // Check parameters
   if ((func == NULL) || ((type != osTimerOnce) && (type != osTimerPeriodic))) {
+    EvrRtxTimerError(NULL, osErrorParameter);
     return NULL;
   }
 
@@ -167,10 +171,12 @@
     timer = attr->cb_mem;
     if (timer != NULL) {
       if (((uint32_t)timer & 3U) || (attr->cb_size < sizeof(os_timer_t))) {
+        EvrRtxTimerError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     } else {
       if (attr->cb_size != 0U) {
+        EvrRtxTimerError(NULL, osRtxErrorInvalidControlBlock);
         return NULL;
       }
     }
@@ -187,6 +193,7 @@
       timer = osRtxMemoryAlloc(osRtxInfo.mem.common, sizeof(os_timer_t), 1U);
     }
     if (timer == NULL) {
+      EvrRtxTimerError(NULL, osErrorNoMemory);
       return NULL;
     }
     flags = osRtxFlagSystemObject;
@@ -207,6 +214,8 @@
   timer->finfo.fp  = (void *)func;
   timer->finfo.arg = argument;
 
+  EvrRtxTimerCreated(timer);
+
   return timer;
 }
 
@@ -217,14 +226,18 @@
 
   // Check parameters
   if ((timer == NULL) || (timer->id != osRtxIdTimer)) {
+    EvrRtxTimerGetName(timer, NULL);
     return NULL;
   }
 
   // Check object state
   if (timer->state == osRtxObjectInactive) {
+    EvrRtxTimerGetName(timer, NULL);
     return NULL;
   }
 
+  EvrRtxTimerGetName(timer, timer->name);
+
   return timer->name;
 }
 
@@ -235,6 +248,7 @@
 
   // Check parameters
   if ((timer == NULL) || (timer->id != osRtxIdTimer) || (ticks == 0U)) {
+    EvrRtxTimerError(timer, osErrorParameter);
     return osErrorParameter;
   }
 
@@ -249,11 +263,14 @@
       break;
     case osRtxTimerInactive:
     default:
+      EvrRtxTimerError(timer, osErrorResource);
       return osErrorResource;
   }
 
   TimerInsert(timer, ticks);
 
+  EvrRtxTimerStarted(timer);
+
   return osOK;
 }
 
@@ -264,11 +281,13 @@
 
   // Check parameters
   if ((timer == NULL) || (timer->id != osRtxIdTimer)) {
+    EvrRtxTimerError(timer, osErrorParameter);
     return osErrorParameter;
   }
 
   // Check object state
   if (timer->state != osRtxTimerRunning) {
+    EvrRtxTimerError(timer, osErrorResource);
     return osErrorResource;
   }
 
@@ -276,6 +295,8 @@
 
   TimerRemove(timer);
 
+  EvrRtxTimerStopped(timer);
+
   return osOK;
 }
 
@@ -286,14 +307,17 @@
 
   // Check parameters
   if ((timer == NULL) || (timer->id != osRtxIdTimer)) {
+    EvrRtxTimerIsRunning(timer, 0U);
     return 0U;
   }
 
   // Check object state
   if (timer->state == osRtxTimerRunning) {
+    EvrRtxTimerIsRunning(timer, 1U);
     return 1U;
   }
 
+  EvrRtxTimerIsRunning(timer, 0U);
   return 0U;
 }
 
@@ -304,6 +328,7 @@
 
   // Check parameters
   if ((timer == NULL) || (timer->id != osRtxIdTimer)) {
+    EvrRtxTimerError(timer, osErrorParameter);
     return osErrorParameter;
   }
 
@@ -316,6 +341,7 @@
       break;
     case osRtxTimerInactive:
     default:
+      EvrRtxTimerError(timer, osErrorResource);
       return osErrorResource;
   }
 
@@ -331,6 +357,8 @@
     }
   }
 
+  EvrRtxTimerDestroyed(timer);
+
   return osOK;
 }
 
@@ -339,7 +367,9 @@
 
 /// Create and Initialize a timer.
 osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr) {
+  EvrRtxTimerNew(func, type, argument, attr);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxTimerError(NULL, osErrorISR);
     return NULL;
   }
   return __svcTimerNew(func, type, argument, attr);
@@ -348,6 +378,7 @@
 /// Get name of a timer.
 const char *osTimerGetName (osTimerId_t timer_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxTimerGetName(timer_id, NULL);
     return NULL;
   }
   return __svcTimerGetName(timer_id);
@@ -355,7 +386,9 @@
 
 /// Start or restart a timer.
 osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks) {
+  EvrRtxTimerStart(timer_id, ticks);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxTimerError(timer_id, osErrorISR);
     return osErrorISR;
   }
   return __svcTimerStart(timer_id, ticks);
@@ -363,7 +396,9 @@
 
 /// Stop a timer.
 osStatus_t osTimerStop (osTimerId_t timer_id) {
+  EvrRtxTimerStop(timer_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxTimerError(timer_id, osErrorISR);
     return osErrorISR;
   }
   return __svcTimerStop(timer_id);
@@ -372,6 +407,7 @@
 /// Check if a timer is running.
 uint32_t osTimerIsRunning (osTimerId_t timer_id) {
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxTimerIsRunning(timer_id, 0U);
     return 0U;
   }
   return __svcTimerIsRunning(timer_id);
@@ -379,7 +415,9 @@
 
 /// Delete a timer.
 osStatus_t osTimerDelete (osTimerId_t timer_id) {
+  EvrRtxTimerDelete(timer_id);
   if (IS_IRQ_MODE() || IS_IRQ_MASKED()) {
+    EvrRtxTimerError(timer_id, osErrorISR);
     return osErrorISR;
   }
   return __svcTimerDelete(timer_id);