summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scheduler_comm.c49
-rw-r--r--src/thread.c2
2 files changed, 50 insertions, 1 deletions
diff --git a/src/scheduler_comm.c b/src/scheduler_comm.c
index 957f1a132e..889c6070cf 100644
--- a/src/scheduler_comm.c
+++ b/src/scheduler_comm.c
@@ -178,6 +178,55 @@ rt_err_t rt_sched_tick_increase(rt_tick_t tick)
}
/**
+ * @brief Set priority of the target thread
+ */
+rt_err_t rt_sched_thread_set_priority(struct rt_thread *thread, rt_uint8_t priority)
+{
+ RT_ASSERT(priority < RT_THREAD_PRIORITY_MAX);
+ RT_SCHED_DEBUG_IS_LOCKED;
+
+ /* for ready thread, change queue; otherwise simply update the priority */
+ if ((RT_SCHED_CTX(thread).stat & RT_THREAD_STAT_MASK) == RT_THREAD_READY)
+ {
+ /* remove thread from schedule queue first */
+ rt_sched_remove_thread(thread);
+
+ /* change thread priority */
+ RT_SCHED_PRIV(thread).init_priority = priority;
+ RT_SCHED_PRIV(thread).current_priority = priority;
+
+ /* recalculate priority attribute */
+#if RT_THREAD_PRIORITY_MAX > 32
+ RT_SCHED_PRIV(thread).number = RT_SCHED_PRIV(thread).current_priority >> 3; /* 5bit */
+ RT_SCHED_PRIV(thread).number_mask = 1 << RT_SCHED_PRIV(thread).number;
+ RT_SCHED_PRIV(thread).high_mask = 1 << (RT_SCHED_PRIV(thread).current_priority & 0x07); /* 3bit */
+#else
+ RT_SCHED_PRIV(thread).number_mask = 1 << RT_SCHED_PRIV(thread).current_priority;
+#endif /* RT_THREAD_PRIORITY_MAX > 32 */
+ RT_SCHED_CTX(thread).stat = RT_THREAD_INIT;
+
+ /* insert thread to schedule queue again */
+ rt_sched_insert_thread(thread);
+ }
+ else
+ {
+ RT_SCHED_PRIV(thread).init_priority = priority;
+ RT_SCHED_PRIV(thread).current_priority = priority;
+
+ /* recalculate priority attribute */
+#if RT_THREAD_PRIORITY_MAX > 32
+ RT_SCHED_PRIV(thread).number = RT_SCHED_PRIV(thread).current_priority >> 3; /* 5bit */
+ RT_SCHED_PRIV(thread).number_mask = 1 << RT_SCHED_PRIV(thread).number;
+ RT_SCHED_PRIV(thread).high_mask = 1 << (RT_SCHED_PRIV(thread).current_priority & 0x07); /* 3bit */
+#else
+ RT_SCHED_PRIV(thread).number_mask = 1 << RT_SCHED_PRIV(thread).current_priority;
+#endif /* RT_THREAD_PRIORITY_MAX > 32 */
+ }
+
+ return RT_EOK;
+}
+
+/**
* @brief Update priority of the target thread
*/
rt_err_t rt_sched_thread_change_priority(struct rt_thread *thread, rt_uint8_t priority)
diff --git a/src/thread.c b/src/thread.c
index 789077d082..09cba18131 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -797,7 +797,7 @@ rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg)
rt_err_t error;
rt_sched_lock_level_t slvl;
rt_sched_lock(&slvl);
- error = rt_sched_thread_change_priority(thread, *(rt_uint8_t *)arg);
+ error = rt_sched_thread_set_priority(thread, *(rt_uint8_t *)arg);
rt_sched_unlock(slvl);
return error;
}