mirror of https://github.com/RT-Thread/rt-thread
add RT_THREAD_CTRL_SET_PRIORITY
This commit is contained in:
parent
da1c5c7882
commit
12de72a462
|
@ -1634,7 +1634,7 @@ sysret_t sys_setpriority(int which, id_t who, int prio)
|
|||
for (list = lwp->t_grp.next; list != &lwp->t_grp; list = list->next)
|
||||
{
|
||||
thread = rt_list_entry(list, struct rt_thread, sibling);
|
||||
rt_thread_control(thread, RT_THREAD_CTRL_SET_PRIORITY, &prio);
|
||||
rt_thread_control(thread, RT_THREAD_CTRL_RESET_PRIORITY, &prio);
|
||||
}
|
||||
lwp_pid_lock_release();
|
||||
return 0;
|
||||
|
@ -8789,7 +8789,7 @@ sysret_t sys_sched_setparam(pid_t tid, void *param)
|
|||
|
||||
if (thread)
|
||||
{
|
||||
ret = rt_thread_control(thread, RT_THREAD_CTRL_SET_PRIORITY, (void *)&sched_param->sched_priority);
|
||||
ret = rt_thread_control(thread, RT_THREAD_CTRL_RESET_PRIORITY, (void *)&sched_param->sched_priority);
|
||||
}
|
||||
|
||||
lwp_tid_dec_ref(thread);
|
||||
|
@ -8959,7 +8959,7 @@ sysret_t sys_sched_setscheduler(int tid, int policy, void *param)
|
|||
}
|
||||
|
||||
thread = lwp_tid_get_thread_and_inc_ref(tid);
|
||||
ret = rt_thread_control(thread, RT_THREAD_CTRL_SET_PRIORITY, (void *)&sched_param->sched_priority);
|
||||
ret = rt_thread_control(thread, RT_THREAD_CTRL_RESET_PRIORITY, (void *)&sched_param->sched_priority);
|
||||
lwp_tid_dec_ref(thread);
|
||||
|
||||
kmem_put(sched_param);
|
||||
|
|
|
@ -643,7 +643,7 @@ enum
|
|||
#define RT_THREAD_CTRL_CHANGE_PRIORITY 0x02 /**< Change thread priority. */
|
||||
#define RT_THREAD_CTRL_INFO 0x03 /**< Get thread information. */
|
||||
#define RT_THREAD_CTRL_BIND_CPU 0x04 /**< Set thread bind cpu. */
|
||||
#define RT_THREAD_CTRL_SET_PRIORITY 0x05 /**< Set thread priority. */
|
||||
#define RT_THREAD_CTRL_RESET_PRIORITY 0x05 /**< Reset thread priority. */
|
||||
|
||||
/**
|
||||
* CPU usage statistics data
|
||||
|
|
|
@ -128,8 +128,8 @@ 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_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_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_reset_priority(struct rt_thread *thread, rt_uint8_t priority);
|
||||
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_err_t rt_sched_thread_timer_stop(struct rt_thread *thread);
|
||||
|
|
|
@ -178,9 +178,9 @@ rt_err_t rt_sched_tick_increase(rt_tick_t tick)
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Set priority of the target thread
|
||||
* @brief Update priority of the target thread
|
||||
*/
|
||||
rt_err_t rt_sched_thread_set_priority(struct rt_thread *thread, rt_uint8_t priority)
|
||||
static rt_err_t _rt_sched_update_priority(struct rt_thread *thread, rt_uint8_t priority, rt_bool_t update_init_prio)
|
||||
{
|
||||
RT_ASSERT(priority < RT_THREAD_PRIORITY_MAX);
|
||||
RT_SCHED_DEBUG_IS_LOCKED;
|
||||
|
@ -192,7 +192,10 @@ rt_err_t rt_sched_thread_set_priority(struct rt_thread *thread, rt_uint8_t prior
|
|||
rt_sched_remove_thread(thread);
|
||||
|
||||
/* change thread priority */
|
||||
RT_SCHED_PRIV(thread).init_priority = priority;
|
||||
if (update_init_prio)
|
||||
{
|
||||
RT_SCHED_PRIV(thread).init_priority = priority;
|
||||
}
|
||||
RT_SCHED_PRIV(thread).current_priority = priority;
|
||||
|
||||
/* recalculate priority attribute */
|
||||
|
@ -210,7 +213,10 @@ rt_err_t rt_sched_thread_set_priority(struct rt_thread *thread, rt_uint8_t prior
|
|||
}
|
||||
else
|
||||
{
|
||||
RT_SCHED_PRIV(thread).init_priority = priority;
|
||||
if (update_init_prio)
|
||||
{
|
||||
RT_SCHED_PRIV(thread).init_priority = priority;
|
||||
}
|
||||
RT_SCHED_PRIV(thread).current_priority = priority;
|
||||
|
||||
/* recalculate priority attribute */
|
||||
|
@ -231,46 +237,15 @@ rt_err_t rt_sched_thread_set_priority(struct rt_thread *thread, rt_uint8_t prior
|
|||
*/
|
||||
rt_err_t rt_sched_thread_change_priority(struct rt_thread *thread, rt_uint8_t priority)
|
||||
{
|
||||
RT_ASSERT(priority < RT_THREAD_PRIORITY_MAX);
|
||||
RT_SCHED_DEBUG_IS_LOCKED;
|
||||
return _rt_sched_update_priority(thread, priority, RT_FALSE);
|
||||
}
|
||||
|
||||
/* 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).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).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 Reset priority of the target thread
|
||||
*/
|
||||
rt_err_t rt_sched_thread_reset_priority(struct rt_thread *thread, rt_uint8_t priority)
|
||||
{
|
||||
return _rt_sched_update_priority(thread, priority, RT_TRUE);
|
||||
}
|
||||
|
||||
#ifdef RT_USING_OVERFLOW_CHECK
|
||||
|
|
|
@ -779,7 +779,7 @@ RTM_EXPORT(rt_thread_mdelay);
|
|||
*
|
||||
* RT_THREAD_CTRL_BIND_CPU for bind the thread to a CPU.
|
||||
*
|
||||
* RT_THREAD_CTRL_SET_PRIORITY for set priority level of thread.
|
||||
* RT_THREAD_CTRL_RESET_PRIORITY for reset priority level of thread.
|
||||
*
|
||||
* @param arg is the argument of control command.
|
||||
*
|
||||
|
@ -804,12 +804,12 @@ rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg)
|
|||
return error;
|
||||
}
|
||||
|
||||
case RT_THREAD_CTRL_SET_PRIORITY:
|
||||
case RT_THREAD_CTRL_RESET_PRIORITY:
|
||||
{
|
||||
rt_err_t error;
|
||||
rt_sched_lock_level_t slvl;
|
||||
rt_sched_lock(&slvl);
|
||||
error = rt_sched_thread_set_priority(thread, *(rt_uint8_t *)arg);
|
||||
error = rt_sched_thread_reset_priority(thread, *(rt_uint8_t *)arg);
|
||||
rt_sched_unlock(slvl);
|
||||
return error;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue