Browse Source

Merge pull request #3129 from jesven/fix_same_prio

修正相同优先级任务切换太频繁的问题
Bernard Xiong 5 years ago
parent
commit
da7751c044
4 changed files with 22 additions and 2 deletions
  1. 1 1
      bsp/qemu-vexpress-a9/drivers/secondary_cpu.c
  2. 4 1
      include/rtdef.h
  3. 2 0
      src/clock.c
  4. 15 0
      src/scheduler.c

+ 1 - 1
bsp/qemu-vexpress-a9/drivers/secondary_cpu.c

@@ -44,7 +44,7 @@ void secondary_cpu_c_start(void)
     arm_gic_cpu_init(0, REALVIEW_GIC_CPU_BASE);
     arm_gic_set_cpu(0, IRQ_PBA8_TIMER0_1, 0x2);
 
-    timer_init(0, 1000);
+    timer_init(0, 10000);
     rt_hw_interrupt_install(IRQ_PBA8_TIMER0_1, rt_hw_timer2_isr, RT_NULL, "tick");
     rt_hw_interrupt_umask(IRQ_PBA8_TIMER0_1);
 

+ 4 - 1
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)

+ 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->stat |= RT_THREAD_STAT_YIELD;
+
         /* 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->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
+                {
+                    to_thread = current_thread;
+                }
                 else
                 {
+                    current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
                     rt_schedule_insert_thread(current_thread);
                 }
             }
@@ -435,8 +440,13 @@ void rt_schedule(void)
                 {
                     to_thread = rt_current_thread;
                 }
+                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->stat &= ~RT_THREAD_STAT_YIELD_MASK;
                     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->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
+                {
+                    to_thread = current_thread;
+                }
                 else
                 {
+                    current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
                     rt_schedule_insert_thread(current_thread);
                 }
             }