Browse Source

[src] fix mutex bug

wycwyhwyq 4 months ago
parent
commit
f13193ff92
3 changed files with 51 additions and 1 deletions
  1. 1 0
      include/rtsched.h
  2. 49 0
      src/scheduler_comm.c
  3. 1 1
      src/thread.c

+ 1 - 0
include/rtsched.h

@@ -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_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_bind_cpu(struct rt_thread *thread, int cpu);
 rt_uint8_t rt_sched_thread_is_suspended(struct rt_thread *thread);

+ 49 - 0
src/scheduler_comm.c

@@ -177,6 +177,55 @@ rt_err_t rt_sched_tick_increase(rt_tick_t tick)
     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
  */

+ 1 - 1
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;
         }