Просмотр исходного кода

RTX5: updated implementation - removed osThreadAbortWait (osThreadSuspend used instead) and joined states osThreadWaiting and osThreadSuspended into osThreadBlocked

Robert Rostohar 9 лет назад
Родитель
Сommit
bf3df3791b

+ 10 - 13
CMSIS/RTOS2/RTX/Include/rtx_os.h

@@ -81,19 +81,18 @@ extern "C"
 #define os_ThreadInactive           ((uint8_t)osThreadInactive)
 #define os_ThreadReady              ((uint8_t)osThreadReady)
 #define os_ThreadRunning            ((uint8_t)osThreadRunning)
-#define os_ThreadWaiting            ((uint8_t)osThreadWaiting)
-#define os_ThreadSuspended          ((uint8_t)osThreadSuspended)
+#define os_ThreadBlocked            ((uint8_t)osThreadBlocked)
 #define os_ThreadTerminated         ((uint8_t)osThreadTerminated)
 
-#define os_ThreadWaitingDelay       (os_ThreadWaiting | 0x10U)
-#define os_ThreadWaitingJoin        (os_ThreadWaiting | 0x20U)
-#define os_ThreadWaitingThreadFlags (os_ThreadWaiting | 0x30U) 
-#define os_ThreadWaitingEventFlags  (os_ThreadWaiting | 0x40U) 
-#define os_ThreadWaitingMutex       (os_ThreadWaiting | 0x50U)
-#define os_ThreadWaitingSemaphore   (os_ThreadWaiting | 0x60U)
-#define os_ThreadWaitingMemoryPool  (os_ThreadWaiting | 0x70U)
-#define os_ThreadWaitingMessageGet  (os_ThreadWaiting | 0x80U)
-#define os_ThreadWaitingMessagePut  (os_ThreadWaiting | 0x90U)
+#define os_ThreadWaitingDelay       (os_ThreadBlocked | 0x10U)
+#define os_ThreadWaitingJoin        (os_ThreadBlocked | 0x20U)
+#define os_ThreadWaitingThreadFlags (os_ThreadBlocked | 0x30U) 
+#define os_ThreadWaitingEventFlags  (os_ThreadBlocked | 0x40U) 
+#define os_ThreadWaitingMutex       (os_ThreadBlocked | 0x50U)
+#define os_ThreadWaitingSemaphore   (os_ThreadBlocked | 0x60U)
+#define os_ThreadWaitingMemoryPool  (os_ThreadBlocked | 0x70U)
+#define os_ThreadWaitingMessageGet  (os_ThreadBlocked | 0x80U)
+#define os_ThreadWaitingMessagePut  (os_ThreadBlocked | 0x90U)
 
 /// Thread Flags definitions
 #define os_ThreadFlagDefStack   0x10U   ///< Default Stack flag
@@ -297,7 +296,6 @@ typedef struct {
     os_thread_t                 *idle;  ///< Idle Thread
     os_thread_t           *delay_list;  ///< Delay List
     os_thread_t            *wait_list;  ///< Wait List (no Timeout)
-    os_thread_t         *suspend_list;  ///< Suspend Thread List
     os_thread_t       *terminate_list;  ///< Terminate Thread List
     struct {                            ///< Thread Round Robin Info
       os_thread_t             *thread;  ///< Round Robin Thread
@@ -340,7 +338,6 @@ typedef struct {
     os_mp_info_t         *memory_pool;  ///< Memory Pool Control Blocks
     os_mp_info_t       *message_queue;  ///< Message Queue Control Blocks
   } mpi;
-  uint32_t                    padding;
 } os_info_t;
 
 extern os_info_t os_Info;               ///< OS Runtime Information

+ 2 - 2
CMSIS/RTOS2/RTX/Include1/cmsis_os.h

@@ -17,7 +17,7 @@
  *
  * ----------------------------------------------------------------------
  *
- * $Date:        20. September 2016
+ * $Date:        12. October 2016
  * $Revision:    V2.0
  *
  * Project:      CMSIS-RTOS API
@@ -61,7 +61,7 @@
  *     - changed thread return value
  *     - replaced osThreadCreate with osThreadNew
  *     - added: osThreadState_t and osThreadGetState
- *     - added: osThreadAbortWait, osThreadSuspend, osThreadResume
+ *     - added: osThreadSuspend, osThreadResume
  *     - added: osThreadJoin, osThreadDetach, osThreadExit
  *     - added: Thread Flags (moved from Signals) 
  *    Signals:

+ 36 - 37
CMSIS/RTOS2/RTX/RTX5.scvd

@@ -267,7 +267,7 @@
     </typedef>
 
     <!-- OS Runtime Information structure -->
-    <typedef name="os_info_t" info="OS Runtime Information" size="172">
+    <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">
@@ -301,42 +301,41 @@
       <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_suspend_list"        type="*os_thread_t"  offset="60" info="Suspend thread list"/>
-      <member name="thread_terminate_list"      type="*os_thread_t"  offset="64" info="Terminate thread list"/>
-
-      <member name="thread_robin_thread"        type="*os_thread_t"  offset="68" info="Round Robin thread"/>
-      <member name="thread_robin_tick"          type="uint32_t"      offset="72" info="Round Robin time tick"/>
-      <member name="thread_timeout"             type="uint32_t"      offset="76" info="Round Robin timeout"/>
-
-      <member name="timer_list"                 type="*os_timer_t"   offset="80" info="Active timer list"/>
-      <member name="timer_thread"               type="*os_thread_t"  offset="84" info="Timer thread"/>
-      <member name="timer_mq"                   type="*os_message_queue_t" offset="88" info="Timer message queue"/>
-
-      <member name="isr_queue_max"              type="uint16_t"      offset="92" info="Maximum items"/>
-      <member name="isr_queue_cnt"              type="uint16_t"      offset="94" info="Item count"/>
-      <member name="isr_queue_in"               type="uint16_t"      offset="96" info="Incoming item index"/>
-      <member name="isr_queue_out"              type="uint16_t"      offset="98" info="Outgoing item index"/>
-      <member name="isr_queue_data"             type="uint32_t"      offset="100" info="Queue data (value is void **)"/>
-
-      <member name="post_process_thread"        type="uint32_t"      offset="104" info="Thread post processing function (value is func *)"/>
-      <member name="post_process_event_flags"   type="uint32_t"      offset="108" info="Event flags post processing function (value is func *)"/>
-      <member name="post_process_semaphore"     type="uint32_t"      offset="112" info="Semaphore post processing function (value is func *)"/>
-      <member name="post_process_memory_pool"   type="uint32_t"      offset="116" info="Memory pool post processing function (value is func *)"/>
-      <member name="post_process_message_queue" type="uint32_t"      offset="120" info="Message queue post processing function (value is func *)"/>
-
-      <member name="mem_stack"                  type="uint32_t"      offset="124" info="Stack memory (value is void *)"/>
-      <member name="mem_mp_data"                type="uint32_t"      offset="128" info="Memory pool data memory (value is void *)"/>
-      <member name="mem_mq_data"                type="uint32_t"      offset="132" info="Message queue Data memory (value is void *)"/>
-      <member name="mem_common"                 type="uint32_t"      offset="136" info="Common memory address (value is void *)"/>
-
-      <member name="mpi_stack"                  type="*os_mp_info_t" offset="140" info="Stack for threads"/>
-      <member name="mpi_thread"                 type="*os_mp_info_t" offset="144" info="Thread control blocks"/>
-      <member name="mpi_timer"                  type="*os_mp_info_t" offset="148" info="Timer control blocks"/>
-      <member name="mpi_event_flags"            type="*os_mp_info_t" offset="152" info="Event flags control blocks"/>
-      <member name="mpi_mutex"                  type="*os_mp_info_t" offset="156" info="Mutex control blocks"/>
-      <member name="mpi_semaphore"              type="*os_mp_info_t" offset="160" info="Semaphore control blocks"/>
-      <member name="mpi_memory_pool"            type="*os_mp_info_t" offset="164" info="Memory pool control blocks"/>
-      <member name="mpi_message_queue"          type="*os_mp_info_t" offset="168" info="Message queue control blocks"/>
+      <member name="thread_terminate_list"      type="*os_thread_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="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="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="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"/>
     </typedef>
 
     <!-- OS Configuration structure -->

+ 0 - 1
CMSIS/RTOS2/RTX/Source/rtx_lib.h

@@ -116,7 +116,6 @@ extern osThreadState_t  os_svcThreadGetState     (osThreadId_t thread_id);
 extern osStatus_t       os_svcThreadSetPriority  (osThreadId_t thread_id, osPriority_t priority);
 extern osPriority_t     os_svcThreadGetPriority  (osThreadId_t thread_id);
 extern osStatus_t       os_svcThreadYield        (void);
-extern osStatus_t       os_svcThreadAbortWait    (osThreadId_t thread_id);
 extern osStatus_t       os_svcThreadSuspend      (osThreadId_t thread_id);
 extern osStatus_t       os_svcThreadResume       (osThreadId_t thread_id);
 extern osStatus_t       os_svcThreadDetach       (osThreadId_t thread_id);

+ 27 - 60
CMSIS/RTOS2/RTX/Source/rtx_thread.c

@@ -236,14 +236,24 @@ void os_ThreadDelayInsert (os_thread_t *thread, uint32_t millisec) {
   os_thread_t *prev, *next;
 
   if (millisec == osWaitForever) {
+    prev = NULL;
+    next = os_Info.thread.wait_list;
+    while (next != NULL)  {
+      prev = next;
+      next = next->delay_next;
+    }
     thread->delay = millisec;
-    thread->delay_prev = NULL;
-    thread->delay_next = os_Info.thread.wait_list;
-    os_Info.thread.wait_list = thread;
-    return;
-  }
-
-  if (os_Info.thread.delay_list != NULL) {
+    thread->delay_prev = prev;
+    thread->delay_next = next;
+    if (prev != NULL) {
+      prev->delay_next = thread;
+    } else {
+      os_Info.thread.wait_list = thread;
+    }
+    if (next != NULL) {
+      next->delay_prev = thread;
+    }
+  } else {
     prev = NULL;
     next = os_Info.thread.delay_list;
     while ((next != NULL) && (next->delay <= millisec)) {
@@ -263,11 +273,6 @@ void os_ThreadDelayInsert (os_thread_t *thread, uint32_t millisec) {
       next->delay -= millisec;
       next->delay_prev = thread;
     }
-  } else {
-    os_Info.thread.delay_list = thread;
-    thread->delay = millisec;
-    thread->delay_prev = NULL;
-    thread->delay_next = NULL;
   }
 }
 
@@ -495,7 +500,6 @@ SVC0_1 (ThreadGetState,    osThreadState_t, osThreadId_t)
 SVC0_2 (ThreadSetPriority, osStatus_t,      osThreadId_t, osPriority_t)
 SVC0_1 (ThreadGetPriority, osPriority_t,    osThreadId_t)
 SVC0_0 (ThreadYield,       osStatus_t)
-SVC0_1 (ThreadAbortWait,   osStatus_t,      osThreadId_t)
 SVC0_1 (ThreadSuspend,     osStatus_t,      osThreadId_t)
 SVC0_1 (ThreadResume,      osStatus_t,      osThreadId_t)
 SVC0_1 (ThreadDetach,      osStatus_t,      osThreadId_t)
@@ -788,30 +792,6 @@ osStatus_t os_svcThreadYield (void) {
   return osOK;
 }
 
-/// Abort waiting operation of a thread.
-/// \note API identical to osThreadAbortWait
-osStatus_t os_svcThreadAbortWait (osThreadId_t thread_id) {
-  os_thread_t *thread = (os_thread_t *)thread_id;
-
-  // Check parameters
-  if ((thread == NULL) ||
-      (thread->id != os_IdThread)) {
-    return osErrorParameter;
-  }
-
-  // Check object state
-  if ((thread->state & os_ThreadStateMask) != os_ThreadWaiting) {
-    return osErrorResource;
-  }
-
-  // Wakeup Thread
-  os_ThreadListRemove(thread);
-  os_ThreadDelayRemove(thread);
-  os_ThreadDispatch(thread);
-
-  return osOK;
-}
-
 /// Suspend execution of a thread.
 /// \note API identical to osThreadSuspend
 osStatus_t os_svcThreadSuspend (osThreadId_t thread_id) {
@@ -835,22 +815,21 @@ osStatus_t os_svcThreadSuspend (osThreadId_t thread_id) {
     case os_ThreadReady:
       os_ThreadListRemove(thread);
       break;
-    case os_ThreadWaiting:
+    case os_ThreadBlocked:
       os_ThreadListRemove(thread);
       os_ThreadDelayRemove(thread);
       break;
-    case os_ThreadSuspended:
     case os_ThreadInactive:
     case os_ThreadTerminated:
     default:
       return osErrorResource;
   }
 
-  // Update Thread State and put it into Suspend Thread list
-  thread->state = os_ThreadSuspended;
+  // Update Thread State and put it into Delay list
+  thread->state = os_ThreadBlocked;
   thread->thread_prev = NULL;
-  thread->thread_next = os_Info.thread.suspend_list;
-  os_Info.thread.suspend_list = thread;
+  thread->thread_next = NULL;
+  os_ThreadDelayInsert(thread, osWaitForever);
 
   return osOK;
 }
@@ -867,14 +846,13 @@ osStatus_t os_svcThreadResume (osThreadId_t thread_id) {
   }
 
   // Check object state
-  if (thread->state != os_ThreadSuspended) {
+  if ((thread->state & os_ThreadStateMask) != os_ThreadBlocked) {
     return osErrorResource;
   }
 
-  // Remove Thread from Suspend Thread List
-  os_ThreadListUnlink(&os_Info.thread.suspend_list, thread);
-
-  // Dispatch Thread
+  // Wakeup Thread
+  os_ThreadListRemove(thread);
+  os_ThreadDelayRemove(thread);
   os_ThreadDispatch(thread);
 
   return osOK;
@@ -1047,13 +1025,10 @@ osStatus_t os_svcThreadTerminate (osThreadId_t thread_id) {
     case os_ThreadReady:
       os_ThreadListRemove(thread);
       break;
-    case os_ThreadWaiting:
+    case os_ThreadBlocked:
       os_ThreadListRemove(thread);
       os_ThreadDelayRemove(thread);
       break;
-    case os_ThreadSuspended:
-      os_ThreadListUnlink(&os_Info.thread.suspend_list, thread);
-      break;
     case os_ThreadInactive:
     case os_ThreadTerminated:
     default:
@@ -1304,14 +1279,6 @@ osStatus_t osThreadYield (void) {
   return __svcThreadYield();
 }
 
-/// Abort waiting operation of a thread.
-osStatus_t osThreadAbortWait (osThreadId_t thread_id) {
-  if (__get_IPSR() != 0U) {
-    return osErrorISR;                          // Not allowed in ISR
-  }
-  return __svcThreadAbortWait(thread_id);
-}
-
 /// Suspend execution of a thread.
 osStatus_t osThreadSuspend (osThreadId_t thread_id) {
   if (__get_IPSR() != 0U) {