mcu_ab568x/app/platform/libs/api_rt_thread.h
2025-05-30 18:03:10 +08:00

582 lines
26 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __API_RT_THREAD__
#define __API_RT_THREAD__
/* RT-Thread error code definitions */
#define OS_EOK 0 /**< There is no error */
#define OS_ERROR 1 /**< A generic error happens */
#define OS_ETIMEOUT 2 /**< Timed out */
#define OS_EFULL 3 /**< The resource is full */
#define OS_EEMPTY 4 /**< The resource is empty */
#define OS_ENOMEM 5 /**< No memory */
#define OS_ENOSYS 6 /**< No system */
#define OS_EBUSY 7 /**< Busy */
#define OS_EIO 8 /**< IO error */
#define OS_EINTR 9 /**< Interrupted system call */
#define OS_EINVAL 10 /**< Invalid argument */
/* FREE-OS basic data type definitions */
typedef signed char os_int8_t; /**< 8bit integer type */
typedef signed short os_int16_t; /**< 16bit integer type */
typedef signed long os_int32_t; /**< 32bit integer type */
typedef unsigned char os_uint8_t; /**< 8bit unsigned integer type */
typedef unsigned short os_uint16_t; /**< 16bit unsigned integer type */
typedef unsigned long os_uint32_t; /**< 32bit unsigned integer type */
typedef int os_bool_t; /**< boolean type */
/* 32bit CPU */
typedef long os_base_t; /**< Nbit CPU related date type */
typedef unsigned long os_ubase_t; /**< Nbit unsigned CPU related data type */
typedef os_base_t os_err_t; /**< Type for error number */
typedef os_uint32_t os_time_t; /**< Type for time stamp */
typedef os_uint32_t os_tick_t; /**< Type for tick count */
typedef os_base_t os_flag_t; /**< Type for flags */
typedef os_ubase_t os_size_t; /**< Type for size number */
typedef os_ubase_t os_dev_t; /**< Type for device */
typedef os_base_t os_off_t; /**< Type for offset */
#define OS_IPC_FLAG_FIFO 0x00 /**< FIFOed IPC. @ref IPC. */
#define OS_IPC_FLAG_PRIO 0x01 /**< PRIOed IPC. @ref IPC. */
#ifndef OS_TIMER_SKIP_LIST_LEVEL
#define OS_TIMER_SKIP_LIST_LEVEL 1
#endif
#define OS_NAME_MAX 4
/**
* thread control command definitions
*/
#define OS_THREAD_CTRL_STARTUP 0x00 /**< Startup thread. */
#define OS_THREAD_CTRL_CLOSE 0x01 /**< Close thread. */
#define OS_THREAD_CTRL_CHANGE_PRIORITY 0x02 /**< Change thread priority. */
#define OS_THREAD_CTRL_INFO 0x03 /**< Get thread information. */
struct os_list_node
{
struct os_list_node *next; /**< point to next node. */
struct os_list_node *prev; /**< point to prev node. */
};
typedef struct os_list_node os_list_t; /**< Type for lists. */
/**
* Base structure of Kernel object
*/
struct os_object
{
char name[OS_NAME_MAX]; /**< name of kernel object */
os_uint8_t type; /**< type of kernel object */
os_uint8_t flag; /**< flag of kernel object */
#ifdef OS_USING_MODULE
void *module_id; /**< id of application module */
#endif
os_list_t list; /**< list node of kernel object */
};
typedef struct os_object *os_object_t; /**< Type for kernel objects. */
/**
* timer structure
*/
struct os_timer
{
struct os_object parent; /**< inherit from os_object */
os_list_t row[OS_TIMER_SKIP_LIST_LEVEL];
void (*timeout_func)(void *parameter); /**< timeout function */
void *parameter; /**< timeout function's parameter */
os_tick_t init_tick; /**< timer timeout tick */
os_tick_t timeout_tick; /**< timeout tick */
};
typedef struct os_timer *os_timer_t;
/**
* Thread structure
*/
struct os_thread
{
/* rt object */
char name[OS_NAME_MAX]; /**< the name of thread */
os_uint8_t type; /**< type of object */
os_uint8_t flags; /**< thread's flags */
#ifdef OS_USING_MODULE
void *module_id; /**< id of application module */
#endif
os_list_t list; /**< the object list */
os_list_t tlist; /**< the thread list */
/* stack point and entry */
void *sp; /**< stack point */
void *entry; /**< entry */
void *parameter; /**< parameter */
void *stack_addr; /**< stack address */
os_uint16_t stack_size; /**< stack size */
/* error code */
os_err_t error; /**< error code */
os_uint8_t stat; /**< thread stat */
/* priority */
os_uint8_t current_priority; /**< current priority */
os_uint8_t init_priority; /**< initialized priority */
#if OS_THREAD_PRIORITY_MAX > 32
os_uint8_t number;
os_uint8_t high_mask;
#endif
os_uint32_t number_mask;
#if defined(OS_USING_EVENT)
/* thread event */
os_uint32_t event_set;
os_uint8_t event_info;
#endif
os_ubase_t init_tick; /**< thread's initialized tick */
os_ubase_t remaining_tick; /**< remaining tick */
struct os_timer thread_timer; /**< built-in thread timer */
void (*cleanup)(struct os_thread *tid); /**< cleanup function when thread exit */
os_uint32_t user_data; /**< private user data beyond this thread */
};
typedef struct os_thread *os_thread_t;
/**
* Base structure of IPC object
*/
struct os_ipc_object
{
struct os_object parent; /**< inherit from os_object */
os_list_t suspend_thread; /**< threads pended on this resource */
};
struct os_semaphore
{
struct os_ipc_object parent; /**< inherit from ipc_object */
os_uint16_t value; /**< value of semaphore. */
};
typedef struct os_semaphore *os_sem_t;
struct os_mutex
{
struct os_ipc_object parent; /**< inherit from ipc_object */
os_uint16_t value; /**< value of mutex */
os_uint8_t original_priority; /**< priority of last thread hold the mutex */
os_uint8_t hold; /**< numbers of thread hold the mutex */
struct os_thread *owner; /**< current owner of mutex */
};
typedef struct os_mutex *os_mutex_t;
/**
* message queue structure
*/
struct os_messagequeue
{
struct os_ipc_object parent; /**< inherit from ipc_object */
void *msg_pool; /**< start address of message queue */
os_uint16_t msg_size; /**< message size of each message */
os_uint16_t max_msgs; /**< max number of messages */
os_uint16_t entry; /**< index of messages in the queue */
void *msg_queue_head; /**< list head */
void *msg_queue_tail; /**< list tail */
void *msg_queue_free; /**< pointer indicated the free node of queue */
};
typedef struct os_messagequeue *os_mq_t;
//----------------------------------------------------------------------------------
//
//
typedef os_err_t (*os_thread_init_func)(struct os_thread *thread,
const char *name,
void (*entry)(void *parameter),
void *parameter,
void *stack_start,
os_uint32_t stack_size,
os_uint8_t priority,
os_uint32_t tick);
typedef os_thread_t (*os_thread_create_func)(const char *name,
void (*entry)(void *parameter),
void *parameter,
os_uint32_t stack_size,
os_uint8_t priority,
os_uint32_t tick);
typedef os_err_t (*os_thread_startup_func)(os_thread_t thread);
typedef os_err_t (*os_thread_suspend_func)(os_thread_t thread);
typedef os_err_t (*os_thread_resume_func)(os_thread_t thread);
typedef os_thread_t (*os_thread_self_func)(void);
typedef os_err_t (*os_thread_control_func)(os_thread_t thread, os_uint8_t cmd, void *arg);
typedef os_err_t (*os_sem_init_func)(os_sem_t sem, const char *name, os_uint32_t value, os_uint8_t flag);
typedef os_sem_t (*os_sem_create_func)(const char *name, os_uint32_t value, os_uint8_t flag);
typedef os_err_t (*os_sem_delete_func)(os_sem_t sem);
typedef os_err_t (*os_sem_take_func)(os_sem_t sem, os_int32_t time);
typedef os_err_t (*os_sem_trytake_func)(os_sem_t sem);
typedef os_err_t (*os_sem_release_func)(os_sem_t sem);
typedef os_err_t (*os_mutex_init_func)(os_mutex_t mutex, const char *name, os_uint8_t flag);
typedef os_mutex_t (*os_mutex_create_func)(const char *name, os_uint8_t flag);
typedef os_err_t (*os_mutex_delete_func)(os_mutex_t mutex);
typedef os_err_t (*os_mutex_take_func)(os_mutex_t mutex, os_int32_t time);
typedef os_err_t (*os_mutex_release_func)(os_mutex_t mutex);
typedef os_err_t (*os_mq_init_func)(os_mq_t mq, const char *name, void *msgpool, os_size_t msg_size, os_size_t pool_size, os_uint8_t flag);
typedef os_mq_t (*os_mq_create_func)(const char *name, os_size_t msg_size, os_size_t max_msgs, os_uint8_t flag);
typedef os_err_t (*os_mq_delete_func)(os_mq_t mq);
typedef os_err_t (*os_mq_send_func)(os_mq_t mq, void *buffer, os_size_t size);
typedef os_err_t (*os_mq_recv_func)(os_mq_t mq, void *buffer, os_size_t size, os_int32_t timeout);
#define OS_FUNC_BASE 0x84100
#define OS_FUNC_BASE5 (OS_FUNC_BASE + 0x100)
#define OS_FUNC_BASE6 (OS_FUNC_BASE + 0x140)
#define OS_FUNC_BASE8 (OS_FUNC_BASE + 0x1C0)
#define os_thread_init ((os_thread_init_func)(OS_FUNC_BASE5 + 0))
#define os_thread_create ((os_thread_create_func)(OS_FUNC_BASE5 + 8))
#define os_thread_suspend ((os_thread_suspend_func)(OS_FUNC_BASE5 + 16))
#define os_thread_resume ((os_thread_resume_func)(OS_FUNC_BASE5 + 20))
#define os_thread_self ((os_thread_self_func)(OS_FUNC_BASE5 + 28))
#define os_thread_startup ((os_thread_startup_func)(OS_FUNC_BASE5 + 36))
#define os_thread_control ((os_thread_control_func)(OS_FUNC_BASE5 + 24))
#define os_sem_init ((os_sem_init_func)(OS_FUNC_BASE6 + 0))
#define os_sem_create ((os_sem_create_func)(OS_FUNC_BASE6 + 8))
#define os_sem_delete ((os_sem_delete_func)(OS_FUNC_BASE6 + 12))
#define os_sem_take ((os_sem_take_func)(OS_FUNC_BASE6 + 16))
#define os_sem_release ((os_sem_release_func)(OS_FUNC_BASE6 + 20))
#define os_sem_trytake ((os_sem_trytake_func)(OS_FUNC_BASE6 + 28))
#define os_mutex_init ((os_mutex_init_func)(OS_FUNC_BASE6 + 32))
#define os_mutex_create ((os_mutex_create_func)(OS_FUNC_BASE6 + 40))
#define os_mutex_delete ((os_mutex_delete_func)(OS_FUNC_BASE6 + 44))
#define os_mutex_take ((os_mutex_take_func)(OS_FUNC_BASE6 + 48))
#define os_mutex_release ((os_mutex_release_func)(OS_FUNC_BASE6 + 52))
#define os_mq_init ((os_mq_init_func)(OS_FUNC_BASE8 + 0))
#define os_mq_create ((os_mq_create_func)(OS_FUNC_BASE8 + 8))
#define os_mq_delete ((os_mq_delete_func)(OS_FUNC_BASE8 + 12))
#define os_mq_send ((os_mq_send_func)(OS_FUNC_BASE8 + 16))
#define os_mq_recv ((os_mq_recv_func)(OS_FUNC_BASE8 + 20))
#ifdef API_MAXROM
/**
* @brief 初始化线程
* 此函数将初始化一个线程,通常用于初始化一个静态线程对象。
* @param[in] thread 线程句柄。线程句柄由用户提供出来,并指向对应的线程控制块内存地址。
* @param[in] name 线程的名称;线程名称的最大长度由 rtconfig.h 中定义的 RT_NAME_MAX 宏指定,多余部分会被自动截掉。
* @param[in] entry 线程的入口函数
* @param[in] parameter 入口函数的传入参数
* @param[in] stack_start 线程堆栈的起始地址
* @param[in] stack_size 线程栈大小,单位是字节。在大多数系统中需要做栈空间地址对齐(例如 ARM 体系结构中需要向 4 字节地址对齐)。
* @param[in] priority 线程的优先级。从 21 27可以用其中GUI线程已经使用了23其他的优先级被用了数值越小优先级越高0 代表最高优先级。
* @param[in] tick 线程的时间片大小。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。
*
* @return 成功返回 RT_EOK,
失败则返回 -RT_ERROR
**/
os_err_t os_thread_init(struct os_thread *thread,
const char *name,
void (*entry)(void *parameter),
void *parameter,
void *stack_start,
os_uint32_t stack_size,
os_uint8_t priority, //21(包括21)到27(包括27)可以选择, GUI线程已经使用了23
os_uint32_t tick);
/**
* @brief 初始化线程
* 此函数将初始化一个线程线程堆栈在heap里自动分配
* @param[in] name 线程的名称;线程名称的最大长度由 rtconfig.h 中定义的 RT_NAME_MAX 宏指定,多余部分会被自动截掉。
* @param[in] entry 线程的入口函数
* @param[in] parameter 入口函数的传入参数
* @param[in] stack_size 线程栈大小,单位是字节。在大多数系统中需要做栈空间地址对齐(例如 ARM 体系结构中需要向 4 字节地址对齐)。
* @param[in] priority 线程的优先级。从 21 27可以用其中GUI线程已经使用了23数值越小优先级越高0 代表最高优先级。
* @param[in] tick 线程的时间片大小。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。
*
* @return 成功返回 线程handld,
失败则返回 NULL
**/
os_thread_t os_thread_create(const char *name,
void (*entry)(void *parameter),
void *parameter,
os_uint32_t stack_size,
os_uint8_t priority, //21(包括21)到27(包括27)可以选择, GUI线程已经使用了23
os_uint32_t tick);
/**
* @brief 启动线程
* 此函数将启动一个线程并将其放入系统就绪队列
* @param[in] thread 被要被启动的线程句柄
* @param[in] enable
*
* @return 成功返回 RT_EOK
失败则返回 -RT_ERROR
**/
os_err_t os_thread_startup(os_thread_t thread);
/**
* @brief 挂起线程
* 该函数将挂起指定的线程。
* @param[in] thread 要被挂起的线程
* @param[in] enable
*
* @return 成功返回 RT_EOK
失败则返回 -RT_ERROR
注: 如果挂起的是当前线程该函数运行之后必须调用rt_schedule()函数。 用户只需要了解该接口的作用,不推荐使用该接口。
**/
os_err_t os_thread_suspend(os_thread_t thread);
/**
* @brief 使线程恢复运行
* 线程恢复就是让挂起的线程重新进入就绪状态,并将线程放入系统的就绪队列中;如果被恢复线程在所有就绪态线程中,位于最高优先级链表的第一位,那么系统
* 做上下文切換
* @param[in] thread 将要被恢复的线程
*
* @return 成功返回 RT_EOK
失败则返回 -RT_ERROR
**/
os_err_t os_thread_resume(os_thread_t thread);
/**
* @brief 获得当前线程
* 该函数将返回当前线程的线程对象句柄
* @param[in] thread 将要被恢复的线程
*
* @return 成功返回 当前线程对象句柄
失败则返回 RT_NULL
**/
os_thread_t os_thread_self(void);
/**
* @brief 初始化信号量
* 该函数将初始化信号量并将其置于内核管理器的控制之下。
* @param[in] sem 指定的信号量对象句柄
* @param[in] name 信号量的名称
* @param[in] value 信号量初始化时的值
* @param[in] flag 信号量的标志位
*
* @return 成功返回 RT_EOK
**/
os_err_t os_sem_init(os_sem_t sem, const char *name, os_uint32_t value, os_uint8_t flag);
/**
* @brief 初始化信号量
* 该函数将初始化信号量并将其置于内核管理器的控制之下。
* @param[in] name 信号量的名称
* @param[in] value 信号量初始化时的值
* @param[in] flag 信号量的标志位
*
* @return 成功返回 RT_EOK
**/
os_sem_t os_sem_create(const char *name, os_uint32_t value, os_uint8_t flag);
/**
* @brief 删除信号量
* 系统不再使用信号量时,可通过删除信号量以释放系统资源,适用于动态创建的信号量。 调用该函数将删除一个信号量对象,并释放其占用的内存空间。
* @param[in] sem 指定的信号量对象句柄
* @return 成功返回 RT_EOK
**/
os_err_t os_sem_delete(os_sem_t sem);
/**
* @brief 获取信号量
* 线程通过调用该函数获取信号量来获得信号量资源实例,当信号量值大于零时,线程将获得信号量, 并且相应的信号量值会减 1
* 如果信号量的值等于零,那么说明当前信号量资源实例不可用,申请 该信号量的线程将根据 time 参数的情况选择直接返回、或挂起等待一段时间、或永久等待,
* 直到 其他线程或中断释放该信号量。
* @param[in] sem 指定的信号量对象句柄
* @param[in] time 指定的等待时间单位是操作系统时钟节拍OS Tick
* @return 成功获得信号量;-RT_ETIMEOUT 超时依然未获得信号量;-RT_ERROR 其他错误
**/
os_err_t os_sem_take(os_sem_t sem, os_int32_t time);
/**
* @brief 无等待获取信号量
* 当用户不想在申请的信号量上挂起线程进行等待时,可以调用该函数以无等待方式获取信号量
* @param[in] sem 指定的信号量对象句柄
* @return RT_EOK 成功获得信号量;-RT_ETIMEOUT 获取失败
**/
os_err_t os_sem_trytake(os_sem_t sem);
/**
* @brief 释放信号量
* 该函数将释放一个信号量,当信号量的值等于零时,并且有线程等待这个信号量时,
* 释放信号量将唤醒等待在该信号量线程队列中的第一个线程,由它获取信号量;否则 将把信号量的值加一。
* @param[in] sem 指定的信号量对象句柄
* @return RT_EOK 成功释放信号量
**/
os_err_t os_sem_release(os_sem_t sem);
/**
* @brief 初始化互斥量
* 该函数将初始化互斥锁并将其置于内核管理器的控制之下
* @param[in] mutex 互斥量对象的句柄
* @param[in] name 互斥量的名称
* @param[in] flag 互斥量的标志位
* @return RT_EOK 初始化成功
**/
os_err_t os_mutex_init(os_mutex_t mutex, const char *name, os_uint8_t flag);
/**
* @brief 初始化互斥量
* 该函数将初始化互斥锁并将其置于内核管理器的控制之下
* @param[in] name 互斥量的名称
* @param[in] flag 互斥量的标志位
* @return RT_EOK 初始化成功
**/
os_mutex_t os_mutex_create(const char *name, os_uint8_t flag);
/**
* @brief 删除互斥量
* 当系统不再使用互斥量时,通过调用该函数删除互斥量以释放系统资源,适用于动态创建的互斥量。
* @param[in] mutex 互斥量对象的句柄
* @return RT_EOK 删除成功
**/
os_err_t os_mutex_delete(os_mutex_t mutex);
/**
* @brief 获取互斥量
* 该函数将获取一个互斥量,如果互斥量没有被其他线程控制,那么申请该互斥量的线程将成功获得该互斥量。
如果互斥量已经被当前线程线程控制则该互斥量的持有计数加1
当前线程也不会挂起等待。如果互斥量 已经被其他线程占有,则当前线程在该互斥量上挂起等待,直到其他线程释放它或者等待时间超过指定的 超时时间。
* @param[in] mutex 互斥量对象的句柄
* @param[in] time 指定的等待时间
* @return RT_EOK 成功获得互斥量;-RT_ETIMEOUT 超时;-RT_ERROR 获取失败
**/
os_err_t os_mutex_take(os_mutex_t mutex, os_int32_t time);
/**
* @brief 释放互斥量
* 使用该函数接口时,只有已经拥有互斥量控制权的线程才能释放它,每释放一次该互斥量,它的持有计数就减 1.
当该互斥量的持有计数为零时(即持有线程已经释放所有的持有操作), 它变为可用,等待在该信号量上的线程将被唤醒。
如果线程的运行优先级被互斥量提升, 那么当互斥量被释放后,线程恢复为持有互斥量前的优先级。
* @param[in] mutex 互斥量对象的句柄
* @return RT_EOK 成功
**/
os_err_t os_mutex_release(os_mutex_t mutex);
/**
* @brief 初始化消息队列
* 该函数将初始化消息队列并将其置于内核管理器的控制之下。 1.
* @param[in] mq 消息队列对象句柄
* @param[in] name 消息队列的名称
* @param[in] msgpool 用于存放消息的缓冲区指针
* @param[in] msg_size 消息队列中一条消息的最大长度,单位字
* @param[in] pool_size 存放消息的缓冲区大小
* @param[in] 消息队列采用的等待方式它可以取值OS_IPC_FLAG_FIFO或OS_IPC_FLAG_PRIO
* @return RT_EOK 成功
**/
os_err_t os_mq_init(os_mq_t mq, const char *name, void *msgpool, os_size_t msg_size, os_size_t pool_size, os_uint8_t flag);
/**
* @brief 初始化消息队列
* 该函数将初始化消息队列并将其置于内核管理器的控制之下。 1.
* @param[in] mq 消息队列对象句柄
* @param[in] name 消息队列的名称
* @param[in] msg_size 消息队列中一条消息的最大长度,单位字
* @param[in] 消息队列采用的等待方式它可以取值OS_IPC_FLAG_FIFO或OS_IPC_FLAG_PRIO
* @return RT_EOK 成功
**/
os_mq_t os_mq_create(const char *name, os_size_t msg_size, os_size_t max_msgs, os_uint8_t flag);
/**
* @brief 删除消息队列
*当消息队列不再被使用时,应该调用该函数接口删除它以释放系统资源,一旦操作完成, 消息队列将被永久性地删除。
删除消息队列时,如果有线程被挂起在该消息队列等待队列上, 则内核先唤醒挂起在该消息等待队列上的所有线程(返回值是 -RT_ERROR
然后再释放 消息队列使用的内存,最后删除消息队列对象。
* @param[in] mq 消息队列对象句柄
* @return RT_EOK 成功
**/
os_err_t os_mq_delete(os_mq_t mq);
/**
* @brief 发送消息
*线程或者中断服务程序都可以调用该函数给消息队列发送消息。当发送消息时, 消息队列对象先从空闲消息链表上取下一个空闲消息块,
把线程或者中断服务 程序发送的消息内容复制到消息块上,然后把该消息块挂到消息队列的尾部。 当且仅当空闲消息链表上有可用的空闲消息块时,
发送者才能成功发送消息; 当空闲消息链表上无可用消息块,说明消息队列已满,此时,发送消息的的 线程或者中断程序会收到一个错误码(-RT_EFULL
* @param[in] mq 消息队列对象句柄
* @param[in] buffer 消息内容
* @param[in] size 消息大小
* @return RT_EOK 成功 -RT_EFULL 消息队列已满;-RT_ERROR 失败,表示发送的 消息长度大于消息队列中消息的最大长度
**/
os_err_t os_mq_send(os_mq_t mq, void *buffer, os_size_t size);
/**
* @brief 接收消息
* 当消息队列中有消息时,接收者才能接收消息,否则接收者会根据超时时间设置, 或挂起在消息队列的等待线程队列上,或直接返回。
* @param[in] mq 消息队列对象句柄
* @param[in] buffer 消息内容
* @param[in] size 消息大小
* @param[in] timeout 指定的超时时间
*
* @return RT_EOK 成功;-RT_ETIMEOUT 超时;-RT_ERROR 失败
**/
os_err_t os_mq_recv(os_mq_t mq, void *buffer, os_size_t size, os_int32_t timeout);
/**
* @brief
* 获取线程剩余栈空间
* @param[in] pthd 线程
*
* @return 返回数量
**/
u32 thread_get_stack_free(os_thread_t pthd);
/**
* @brief
* 线程控制命令
* @param[in] pthd 线程
* @param[in] cmd 命令类型rt_thread.h 里定义的thread control command definitions
比如 OS_THREAD_CTRL_CHANGE_PRIORITY修改优先级
* @param[in] arg 命令参数
* @return RT_EOK 成功;-RT_ETIMEOUT 超时;-RT_ERROR 失败
* 举例修改main线程的优先级到1
{
prio = 1
os_thread_control(pthd_main, OS_THREAD_CTRL_CHANGE_PRIORITY, &prio);
}
**/
os_err_t os_thread_control(os_thread_t thread, os_uint8_t cmd, void *arg);
#endif
#endif // __API_RT_THREAD__