mirror of https://github.com/RT-Thread/rt-thread
[src] fix mutex bug
This commit is contained in:
parent
2db2bf0cc7
commit
f13193ff92
|
@ -128,6 +128,7 @@ rt_err_t rt_sched_thread_yield(struct rt_thread *thread);
|
||||||
rt_err_t rt_sched_thread_close(struct rt_thread *thread);
|
rt_err_t rt_sched_thread_close(struct rt_thread *thread);
|
||||||
rt_err_t rt_sched_thread_ready(struct rt_thread *thread);
|
rt_err_t rt_sched_thread_ready(struct rt_thread *thread);
|
||||||
rt_err_t rt_sched_thread_suspend(struct rt_thread *thread, rt_sched_lock_level_t level);
|
rt_err_t rt_sched_thread_suspend(struct rt_thread *thread, rt_sched_lock_level_t level);
|
||||||
|
rt_err_t rt_sched_thread_set_priority(struct rt_thread *thread, rt_uint8_t priority);
|
||||||
rt_err_t rt_sched_thread_change_priority(struct rt_thread *thread, rt_uint8_t priority);
|
rt_err_t rt_sched_thread_change_priority(struct rt_thread *thread, rt_uint8_t priority);
|
||||||
rt_err_t rt_sched_thread_bind_cpu(struct rt_thread *thread, int cpu);
|
rt_err_t rt_sched_thread_bind_cpu(struct rt_thread *thread, int cpu);
|
||||||
rt_uint8_t rt_sched_thread_is_suspended(struct rt_thread *thread);
|
rt_uint8_t rt_sched_thread_is_suspended(struct rt_thread *thread);
|
||||||
|
|
|
@ -177,6 +177,55 @@ rt_err_t rt_sched_tick_increase(rt_tick_t tick)
|
||||||
return RT_EOK;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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
|
* @brief Update priority of the target thread
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -797,7 +797,7 @@ rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg)
|
||||||
rt_err_t error;
|
rt_err_t error;
|
||||||
rt_sched_lock_level_t slvl;
|
rt_sched_lock_level_t slvl;
|
||||||
rt_sched_lock(&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);
|
rt_sched_unlock(slvl);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue