summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshaojinchun <[email protected]>2019-11-05 08:41:38 +0800
committershaojinchun <[email protected]>2019-11-05 08:41:38 +0800
commite03ac83ad3d22c578e367550d2ff714b53e79799 (patch)
tree5330284b0bd13a61d0c09dd511a4124dc2b5e8ad
parent9a38bba1689ff1e73500584023051cced977a5c5 (diff)
将yield状态置于tcb的stat位域中
-rw-r--r--include/rtdef.h6
-rw-r--r--src/clock.c2
-rw-r--r--src/scheduler.c12
-rw-r--r--src/thread.c1
4 files changed, 11 insertions, 10 deletions
diff --git a/include/rtdef.h b/include/rtdef.h
index 90604e9b1d..119e9d7893 100644
--- a/include/rtdef.h
+++ b/include/rtdef.h
@@ -491,7 +491,10 @@ typedef siginfo_t rt_siginfo_t;
#define RT_THREAD_RUNNING 0x03 /**< Running status */
#define RT_THREAD_BLOCK RT_THREAD_SUSPEND /**< Blocked status */
#define RT_THREAD_CLOSE 0x04 /**< Closed status */
-#define RT_THREAD_STAT_MASK 0x0f
+#define RT_THREAD_STAT_MASK 0x07
+
+#define RT_THREAD_STAT_YIELD 0x08 /**< indicate whether remaining_tick has been reloaded since last schedule */
+#define RT_THREAD_STAT_YIELD_MASK RT_THREAD_STAT_YIELD
#define RT_THREAD_STAT_SIGNAL 0x10 /**< task hold signals */
#define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY)
@@ -608,7 +611,6 @@ 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 e288ff58a9..9b54101363 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -89,7 +89,7 @@ void rt_tick_increase(void)
/* change to initialized tick */
thread->remaining_tick = thread->init_tick;
- thread->can_yield = RT_TRUE;
+ thread->stat |= RT_THREAD_STAT_YIELD;
/* yield */
rt_thread_yield();
diff --git a/src/scheduler.c b/src/scheduler.c
index c58ecf6209..edcf11dba5 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -344,13 +344,13 @@ void rt_schedule(void)
{
to_thread = current_thread;
}
- else if (current_thread->current_priority == highest_ready_priority && current_thread->can_yield == RT_FALSE)
+ else if (current_thread->current_priority == highest_ready_priority && (current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
{
to_thread = current_thread;
}
else
{
- current_thread->can_yield = RT_FALSE;
+ current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
rt_schedule_insert_thread(current_thread);
}
}
@@ -440,13 +440,13 @@ void rt_schedule(void)
{
to_thread = rt_current_thread;
}
- else if (rt_current_thread->current_priority == highest_ready_priority && rt_current_thread->can_yield == RT_FALSE)
+ else if (rt_current_thread->current_priority == highest_ready_priority && (rt_current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
{
to_thread = rt_current_thread;
}
else
{
- rt_current_thread->can_yield = RT_FALSE;
+ rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
need_insert_from_thread = 1;
}
}
@@ -588,13 +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 == RT_FALSE)
+ else if (current_thread->current_priority == highest_ready_priority && (current_thread->stat & RT_THREAD_STAT_YIELD_MASK) == 0)
{
to_thread = current_thread;
}
else
{
- current_thread->can_yield = RT_FALSE;
+ current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
rt_schedule_insert_thread(current_thread);
}
}
diff --git a/src/thread.c b/src/thread.c
index 6f6fa1029a..a88729e52c 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -159,7 +159,6 @@ static rt_err_t _rt_thread_init(struct rt_thread *thread,
/* tick init */
thread->init_tick = tick;
thread->remaining_tick = tick;
- thread->can_yield = RT_FALSE;
/* error and flags */
thread->error = RT_EOK;