diff options
| author | wycwyhwyq <[email protected]> | 2025-02-27 17:46:32 +0800 |
|---|---|---|
| committer | Rbb666 <[email protected]> | 2025-04-13 15:25:42 +0800 |
| commit | f13193ff92e47c39436e0254062927a39450e04a (patch) | |
| tree | b294bb5d826913916cc495ba12cf0456238d734b /src | |
| parent | 2db2bf0cc7b8872e15a4b963a24f7d677f79060f (diff) | |
[src] fix mutex bug
Diffstat (limited to 'src')
| -rw-r--r-- | src/scheduler_comm.c | 49 | ||||
| -rw-r--r-- | src/thread.c | 2 |
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; } |
