doubao_chat/include_lib/system/os/os_api.h

928 lines
34 KiB
C
Raw 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 __OS_API_H
#define __OS_API_H
#ifdef __cplusplus
extern "C"
{
#endif
#include "generic/typedef.h"
#include "os/os_cpu.h"
#include "os/os_error.h"
#include "os/os_type.h"
/**
* \name 任务消息类型
* \{
*/
#define Q_MSG 0x100000 /*!< 普通消息 */
#define Q_EVENT 0x200000 /*!< 事件消息 */
#define Q_CALLBACK 0x300000 /*!< 回调消息 */
#define Q_USER 0x400000 /*!< 用户消息 */
/* \} name */
/**
* \name 信号量、互斥量和队列消息的是否强制删除操作标志
* \{
*/
#define OS_DEL_NO_PEND 0u
#define OS_DEL_ALWAYS 1u
/* \} name */
/**
* \name 任务删除标志
* \{
*/
#define OS_TASK_DEL_REQ 0x01u
#define OS_TASK_DEL_RES 0x02u
#define OS_TASK_DEL_OK 0x03u
/* \} name */
/**
* \name 任务归属标志
* \{
*/
#define OS_TASK_SELF (const char *)0x1
#define OS_TASK_FATHER (const char *)0x2
/* \} name */
/* ----------------------------------------------------------------------------*/
/**
* @brief 初始化操作系统
*/
/* ----------------------------------------------------------------------------*/
void os_init(void);
/* ----------------------------------------------------------------------------*/
/**
* @brief 初始化操作系统的时钟节拍
*/
/* ----------------------------------------------------------------------------*/
void os_init_tick(int);
/* ----------------------------------------------------------------------------*/
/**
* @brief 操作系统开始调度
*/
/* ----------------------------------------------------------------------------*/
void os_start(void);
/*----------------------------------------------------------------------------*/
/**@brief 创建一个任务,任务栈使用动态分配
* @param[in] func: 入口功能函数
* @param[in] parm: 入口函数的私有指针
* @param[in] prio: 优先级
* @param[in] stk_size: 堆栈空间的大小(以四个字节为一个单位)
* @param[in] q_size: 消息队列空间的大小(以四个字节为一个单位)
* @param[in] name: 任务名
* @return 0: 成功
* @return -1: 失败
*/
/*----------------------------------------------------------------------------*/
int os_task_create(void (*func)(void *parm),
void *parm,
u8 prio,
u32 stk_size,
int q_size,
const char *name);
/*----------------------------------------------------------------------------*/
/**@brief 创建一个任务,任务栈使用静态分配
* @param[in] func: 入口功能函数
* @param[in] parm: 入口函数的私有指针
* @param[in] prio: 优先级
* @param[in] stk_size: 堆栈空间的大小(以四个字节为一个单位)
* @param[in] q_size: 消息队列空间的大小(以四个字节为一个单位)
* @param[in] name: 任务名
* @param[in] tcb_stk_q: 静态内存块(包括任务控制块空间+任务栈空间+消息队列空间)
* @return 0: 成功
* @return -1: 失败
*/
/*----------------------------------------------------------------------------*/
int os_task_create_static(void (*func)(void *parm),
void *parm,
u8 prio,
u32 stk_size,
int q_size,
const char *name,
u8 *tcb_stk_q);
/* --------------------------------------------------------------------------*/
/**
* @brief 获取当前任务名
* @return 当前任务名
*/
/* ----------------------------------------------------------------------------*/
const char *os_current_task(void);
/* --------------------------------------------------------------------------*/
/**
* @brief 动态调整任务的优先级
* @param[in] task_name 需要调整的任务名
* @param[in] new_priority 调整后的任务优先级
*/
/* ----------------------------------------------------------------------------*/
void os_task_set_priority(const char *task_name, u8 new_priority);
/* --------------------------------------------------------------------------*/
/**
* @brief 获取当前任务的优先级
* @return 当前任务的优先级
*/
/* ----------------------------------------------------------------------------*/
unsigned int os_current_task_prio(void);
/* --------------------------------------------------------------------------*/
/**
* @brief 获取当前任务的任务栈大小
* @return 当前任务的任务栈大小
*/
/* ----------------------------------------------------------------------------*/
unsigned int os_current_task_stask_size(void);
/* --------------------------------------------------------------------------*/
/**
* @brief 获取当前时钟节拍数
* @return 当前时钟节拍数
*/
/* ----------------------------------------------------------------------------*/
unsigned int os_time_get(void);
/* --------------------------------------------------------------------------*/
/**
* @brief 请求删除任务
* @param[in] name 需要删除的任务名
* @return 删除标志tag
*/
/* ----------------------------------------------------------------------------*/
int os_task_del_req(const char *name);
/* --------------------------------------------------------------------------*/
/**
* @brief 响应任务删除请求,标记资源已经释放,可以删除当前任务
* @param[in] name 需要删除的任务名,当前任务可以用OS_TASK_SELF
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_task_del_res(const char *name);
/* --------------------------------------------------------------------------*/
/**
* @brief 强制删除任务
* @param[in] name 需要删除的任务名
* @return 0: 成功
* @return -1: 失败
* @note 任务不能删除自己,需要在其他任务中调用
*/
/* ----------------------------------------------------------------------------*/
int os_task_del(const char *name);
/* --------------------------------------------------------------------------*/
/**
* @brief 延时
* @param[in] time_tick 延时节拍,一个tick等于10ms
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
void os_time_dly(int time_tick);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送任务队列消息
* @param[in] name: 消息队列所属任务名
* @param[in] type: 消息类型
* @param[in] argc: 消息个数
* @param[in] argv: 消息数组
* @return 0: 成功
* @return OS_TASK_NOT_EXIST: 任务不存在
* @return OS_ERR_POST_NULL_PTR: 任务消息队列不存在
* @return OS_Q_FULL: 任务消息队列已满
*/
/* ----------------------------------------------------------------------------*/
int __os_taskq_post(const char *name, int type, int argc, int *argv);
/* ----------------------------------------------------------------------------*/
/**
* @brief 接收任务队列消息
* @param[in] tick: 等待超时,时钟节拍为单位,取0不等待马上返回
* @param[in] argv: 可用消息数组
* @param[in] argc: 可用消息个数
* @return OS_TASKQ: 成功
* @return OS_Q_EMPTY: 任务消息队列为空
*/
/* ----------------------------------------------------------------------------*/
int __os_taskq_pend(int *argv, int argc, int tick);
/* ----------------------------------------------------------------------------*/
/**
* @brief 删除任务队列的指定某个消息
* @param[in] name: 消息队列所属任务名
* @param[in] type: 消息类型
* @param[in] argv: 之前发送的消息个数
* @param[in] msg: 之前发送的消息
* @return 0: 成功
* @return OS_TASK_NOT_EXIST: 任务不存在
* @return OS_ERR_POST_NULL_PTR: 任务消息队列不存在
*/
/* ----------------------------------------------------------------------------*/
int __os_taskq_del(const char *name, int type, int argc, int *msg);
/* ----------------------------------------------------------------------------*/
/**
* @brief 接收任务队列消息,无限等待
* @param[in] fmt: "taskq"
* @param[in] argv: 可用消息数组
* @param[in] argc: 可用消息个数
* @return OS_TASKQ: 成功
* @return OS_Q_EMPTY: 任务消息队列为空
*/
/* ----------------------------------------------------------------------------*/
int os_taskq_pend(const char *fmt, int *argv, int argc);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送任务队列普通消息
* @param[in] name: 消息队列所属任务名
* @param[in] argc: 消息个数
* @param[in] ...: 消息可变参数
* @return 0: 成功
* @return OS_TASK_NOT_EXIST: 任务不存在
* @return OS_ERR_POST_NULL_PTR: 任务消息队列不存在
* @return OS_Q_FULL: 任务消息队列已满
*/
/* ----------------------------------------------------------------------------*/
int os_taskq_post(const char *name, int argc, ...);
/* ----------------------------------------------------------------------------*/
/**
* @brief 删除任务队列的某种类型的所有消息
* @param[in] name: 消息队列所属任务名
* @param[in] type: 消息类型
* @return 0: 成功
* @return OS_TASK_NOT_EXIST: 任务不存在
* @return OS_ERR_POST_NULL_PTR: 任务消息队列不存在
*/
/* ----------------------------------------------------------------------------*/
int os_taskq_del(const char *name, int type);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送任务队列消息
* @param[in] name: 消息队列所属任务名
* @param[in] type: 消息类型
* @param[in] argc: 消息个数
* @param[in] argv: 消息数组
* @return 0: 成功
* @return OS_TASK_NOT_EXIST: 任务不存在
* @return OS_ERR_POST_NULL_PTR: 任务消息队列不存在
* @return OS_Q_FULL: 任务消息队列已满
*/
/* ----------------------------------------------------------------------------*/
int os_taskq_post_type(const char *name, int type, int argc, int *argv);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送任务队列的普通消息
* @param[in] name: 消息队列所属任务名
* @param[in] argc: 消息个数
* @param[in] ...: 消息可变参数
* @return 0: 成功
* @return OS_TASK_NOT_EXIST: 任务不存在
* @return OS_ERR_POST_NULL_PTR: 任务消息队列不存在
* @return OS_Q_FULL: 任务消息队列已满
*/
/* ----------------------------------------------------------------------------*/
int os_taskq_post_msg(const char *name, int argc, ...);
/* ----------------------------------------------------------------------------*/
/**
* @brief 重置当前任务的消息队列
* @return 0: 成功
* @return -1: 失败
* @note 需要在当前任务中调用
*/
/* ----------------------------------------------------------------------------*/
int os_taskq_flush(void);
/// \cond DO_NOT_DOCUMENT
int os_taskq_accept(int argc, int *argv);
int os_task_pend(const char *fmt, int *argv, int argc);
int task_queue_post_event(const char *name, void *data, int len);
int os_taskq_post_event(const char *name, int argc, ...);
int os_taskq_del_type(const char *name, int type);
/// \endcond
/* ----------------------------------------------------------------------------*/
/**
* @brief 创建信号量
* @param[in] sem: 信号量
* @param[in] cnt: 初始计数值
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_sem_create(OS_SEM *sem, int cnt);
/* ----------------------------------------------------------------------------*/
/**
* @brief 等待信号量
* @param[in] sem: 信号量
* @param[in] timeout: 等待超时(时钟节拍),取0时无限等待,不堵塞请使用os_sem_accept
* @return 0: 成功
* @return OS_TIMEOUT: 等待超时
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_sem_pend(OS_SEM *sem, int timeout);
/* ----------------------------------------------------------------------------*/
/**
* @brief 获取信号量(非堵塞)
* @param[in] sem: 信号量
* @return 0: 成功
* @return OS_TIMEOUT: 获取失败
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_sem_accept(OS_SEM *sem);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送信号量
* @param[in] sem: 信号量
* @return 0: 成功
* @return -EFAULT: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_sem_post(OS_SEM *sem);
/* ----------------------------------------------------------------------------*/
/**
* @brief 删除信号量
* @param[in] sem: 信号量
* @param[in] force: 是否强制删除
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_sem_del(OS_SEM *sem, int force);
/* ----------------------------------------------------------------------------*/
/**
* @brief 设置信号量的计数值
* @param[in] sem: 信号量
* @param[in] cnt: 计数值
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_sem_set(OS_SEM *sem, u16 cnt);
/* ----------------------------------------------------------------------------*/
/**
* @brief 检查信号量是否合法
* @param[in] sem: 信号量
* @return 1: 有效
* @return 0: 非法
*/
/* ----------------------------------------------------------------------------*/
int os_sem_valid(OS_SEM *sem);
/* ----------------------------------------------------------------------------*/
/**
* @brief 检查信号量是否空闲
* @param[in] sem: 信号量
* @return 1: 没有其他线程在等待此信号量
* @return 0: 其他线程在等待此信号量
*/
/* ----------------------------------------------------------------------------*/
int os_sem_query(OS_SEM *sem);
/* ----------------------------------------------------------------------------*/
/**
* @brief 创建互斥量
* @param[in] mutex: 互斥量
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_mutex_create(OS_MUTEX *mutex);
/* ----------------------------------------------------------------------------*/
/**
* @brief 等待互斥量
* @param[in] mutex: 互斥量
* @param[in] timeout: 等待超时(时钟节拍),取0时无限等待,非堵塞请使用os_mutex_accept
* @return 0: 成功
* @return OS_TIMEOUT: 等待超时
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_mutex_pend(OS_MUTEX *mutex, int timeout);
/* ----------------------------------------------------------------------------*/
/**
* @brief 获取互斥量(非堵塞)
* @param[in] mutex: 互斥量
* @return 0: 成功
* @return OS_TIMEOUT: 获取失败
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_mutex_accept(OS_MUTEX *mutex);
/* ----------------------------------------------------------------------------*/
/**
* @brief 释放互斥量
* @param[in] mutex: 互斥量
* @return 0: 成功
* @return -EFAULT: 失败
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_mutex_post(OS_MUTEX *mutex);
/* ----------------------------------------------------------------------------*/
/**
* @brief 删除互斥量
* @param[in] mutex: 互斥量
* @param[in] force: 是否强制删除
* @return 0: 成功
* @return -1: 失败
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_mutex_del(OS_MUTEX *mutex, int force);
/* ----------------------------------------------------------------------------*/
/**
* @brief 检查互斥量是否合法
* @param[in] mutex: 互斥量
* @return 1: 有效
* @return 0: 非法
*/
/* ----------------------------------------------------------------------------*/
int os_mutex_valid(OS_MUTEX *mutex);
/* ----------------------------------------------------------------------------*/
/**
* @brief 创建消息队列,内存采用动态分配
* @param[in] pevent: 消息队列
* @param[in] size: 消息队列大小,以word为单位
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_q_create(OS_QUEUE *pevent, QS size);
/* ----------------------------------------------------------------------------*/
/**
* @brief 创建消息队列,内存采用静态分配
* @param[in] pevent: 消息队列
* @param[in] storage: 队列消息内存块
* @param[in] size: 消息队列大小,以word为单位
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_q_create_static(OS_QUEUE *pevent, void *storage, QS size);
/* ----------------------------------------------------------------------------*/
/**
* @brief 删除消息队列
* @param[in] pevent: 消息队列
* @param[in] force: 是否强制删除
* @return 0: 成功
* @return -1: 失败
* @note 与os_q_create_static搭配使用
*/
/* ----------------------------------------------------------------------------*/
int os_q_del_static(OS_QUEUE *pevent, u8 force);
/* ----------------------------------------------------------------------------*/
/**
* @brief 删除消息队列
* @param[in] pevent: 消息队列
* @param[in] force: 是否强制删除
* @return 0: 成功
* @return -1: 失败
* @note 与os_q_create搭配使用
*/
/* ----------------------------------------------------------------------------*/
int os_q_del(OS_QUEUE *pevent, u8 force);
/* ----------------------------------------------------------------------------*/
/**
* @brief 重置消息队列
* @param[in] pevent: 消息队列
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_q_flush(OS_QUEUE *pevent);
/* ----------------------------------------------------------------------------*/
/**
* @brief 接收队列消息
* @param[in] pevent: 消息队列
* @param[in] timeout: 等待超时(时钟节拍),取0时无限等待,非堵塞请使用os_q_accept
* @param[out] msg: 接收到的消息
* @return 0: 成功
* @return OS_TIMEOUT: 等待超时
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_q_pend(OS_QUEUE *pevent, int timeout, void *msg);
/* ----------------------------------------------------------------------------*/
/**
* @brief 获取队列消息(非堵塞)
* @param[in] pevent: 消息队列
* @param[out] msg: 接收到的消息
* @return 0: 成功
* @return OS_TIMEOUT: 获取失败
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_q_accept(OS_QUEUE *pevent, void *msg);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送队列消息
* @param[in] pevent: 消息队列
* @param[in] msg: 要发送的消息
* @return 0: 成功
* @return OS_Q_FULL: 消息队列已满
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
int os_q_post(OS_QUEUE *pevent, void *msg);
/* ----------------------------------------------------------------------------*/
/**
* @brief 查看队列消息,不取出来
* @param[in] pevent: 消息队列
* @param[out] msg: 接收到的消息
* @param[in] timeout: 等待超时(单位是毫秒),取-1时无限等待,取0时不等待
* @return 0: 成功
* @return OS_TIMEOUT: 等待超时
*/
/* ----------------------------------------------------------------------------*/
int os_q_peek(OS_QUEUE *pevent, void *msg, int timeout_ms);
/* ----------------------------------------------------------------------------*/
/**
* @brief 接收队列消息
* @param[in] pevent: 消息队列
* @param[out] msg: 接收到的消息
* @param[in] timeout: 等待超时(单位是毫秒),取-1时无限等待,取0时不等待
* @return 0: 成功
* @return OS_TIMEOUT: 等待超时
*/
/* ----------------------------------------------------------------------------*/
int os_q_recv(OS_QUEUE *pevent, void *msg, int timeout_ms);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送队列消息到队列最后面
* @param[in] pevent: 消息队列
* @param[in] msg: 要发送的消息
* @param[in] timeout: 等待超时(单位是毫秒),取-1时无限等待,取0时不等待
* @return 0: 成功
* @return OS_Q_FULL: 消息队列已满
*/
/* ----------------------------------------------------------------------------*/
int os_q_post_to_back(OS_QUEUE *pevent, void *msg, int timeout_ms);
/* ----------------------------------------------------------------------------*/
/**
* @brief 发送队列消息到队列最前面
* @param[in] pevent: 消息队列
* @param[in] msg: 要发送的消息
* @param[in] timeout: 等待超时(单位是毫秒),取-1时无限等待,取0时不等待
* @return 0: 成功
* @return OS_Q_FULL: 消息队列已满
*/
/* ----------------------------------------------------------------------------*/
int os_q_post_to_front(OS_QUEUE *pevent, void *msg, int timeout_ms);
/* ----------------------------------------------------------------------------*/
/**
* @brief 查询消息列是否空闲
* @param[in] pevent: 消息队列
* @return 1: 没有其他线程在等待此消息队列
* @return 0: 其他线程在等待此消息队列
*/
/* ----------------------------------------------------------------------------*/
int os_q_query(OS_QUEUE *pevent);
/* ----------------------------------------------------------------------------*/
/**
* @brief 检查消息队列是否合法
* @param[in] pevent: 互斥量
* @return 1: 有效
* @return 0: 非法
*/
/* ----------------------------------------------------------------------------*/
int os_q_valid(OS_QUEUE *pevent);
/* ----------------------------------------------------------------------------*/
/**
* @brief 检查消息队列是否已满
* @param[in] pevent: 互斥量
* @return 1: 消息队列已满
* @return 0: 消息队列未满
*/
/* ----------------------------------------------------------------------------*/
int os_q_is_full(OS_QUEUE *pevent);
/* ----------------------------------------------------------------------------*/
/**
* @brief 创建事件组
* @param[in] event: 保存创建成功后的事件组指针
* @param[in] flags: 事件标志
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_eventgroup_create(OS_EVENT_GRP **event, u32 flags);
/* ----------------------------------------------------------------------------*/
/**
* @brief 删除事件组
* @param[in] event: 事件组指针
* @param[in] force: 是否强制删除
* @return 0: 成功
* @return -1: 失败
*/
/* ----------------------------------------------------------------------------*/
int os_eventgroup_delete(OS_EVENT_GRP *event, u8 force);
/* ----------------------------------------------------------------------------*/
/**
* @brief 事件组置位
* @param[in] event: 事件组指针
* @param[in] bits: 事件标志
* @return 当前事件标志位
*/
/* ----------------------------------------------------------------------------*/
int os_eventgroup_set_bits(OS_EVENT_GRP *event, int bits);
/* ----------------------------------------------------------------------------*/
/**
* @brief 清除事件组标志位
* @param[in] event: 事件组指针
* @param[in] bits: 事件标志
* @return 当前事件标志位
*/
/* ----------------------------------------------------------------------------*/
int os_eventgroup_clear_bits(OS_EVENT_GRP *event, int bits);
/* ----------------------------------------------------------------------------*/
/**
* @brief 等待事件组标志位
* @param[in] event: 事件组指针
* @param[in] bits: 等待的事件标志
* @param[in] isClearOnExit: 是否清掉等待成功的标志
* @param[in] isWaitForAllBits: 是否等待指定的所有标志位
* @param[in] waitms: 等待延时,毫秒
* @return 当前事件标志位
*/
/* ----------------------------------------------------------------------------*/
int os_eventgroup_wait_bits(OS_EVENT_GRP *event, int bits, int isClearOnExit, int isWaitForAllBits, int waitms);
/* ----------------------------------------------------------------------------*/
/**
* @brief 当前操作系统的任务总数
@return 任务个数
*/
/* ----------------------------------------------------------------------------*/
int os_tasks_num_query(void);
/* ----------------------------------------------------------------------------*/
/**
* @brief 挂起所有任务,某些任务除外
* @param[in] Otherwise: 不需要挂起的任务名(数组实现多个)
* @param[in] array_num: 除外的任务个数
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
void os_task_suspend_all(const char (*Otherwise)[64], int array_num);
/* ----------------------------------------------------------------------------*/
/**
* @brief 恢复所有任务
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
void os_task_resume_all(void);
/* ----------------------------------------------------------------------------*/
/**
* @brief 恢复任务
* @param[in] name: 需要恢复的任务名
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
void os_task_resume(const char *name);
/* ----------------------------------------------------------------------------*/
/**
* @brief 挂起任务
* @param[in] name: 需要挂起的任务名
* @note 不可在中断函数或者临界区调用
*/
/* ----------------------------------------------------------------------------*/
void os_task_suspend(const char *name);
/**
* @brief enum kill_mode
* used by thread_kill
*/
enum kill_mode {
KILL_WAIT, /*!< WAIT */
KILL_REQ, /*!< REQUEST */
KILL_FORCE, /*!< FORCE ON */
};
/*----------------------------------------------------------------------------*/
/**@brief 创建thread_fork_kill线程
@return 0: 成功
@return other: enum OS_ERROR_CODES
@note 该线程用来Kill掉其他线程,其任务优先级最高
*/
/*----------------------------------------------------------------------------*/
int thread_fork_init(void);
/*----------------------------------------------------------------------------*/
/**@brief 创建一个线程(扩展接口)
@param[in] condition: 线程开始运行的前提条件(条件回调返回非0值开始运行)
@param[in] thread_name: 标识此线程的字符串
@param[in] prio: 优先级
@param[in] stk_size: 堆栈空间的大小(以四个字节为一个单位)
@param[in] q_size: 消息队列空间的大小(以四个字节为一个单位)
@param[out] pid: 保存新线程的pid
@param[in] func: 入口功能函数
@param[in] parm: 入口函数的传入参数
@param[in] thread_complete_cb: 线程结束回调
@param[in] thread_complete_cb_parm: 线程结束回调的传入参数
@return 0: 成功
@return -1: 参数错误
@return other: enum OS_ERROR_CODES
@note 由于系统靠thread_name区分不同任务,所以请保证thread_name的唯一
@note replace pthread_create function
*/
/*----------------------------------------------------------------------------*/
int thread_rpc(int (*condition)(void), const char *thread_name, int prio, int stk_size, u32 q_size, int *pid, void (*func)(void *), void *parm, void (*thread_complete_cb)(void *), void *thread_complete_cb_parm);
/*----------------------------------------------------------------------------*/
/**@brief 创建一个线程
@param[in] thread_name: 标识此线程的字符串
@param[in] prio: 优先级
@param[in] stk_size: 堆栈空间的大小(以四个字节为一个单位)
@param[in] q_size: 消息队列空间的大小(以四个字节为一个单位)
@param[out] pid: 保存新线程的pid
@param[in] func: 入口功能函数
@param[in] parm: 入口函数的传入参数
@return 0: 成功
@return -1: 参数错误
@return other: enum OS_ERROR_CODES
@note 由于系统靠thread_name区分不同任务,所以请保证thread_name的唯一
@note replace pthread_create function
*/
/*----------------------------------------------------------------------------*/
int thread_fork(const char *thread_name, int prio, int stk_size, u32 q_size, int *pid, void (*func)(void *), void *parm);
/*----------------------------------------------------------------------------*/
/**@brief 杀死一个线程
@param[in] pid: 指向需要杀死的pid号的指针
@param[in] mode: enum kill_mode
@return 0: 成功
@return -1: 参数错误
@return other: enum OS_ERROR_CODES
@note 推荐使用KILL_WAIT
@note replace pthread_kill function
*/
/*----------------------------------------------------------------------------*/
void thread_kill(volatile int *pid, enum kill_mode mode);
/*----------------------------------------------------------------------------*/
/**@brief 获取正在运行的线程是否有其他线程请求自己杀死
@return 0: 没有杀死请求
@return 1: 有杀死请求
@note
*/
/*----------------------------------------------------------------------------*/
int thread_kill_req(void);
/*----------------------------------------------------------------------------*/
/**@brief 获取指向当前线程pid的指针
@return 指向当前线程pid的指针
@note
*/
/*----------------------------------------------------------------------------*/
int *get_cur_thread_pid(void);
/*----------------------------------------------------------------------------*/
/**@brief 微秒级延时函数
@param[in] t: us
@note TODO
*/
/*----------------------------------------------------------------------------*/
void udelay(unsigned int t);
/*----------------------------------------------------------------------------*/
/**@brief 毫秒级延时函数
@param[in] ms: ms
@note 不可在中断函数或者临界区调用
*/
/*----------------------------------------------------------------------------*/
void mdelay(unsigned int ms);
/*----------------------------------------------------------------------------*/
/**@brief 毫秒级延时函数
@param[in] ms: ms
@note 不可在中断函数或者临界区调用
*/
/*----------------------------------------------------------------------------*/
void msleep(unsigned int ms);
/*----------------------------------------------------------------------------*/
/**@brief 初始化信号量
@param[out] sem: 保存新建信号量的信息
@param[in] cnt: 计数器的初始值
@return enum OS_ERROR_CODES
@note
*/
/*----------------------------------------------------------------------------*/
int sema_init(int *sem, int cnt);
/*----------------------------------------------------------------------------*/
/**@brief 等待信号量
@param[in] sem: 指向需要等待的信号量的指针
@param[in] timeout: 等待超时(时钟节拍),取0时无限等待,取-1时不等待
@return enum OS_ERROR_CODES
@note 不可在中断函数或者临界区调用
*/
/*----------------------------------------------------------------------------*/
int sem_pend(int *sem, unsigned int timeout);
/*----------------------------------------------------------------------------*/
/**@brief 发送信号量
@param[in] sem: 指向需要发送的信号量的指针
@return enum OS_ERROR_CODES
*/
/*----------------------------------------------------------------------------*/
int sema_post(int *sem);
/*----------------------------------------------------------------------------*/
/**@brief 设置信号量的计数器的值
@param[in] sem: 指向需要设置的信号量的指针
@param[in] init_val: 计数器的设置值
@return enum OS_ERROR_CODES
*/
/*----------------------------------------------------------------------------*/
int sem_set(int *sem, int init_val);
/*----------------------------------------------------------------------------*/
/**@brief 销毁信号量
@param[in] sem: 指向需要销毁的信号量的指针
@return enum OS_ERROR_CODES
@note 不可在中断函数或者临界区调用
*/
/*----------------------------------------------------------------------------*/
int sem_del(int *sem);
/*----------------------------------------------------------------------------*/
/**@brief 查询信号量计数值
@param[in] sem: 指向需要查询的信号量的指针
@return enum OS_ERROR_CODES
*/
/*----------------------------------------------------------------------------*/
int sem_query(int *sem);
/*----------------------------------------------------------------------------*/
/**@brief 检测信号量是否有效
@param[in] sem: 指向需要查询的信号量的指针
@return 1: 有效
@return 0: 非法
*/
int sem_valid(int *sem);
#ifdef __cplusplus
}
#endif
#endif