修正相同优先级任务切换太频繁的问题
This commit is contained in:
parent
413fcba30a
commit
234af6aaa2
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue