928 lines
34 KiB
C
928 lines
34 KiB
C
#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
|