Browse Source

修正相同优先级任务切换太频繁的问题

shaojinchun 6 years ago
parent
commit
234af6aaa2
4 changed files with 19 additions and 0 deletions
  1. 1 0
      include/rtdef.h
  2. 2 0
      src/clock.c
  3. 15 0
      src/scheduler.c
  4. 1 0
      src/thread.c

+ 1 - 0
include/rtdef.h

@@ -608,6 +608,7 @@ 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 */
 

+ 2 - 0
src/clock.c

@@ -89,6 +89,8 @@ void rt_tick_increase(void)
         /* change to initialized tick */
         thread->remaining_tick = thread->init_tick;
 
+        thread->can_yield = 1;
+
         /* yield */
         rt_thread_yield();
     }

+ 15 - 0
src/scheduler.c

@@ -344,8 +344,13 @@ void rt_schedule(void)
                 {
                     to_thread = current_thread;
                 }
+                else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0)
+                {
+                    to_thread = current_thread;
+                }
                 else
                 {
+                    current_thread->can_yield = 0;
                     rt_schedule_insert_thread(current_thread);
                 }
             }
@@ -435,8 +440,13 @@ void rt_schedule(void)
                 {
                     to_thread = rt_current_thread;
                 }
+                else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0)
+                {
+                    to_thread = current_thread;
+                }
                 else
                 {
+                    current_thread->can_yield = 0;
                     need_insert_from_thread = 1;
                 }
             }
@@ -578,8 +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 == 0)
+                {
+                    to_thread = current_thread;
+                }
                 else
                 {
+                    current_thread->can_yield = 0;
                     rt_schedule_insert_thread(current_thread);
                 }
             }

+ 1 - 0
src/thread.c

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