提交 234af6aa 编写于 作者: S shaojinchun

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

上级 413fcba3
...@@ -608,6 +608,7 @@ struct rt_thread ...@@ -608,6 +608,7 @@ struct rt_thread
rt_ubase_t init_tick; /**< thread's initialized tick */ rt_ubase_t init_tick; /**< thread's initialized tick */
rt_ubase_t remaining_tick; /**< remaining 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 */ struct rt_timer thread_timer; /**< built-in thread timer */
......
...@@ -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->can_yield = 1;
/* 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->can_yield == 0)
{
to_thread = current_thread;
}
else else
{ {
current_thread->can_yield = 0;
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 (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == 0)
{
to_thread = current_thread;
}
else else
{ {
current_thread->can_yield = 0;
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->can_yield == 0)
{
to_thread = current_thread;
}
else else
{ {
current_thread->can_yield = 0;
rt_schedule_insert_thread(current_thread); rt_schedule_insert_thread(current_thread);
} }
} }
......
...@@ -159,6 +159,7 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread, ...@@ -159,6 +159,7 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
/* tick init */ /* tick init */
thread->init_tick = tick; thread->init_tick = tick;
thread->remaining_tick = tick; thread->remaining_tick = tick;
thread->can_yield = 0;
/* error and flags */ /* error and flags */
thread->error = RT_EOK; thread->error = RT_EOK;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册