summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorshaojinchun <[email protected]>2019-10-11 09:13:40 +0800
committershaojinchun <[email protected]>2019-10-12 10:51:47 +0800
commit234af6aaa2ec2fd5c8c758a8f9fa29553ddeaf3f (patch)
tree83e0c2fb86cb203117d537e613bab627efb72c91 /src
parent413fcba30a532e416d930e6209c331d05e2d2887 (diff)
修正相同优先级任务切换太频繁的问题
Diffstat (limited to 'src')
-rw-r--r--src/clock.c2
-rw-r--r--src/scheduler.c15
-rw-r--r--src/thread.c1
3 files changed, 18 insertions, 0 deletions
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;