Kaynağa Gözat

RTX5: enhanced events (Generic Wait and Thread Flags)

Robert Rostohar 7 yıl önce
ebeveyn
işleme
68e535db3f

+ 1 - 1
CMSIS/DoxyGen/RTOS2/src/cmsis_os2.txt

@@ -1017,7 +1017,7 @@ to the <b>RTX_Config.h</b> file:
 
 \b Generic \b wait \b events \n
 \c EVR_RTX_DELAY_ERROR_DISABLE, \c EVR_RTX_DELAY_DISABLE, \c EVR_RTX_DELAY_UNTIL_DISABLE,
-\c EVR_RTX_DELAY_STARTED_DISABLE, \c EVR_RTX_DELAY_COMPLETED_DISABLE 
+\c EVR_RTX_DELAY_STARTED_DISABLE, \c EVR_RTX_DELAY_UNTIL_STARTED_DISABLE, \c EVR_RTX_DELAY_COMPLETED_DISABLE 
 
 \b Thread \b flag \b events \n
 \c EVR_RTX_THREAD_FLAGS_ERROR_DISABLE, \c EVR_RTX_THREAD_FLAGS_SET_DISABLE, \c EVR_RTX_THREAD_FLAGS_SET_DONE_DISABLE,

+ 23 - 4
CMSIS/DoxyGen/RTOS2/src/rtx_evr.txt

@@ -671,13 +671,28 @@ The event \b DelayUntil is generated when the function \ref osDelayUntil is call
 /**
 \fn void EvrRtxDelayStarted (uint32_t ticks)
 \details
-The event \b DelayStarted is generated when \ref osDelay or \ref osDelayUntil delay starts.
+The event \b DelayStarted is generated when \ref osDelay delay starts.
+
+\b Value in the Event Recorder shows:
+  - \b ticks : \ref CMSIS_RTOS_TimeOutValue "time ticks" value. 
 */
 
 /**
-\fn void EvrRtxDelayCompleted (void)
+\fn void EvrRtxDelayUntilStarted (uint32_t ticks)
+\details
+The event \b DelayUntilStarted is generated when \ref osDelayUntil delay starts.
+
+\b Value in the Event Recorder shows:
+  - \b ticks : \ref CMSIS_RTOS_TimeOutValue "time ticks" value. 
+*/
+
+/**
+\fn void EvrRtxDelayCompleted (osThreadId_t thread_id)
 \details
 The event \b DelayCompleted is generated when \ref osDelay or \ref osDelayUntil delay expires.
+
+\b Value in the Event Recorder shows:
+  - \b thread_id : thread ID.
 */
 
 /**
@@ -793,13 +808,16 @@ The event \b ThreadFlagsWaitPending is generated when the function \ref osThread
 */
 
 /**
-\fn void EvrRtxThreadFlagsWaitTimeout (void)
+\fn void EvrRtxThreadFlagsWaitTimeout (osThreadId_t thread_id)
 \details
 The event \b ThreadFlagsWaitTimeout is generated when wait for thread flags to become signaled is aborted due to expired wait timeout.
+
+\b Value in the Event Recorder shows:
+  - \b thread_id : thread ID.
 */
 
 /**
-\fn void EvrRtxThreadFlagsWaitCompleted (uint32_t flags, uint32_t options, uint32_t thread_flags)
+\fn void EvrRtxThreadFlagsWaitCompleted (uint32_t flags, uint32_t options, uint32_t thread_flags, osThreadId_t thread_id)
 \details
 The event \b ThreadFlagsWaitCompleted is generated when waiting for thread flags ends because requested flags were signaled.
 
@@ -807,6 +825,7 @@ The event \b ThreadFlagsWaitCompleted is generated when waiting for thread flags
   - \b flags : flags thread was waiting for.
   - \b option : flags options (refer to \ref osThreadFlagsWait "thread flags options").
   - \b thread_flags : thread flags before clearing.
+  - \b thread_id : thread ID.
 */
 
 /**

+ 19 - 6
CMSIS/RTOS2/RTX/Include/rtx_evr.h

@@ -806,11 +806,12 @@ extern void EvrRtxThreadFlagsWaitPending (uint32_t flags, uint32_t options, uint
 
 /**
   \brief  Event on wait timeout for thread flags (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
 */
 #if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THFLAGS != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_TIMEOUT_DISABLE))
-extern void EvrRtxThreadFlagsWaitTimeout (void);
+extern void EvrRtxThreadFlagsWaitTimeout (osThreadId_t thread_id);
 #else
-#define EvrRtxThreadFlagsWaitTimeout()
+#define EvrRtxThreadFlagsWaitTimeout(thread_id)
 #endif
 
 /**
@@ -818,11 +819,12 @@ extern void EvrRtxThreadFlagsWaitTimeout (void);
   \param[in]  flags         flags to wait for.
   \param[in]  options       flags options (osFlagsXxxx).
   \param[in]  thread_flags  thread flags before clearing.
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
 */
 #if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THFLAGS != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_COMPLETED_DISABLE))
-extern void EvrRtxThreadFlagsWaitCompleted (uint32_t flags, uint32_t options, uint32_t thread_flags);
+extern void EvrRtxThreadFlagsWaitCompleted (uint32_t flags, uint32_t options, uint32_t thread_flags, osThreadId_t thread_id);
 #else
-#define EvrRtxThreadFlagsWaitCompleted(flags, options, thread_flags)
+#define EvrRtxThreadFlagsWaitCompleted(flags, options, thread_flags, thread_id)
 #endif
 
 /**
@@ -879,13 +881,24 @@ extern void EvrRtxDelayStarted (uint32_t ticks);
 #define EvrRtxDelayStarted(ticks)
 #endif
 
+/**
+  \brief  Event on delay until specified time started (Op)
+  \param[in]  ticks         \ref CMSIS_RTOS_TimeOutValue "time ticks" value.
+*/
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_WAIT != 0) && !defined(EVR_RTX_DELAY_UNTIL_STARTED_DISABLE))
+extern void EvrRtxDelayUntilStarted (uint32_t ticks);
+#else
+#define EvrRtxDelayUntilStarted(ticks)
+#endif
+
 /**
   \brief  Event on delay completed (Op)
+  \param[in]  thread_id     thread ID obtained by \ref osThreadNew or \ref osThreadGetId.
 */
 #if (!defined(EVR_RTX_DISABLE) && (OS_EVR_WAIT != 0) && !defined(EVR_RTX_DELAY_COMPLETED_DISABLE))
-extern void EvrRtxDelayCompleted (void);
+extern void EvrRtxDelayCompleted (osThreadId_t thread_id);
 #else
-#define EvrRtxDelayCompleted()
+#define EvrRtxDelayCompleted(thread_id)
 #endif
 
 

+ 8 - 7
CMSIS/RTOS2/RTX/RTX5.scvd

@@ -1587,15 +1587,16 @@
     <event id="0xF400 + 0x05" level="API"    property="ThreadFlagsGet"              value="thread_flags=%x[val1]" info="osThreadFlagsGet function was called and thread flags were retrieved."/>
     <event id="0xF400 + 0x06" level="API"    property="ThreadFlagsWait"             value="flags=%x[val1], options=%x[val2], timeout=%d[val3]" info="osThreadFlagsWait function was called."/>
     <event id="0xF400 + 0x07" level="Op"     property="ThreadFlagsWaitPending"      value="flags=%x[val1], options=%x[val2], timeout=%d[val3]" info="Waiting for thread flags to become signaled."/>
-    <event id="0xF400 + 0x08" level="Op"     property="ThreadFlagsWaitTimeout"      value="" info="Waiting for thread flags timed out."/>
-    <event id="0xF400 + 0x09" level="Op"     property="ThreadFlagsWaitCompleted"    value="flags=%x[val1], options=%x[val2], thread_flags=%x[val3]" info="Wait for thread flags completed."/>
+    <event id="0xF400 + 0x08" level="Op"     property="ThreadFlagsWaitTimeout"      value="thread_id=%x[val1]" info="Waiting for thread flags timed out."/>
+    <event id="0xF400 + 0x09" level="Op"     property="ThreadFlagsWaitCompleted"    value="flags=%x[val1], options=%x[val2], thread_flags=%x[val3], thread_id=%x[val4]" info="Wait for thread flags completed."/>
     <event id="0xF400 + 0x0A" level="Op"     property="ThreadFlagsWaitNotCompleted" value="flags=%x[val1], options=%x[val2]" info="Wait for thread flags not completed."/>
 
-    <event id="0xF300 + 0x00" level="Error"  property="DelayError"     value="status=%E[val1, rtx_t:status]" info="osDelay/osDelayUntil error occurred."/>
-    <event id="0xF300 + 0x01" level="API"    property="Delay"          value="ticks=%d[val1]" info="osDelay function was called."/>
-    <event id="0xF300 + 0x02" level="API"    property="DelayUntil"     value="ticks=%d[val1]" info="osDelayUntil function was called."/>
-    <event id="0xF300 + 0x03" level="Op"     property="DelayStarted"   value="ticks=%d[val1]" info="osDelay/osDelayUntil started."/>
-    <event id="0xF300 + 0x04" level="Op"     property="DelayCompleted" value=""               info="osDelay/osDelayUntil completed."/>
+    <event id="0xF300 + 0x00" level="Error"  property="DelayError"         value="status=%E[val1, rtx_t:status]" info="osDelay/osDelayUntil error occurred."/>
+    <event id="0xF300 + 0x01" level="API"    property="Delay"              value="ticks=%d[val1]" info="osDelay function was called."/>
+    <event id="0xF300 + 0x02" level="API"    property="DelayUntil"         value="ticks=%d[val1]" info="osDelayUntil function was called."/>
+    <event id="0xF300 + 0x03" level="Op"     property="DelayStarted"       value="ticks=%d[val1]" info="osDelay started."/>
+    <event id="0xF300 + 0x04" level="Op"     property="DelayUntilStarted"  value="ticks=%d[val1]" info="osDelayUntil started."/>
+    <event id="0xF300 + 0x05" level="Op"     property="DelayCompleted"     value="thread_id=%x[val1]" info="osDelay/osDelayUntil completed."/>
 
     <event id="0xF600 + 0x00" level="Error"  property="TimerError"     value="timer_id=%x[val1], status=%E[val2, rtx_t:status]" info="Timer error occurred."/>
     <event id="0xF600 + 0x01" level="Op"     property="TimerCallback"  value="func=%S[val1], argument=%x[val2]" info="Timer callback function was called."/>

+ 3 - 3
CMSIS/RTOS2/RTX/Source/rtx_delay.c

@@ -36,7 +36,7 @@ static osStatus_t svcRtxDelay (uint32_t ticks) {
     if (osRtxThreadWaitEnter(osRtxThreadWaitingDelay, ticks)) {
       EvrRtxDelayStarted(ticks);
     } else {
-      EvrRtxDelayCompleted();
+      EvrRtxDelayCompleted(osRtxThreadGetRunning());
     }
   }
 
@@ -55,9 +55,9 @@ static osStatus_t svcRtxDelayUntil (uint32_t ticks) {
   }
 
   if (osRtxThreadWaitEnter(osRtxThreadWaitingDelay, ticks)) {
-    EvrRtxDelayStarted(ticks);
+    EvrRtxDelayUntilStarted(ticks);
   } else {
-    EvrRtxDelayCompleted();
+    EvrRtxDelayCompleted(osRtxThreadGetRunning());
   }
 
   return osOK;

+ 23 - 7
CMSIS/RTOS2/RTX/Source/rtx_evr.c

@@ -115,7 +115,8 @@
 #define EvtRtxDelay                         EventID(EventLevelAPI,    EvtRtxWaitNo, 0x01U)
 #define EvtRtxDelayUntil                    EventID(EventLevelAPI,    EvtRtxWaitNo, 0x02U)
 #define EvtRtxDelayStarted                  EventID(EventLevelOp,     EvtRtxWaitNo, 0x03U)
-#define EvtRtxDelayCompleted                EventID(EventLevelOp,     EvtRtxWaitNo, 0x04U)
+#define EvtRtxDelayUntilStarted             EventID(EventLevelOp,     EvtRtxWaitNo, 0x04U)
+#define EvtRtxDelayCompleted                EventID(EventLevelOp,     EvtRtxWaitNo, 0x05U)
 
 /// Event IDs for "RTX Timer"
 #define EvtRtxTimerError                    EventID(EventLevelError,  EvtRtxTimerNo, 0x00U)
@@ -942,21 +943,24 @@ __WEAK void EvrRtxThreadFlagsWaitPending (uint32_t flags, uint32_t options, uint
 #endif
 
 #if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THFLAGS != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_TIMEOUT_DISABLE))
-__WEAK void EvrRtxThreadFlagsWaitTimeout (void) {
+__WEAK void EvrRtxThreadFlagsWaitTimeout (osThreadId_t thread_id) {
 #if defined(RTE_Compiler_EventRecorder)
-  (void)EventRecord2(EvtRtxThreadFlagsWaitTimeout, 0U, 0U);
+  (void)EventRecord2(EvtRtxThreadFlagsWaitTimeout, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
 #endif
 }
 #endif
 
 #if (!defined(EVR_RTX_DISABLE) && (OS_EVR_THFLAGS != 0) && !defined(EVR_RTX_THREAD_FLAGS_WAIT_COMPLETED_DISABLE))
-__WEAK void EvrRtxThreadFlagsWaitCompleted (uint32_t flags, uint32_t options, uint32_t thread_flags) {
+__WEAK void EvrRtxThreadFlagsWaitCompleted (uint32_t flags, uint32_t options, uint32_t thread_flags, osThreadId_t thread_id) {
 #if defined(RTE_Compiler_EventRecorder)
-  (void)EventRecord4(EvtRtxThreadFlagsWaitCompleted, flags, options, thread_flags, 0U);
+  (void)EventRecord4(EvtRtxThreadFlagsWaitCompleted, flags, options, thread_flags, (uint32_t)thread_id);
 #else
   (void)flags;
   (void)options;
   (void)thread_flags;
+  (void)thread_id;
 #endif
 }
 #endif
@@ -1016,10 +1020,22 @@ __WEAK void EvrRtxDelayStarted (uint32_t ticks) {
 }
 #endif
 
+#if (!defined(EVR_RTX_DISABLE) && (OS_EVR_WAIT != 0) && !defined(EVR_RTX_DELAY_UNTIL_STARTED_DISABLE))
+__WEAK void EvrRtxDelayUntilStarted (uint32_t ticks) {
+#if defined(RTE_Compiler_EventRecorder)
+  (void)EventRecord2(EvtRtxDelayUntilStarted, ticks, 0U);
+#else
+  (void)ticks;
+#endif
+}
+#endif
+
 #if (!defined(EVR_RTX_DISABLE) && (OS_EVR_WAIT != 0) && !defined(EVR_RTX_DELAY_COMPLETED_DISABLE))
-__WEAK void EvrRtxDelayCompleted (void) {
+__WEAK void EvrRtxDelayCompleted (osThreadId_t thread_id) {
 #if defined(RTE_Compiler_EventRecorder)
-  (void)EventRecord2(EvtRtxDelayCompleted, 0U, 0U);
+  (void)EventRecord2(EvtRtxDelayCompleted, (uint32_t)thread_id, 0U);
+#else
+  (void)thread_id;
 #endif
 }
 #endif

+ 6 - 6
CMSIS/RTOS2/RTX/Source/rtx_thread.c

@@ -351,10 +351,10 @@ void osRtxThreadDelayTick (void) {
     do {
       switch (thread->state) {
         case osRtxThreadWaitingDelay:
-          EvrRtxDelayCompleted();
+          EvrRtxDelayCompleted(thread);
           break;
         case osRtxThreadWaitingThreadFlags:
-          EvrRtxThreadFlagsWaitTimeout();
+          EvrRtxThreadFlagsWaitTimeout(thread);
           break;
         case osRtxThreadWaitingEventFlags:
           EvrRtxEventFlagsWaitTimeout((osEventFlagsId_t)osRtxThreadListRoot(thread));
@@ -574,7 +574,7 @@ static void osRtxThreadPostProcess (os_thread_t *thread) {
     thread_flags = ThreadFlagsCheck(thread, thread->wait_flags, thread->flags_options);
     if (thread_flags != 0U) {
       osRtxThreadWaitExit(thread, thread_flags, FALSE);
-      EvrRtxThreadFlagsWaitCompleted(thread->wait_flags, thread->flags_options, thread_flags);
+      EvrRtxThreadFlagsWaitCompleted(thread->wait_flags, thread->flags_options, thread_flags, thread);
     }
   }
 }
@@ -1453,7 +1453,7 @@ static uint32_t svcRtxThreadFlagsSet (osThreadId_t thread_id, uint32_t flags) {
         thread_flags = thread_flags0;
       }
       osRtxThreadWaitExit(thread, thread_flags0, TRUE);
-      EvrRtxThreadFlagsWaitCompleted(thread->wait_flags, thread->flags_options, thread_flags0);
+      EvrRtxThreadFlagsWaitCompleted(thread->wait_flags, thread->flags_options, thread_flags0, thread);
     }
   }
 
@@ -1533,7 +1533,7 @@ static uint32_t svcRtxThreadFlagsWait (uint32_t flags, uint32_t options, uint32_
   // Check Thread Flags
   thread_flags = ThreadFlagsCheck(thread, flags, options);
   if (thread_flags != 0U) {
-    EvrRtxThreadFlagsWaitCompleted(flags, options, thread_flags);
+    EvrRtxThreadFlagsWaitCompleted(flags, options, thread_flags, thread);
   } else {
     // Check if timeout is specified
     if (timeout != 0U) {
@@ -1543,7 +1543,7 @@ static uint32_t svcRtxThreadFlagsWait (uint32_t flags, uint32_t options, uint32_
       thread->flags_options = (uint8_t)options;
       // Suspend current Thread
       if (!osRtxThreadWaitEnter(osRtxThreadWaitingThreadFlags, timeout)) {
-        EvrRtxThreadFlagsWaitTimeout();
+        EvrRtxThreadFlagsWaitTimeout(thread);
       }
       thread_flags = (uint32_t)osErrorTimeout;
     } else {