From 234af6aaa2ec2fd5c8c758a8f9fa29553ddeaf3f Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Fri, 11 Oct 2019 09:13:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=9B=B8=E5=90=8C=E4=BC=98?= =?UTF-8?q?=E5=85=88=E7=BA=A7=E4=BB=BB=E5=8A=A1=E5=88=87=E6=8D=A2=E5=A4=AA?= =?UTF-8?q?=E9=A2=91=E7=B9=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/rtdef.h | 1 + src/clock.c | 2 ++ src/scheduler.c | 15 +++++++++++++++ src/thread.c | 1 + 4 files changed, 19 insertions(+) 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;