Browse Source

add RT_THREAD_CTRL_SET_PRIORITY

wycwyhwyq 3 weeks ago
parent
commit
12de72a462
5 changed files with 26 additions and 51 deletions
  1. 3 3
      components/lwp/lwp_syscall.c
  2. 1 1
      include/rtdef.h
  3. 1 1
      include/rtsched.h
  4. 18 43
      src/scheduler_comm.c
  5. 3 3
      src/thread.c

+ 3 - 3
components/lwp/lwp_syscall.c

@@ -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);

+ 1 - 1
include/rtdef.h

@@ -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

+ 1 - 1
include/rtsched.h

@@ -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);

+ 18 - 43
src/scheduler_comm.c

@@ -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;
-
-    /* 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_sched_update_priority(thread, priority, RT_FALSE);
+}
 
-    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

+ 3 - 3
src/thread.c

@@ -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;
         }