浏览代码

将yield状态置于tcb的stat位域中

shaojinchun 5 年之前
父节点
当前提交
e03ac83ad3
共有 4 个文件被更改,包括 11 次插入10 次删除
  1. 4 2
      include/rtdef.h
  2. 1 1
      src/clock.c
  3. 6 6
      src/scheduler.c
  4. 0 1
      src/thread.c

+ 4 - 2
include/rtdef.h

@@ -491,7 +491,10 @@ typedef siginfo_t rt_siginfo_t;
 #define RT_THREAD_RUNNING               0x03                /**< Running status */
 #define RT_THREAD_BLOCK                 RT_THREAD_SUSPEND   /**< Blocked status */
 #define RT_THREAD_CLOSE                 0x04                /**< Closed status */
-#define RT_THREAD_STAT_MASK             0x0f
+#define RT_THREAD_STAT_MASK             0x07
+
+#define RT_THREAD_STAT_YIELD            0x08                /**< indicate whether remaining_tick has been reloaded since last schedule */
+#define RT_THREAD_STAT_YIELD_MASK       RT_THREAD_STAT_YIELD
 
 #define RT_THREAD_STAT_SIGNAL           0x10                /**< task hold signals */
 #define RT_THREAD_STAT_SIGNAL_READY     (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY)
@@ -608,7 +611,6 @@ struct rt_thread
 
     rt_ubase_t  init_tick;                              /**< thread's initialized tick */
     rt_ubase_t  remaining_tick;                         /**< remaining tick */
-    rt_ubase_t  can_yield;                              /**< indicate whether remaining_tick has been reloaded since last schedule */
 
     struct rt_timer thread_timer;                       /**< built-in thread timer */
 

+ 1 - 1
src/clock.c

@@ -89,7 +89,7 @@ void rt_tick_increase(void)
         /* change to initialized tick */
         thread->remaining_tick = thread->init_tick;
 
-        thread->can_yield = RT_TRUE;
+        thread->stat |= RT_THREAD_STAT_YIELD;
 
         /* yield */
         rt_thread_yield();

+ 6 - 6
src/scheduler.c

@@ -344,13 +344,13 @@ void rt_schedule(void)
                 {
                     to_thread = current_thread;
                 }
-                else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == RT_FALSE)
+                else if (current_thread->current_priority == highest_ready_priority && (current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
                 {
                     to_thread = current_thread;
                 }
                 else
                 {
-                    current_thread->can_yield = RT_FALSE;
+                    current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
                     rt_schedule_insert_thread(current_thread);
                 }
             }
@@ -440,13 +440,13 @@ void rt_schedule(void)
                 {
                     to_thread = rt_current_thread;
                 }
-                else if (rt_current_thread->current_priority == highest_ready_priority && rt_current_thread->can_yield == RT_FALSE)
+                else if (rt_current_thread->current_priority == highest_ready_priority && (rt_current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
                 {
                     to_thread = rt_current_thread;
                 }
                 else
                 {
-                    rt_current_thread->can_yield = RT_FALSE;
+                    rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
                     need_insert_from_thread = 1;
                 }
             }
@@ -588,13 +588,13 @@ void rt_scheduler_do_irq_switch(void *context)
                 {
                     to_thread = current_thread;
                 }
-                else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == RT_FALSE)
+                else if (current_thread->current_priority == highest_ready_priority && (current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
                 {
                     to_thread = current_thread;
                 }
                 else
                 {
-                    current_thread->can_yield = RT_FALSE;
+                    current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
                     rt_schedule_insert_thread(current_thread);
                 }
             }

+ 0 - 1
src/thread.c

@@ -159,7 +159,6 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
     /* tick init */
     thread->init_tick      = tick;
     thread->remaining_tick = tick;
-    thread->can_yield      = RT_FALSE;
 
     /* error and flags */
     thread->error = RT_EOK;