未验证 提交 da7751c0 编写于 作者: B Bernard Xiong 提交者: GitHub

Merge pull request #3129 from jesven/fix_same_prio

修正相同优先级任务切换太频繁的问题
...@@ -44,7 +44,7 @@ void secondary_cpu_c_start(void) ...@@ -44,7 +44,7 @@ void secondary_cpu_c_start(void)
arm_gic_cpu_init(0, REALVIEW_GIC_CPU_BASE); arm_gic_cpu_init(0, REALVIEW_GIC_CPU_BASE);
arm_gic_set_cpu(0, IRQ_PBA8_TIMER0_1, 0x2); 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_install(IRQ_PBA8_TIMER0_1, rt_hw_timer2_isr, RT_NULL, "tick");
rt_hw_interrupt_umask(IRQ_PBA8_TIMER0_1); rt_hw_interrupt_umask(IRQ_PBA8_TIMER0_1);
......
...@@ -491,7 +491,10 @@ typedef siginfo_t rt_siginfo_t; ...@@ -491,7 +491,10 @@ typedef siginfo_t rt_siginfo_t;
#define RT_THREAD_RUNNING 0x03 /**< Running status */ #define RT_THREAD_RUNNING 0x03 /**< Running status */
#define RT_THREAD_BLOCK RT_THREAD_SUSPEND /**< Blocked status */ #define RT_THREAD_BLOCK RT_THREAD_SUSPEND /**< Blocked status */
#define RT_THREAD_CLOSE 0x04 /**< Closed 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 0x10 /**< task hold signals */
#define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY) #define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY)
......
...@@ -89,6 +89,8 @@ void rt_tick_increase(void) ...@@ -89,6 +89,8 @@ void rt_tick_increase(void)
/* change to initialized tick */ /* change to initialized tick */
thread->remaining_tick = thread->init_tick; thread->remaining_tick = thread->init_tick;
thread->stat |= RT_THREAD_STAT_YIELD;
/* yield */ /* yield */
rt_thread_yield(); rt_thread_yield();
} }
......
...@@ -344,8 +344,13 @@ void rt_schedule(void) ...@@ -344,8 +344,13 @@ void rt_schedule(void)
{ {
to_thread = current_thread; 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 else
{ {
current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
rt_schedule_insert_thread(current_thread); rt_schedule_insert_thread(current_thread);
} }
} }
...@@ -435,8 +440,13 @@ void rt_schedule(void) ...@@ -435,8 +440,13 @@ void rt_schedule(void)
{ {
to_thread = rt_current_thread; 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 else
{ {
rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
need_insert_from_thread = 1; need_insert_from_thread = 1;
} }
} }
...@@ -578,8 +588,13 @@ void rt_scheduler_do_irq_switch(void *context) ...@@ -578,8 +588,13 @@ void rt_scheduler_do_irq_switch(void *context)
{ {
to_thread = current_thread; 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 else
{ {
current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
rt_schedule_insert_thread(current_thread); rt_schedule_insert_thread(current_thread);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册