* @brief This function will control thread behaviors according to control command. * * @param thread Handle of the thread to be controlled. * * @param cmd Control command, which includes. * - `RT_THREAD_CTRL_CHANGE_PRIORITY` for changing priority level of thread. * - `RT_THREAD_CTRL_STARTUP` for starting a thread, equivalent to * the `rt_thread
| 815 | * If the return value is any other values, it means this operation failed. |
| 816 | */ |
| 817 | rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg) |
| 818 | { |
| 819 | /* parameter check */ |
| 820 | RT_ASSERT(thread != RT_NULL); |
| 821 | RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread); |
| 822 | |
| 823 | switch (cmd) |
| 824 | { |
| 825 | case RT_THREAD_CTRL_CHANGE_PRIORITY: |
| 826 | { |
| 827 | rt_err_t error; |
| 828 | rt_sched_lock_level_t slvl; |
| 829 | rt_sched_lock(&slvl); |
| 830 | error = rt_sched_thread_change_priority(thread, *(rt_uint8_t *)arg); |
| 831 | rt_sched_unlock(slvl); |
| 832 | return error; |
| 833 | } |
| 834 | |
| 835 | case RT_THREAD_CTRL_RESET_PRIORITY: |
| 836 | { |
| 837 | rt_err_t error; |
| 838 | rt_sched_lock_level_t slvl; |
| 839 | rt_sched_lock(&slvl); |
| 840 | error = rt_sched_thread_reset_priority(thread, *(rt_uint8_t *)arg); |
| 841 | rt_sched_unlock(slvl); |
| 842 | return error; |
| 843 | } |
| 844 | |
| 845 | case RT_THREAD_CTRL_STARTUP: |
| 846 | { |
| 847 | return rt_thread_startup(thread); |
| 848 | } |
| 849 | |
| 850 | case RT_THREAD_CTRL_CLOSE: |
| 851 | { |
| 852 | rt_err_t rt_err = -RT_EINVAL; |
| 853 | |
| 854 | if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE) |
| 855 | { |
| 856 | rt_err = rt_thread_detach(thread); |
| 857 | } |
| 858 | #ifdef RT_USING_HEAP |
| 859 | else |
| 860 | { |
| 861 | rt_err = rt_thread_delete(thread); |
| 862 | } |
| 863 | #endif /* RT_USING_HEAP */ |
| 864 | rt_schedule(); |
| 865 | return rt_err; |
| 866 | } |
| 867 | |
| 868 | case RT_THREAD_CTRL_BIND_CPU: |
| 869 | { |
| 870 | rt_uint8_t cpu; |
| 871 | |
| 872 | cpu = (rt_uint8_t)(rt_size_t)arg; |
| 873 | return rt_sched_thread_bind_cpu(thread, cpu); |
| 874 | } |