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

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

上级 413fcba3
......@@ -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 */
......
......@@ -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();
}
......
......@@ -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);
}
}
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册