summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/rtdef.h1
-rw-r--r--src/clock.c2
-rw-r--r--src/scheduler.c15
-rw-r--r--src/thread.c1
4 files changed, 19 insertions, 0 deletions
diff --git a/include/rtdef.h b/include/rtdef.h
index 3dc8a2a2a9..90604e9b1d 100644
--- a/include/rtdef.h
+++ b/include/rtdef.h
@@ -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 */
diff --git a/src/clock.c b/src/clock.c
index a652282b6e..d56f4b00f3 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -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();
}
diff --git a/src/scheduler.c b/src/scheduler.c
index f671a49623..a4b4800d76 100644
--- a/src/scheduler.c
+++ b/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->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);
}
}
diff --git a/src/thread.c b/src/thread.c
index a88729e52c..cf42c72a1b 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -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;