tobudos-kernel/osal/cosit/include/cosit.h

1612 lines
48 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.

/*
* Copyright (C) XXXX
*
* SPDX-License-Identifier: XXXX
*
* Version: 1.1.1
*
* Change log:
*
* Date Author Note
* 2022-06-15 all first version
* 2022-07-12 Mculover666 Add cos_sem_release_all and cos_tick_get API.
* 2022-07-26 Mculover666 Fix the type error of sem.
*/
#ifndef _COSIT_H
#define _COSIT_H
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @addtogroup cos_status
* COSIT标准状态码
* @{
*/
/**
* 状态码格式说明:
* 0:表示成功错误码均为负值错误码用16位不算符号位的16进制表示。
* 其中高1~4位标识模块 其余为错误码(后续也可扩展为其他标识)。
* 高1~4 模块名称
* 0 通用错误
* 1 任务管理
* 2 内存管理
* 3 软件定时器
* 4 互斥量
* 5 信号量
* 7 事件
* 8 消息队列
* 9 邮箱
* A 工作队列
*/
#define COS_OK 0 /**< 成功 */
/* 通用错误码 */
#define COS_ERR (-0x0001) /**< 未知错误 */
#define COS_ERR_PARAM (-0x0002) /**< 非法参数 */
#define COS_ERR_NOMEM (-0x0003) /**< 内存不足 */
#define COS_ERR_TIMEOUT (-0x0003) /**< 超时 */
#define COS_ERR_ISR (-0x0004) /**< 不允许在中断上下文中使用 */
#define COS_ERR_PERM (-0x0005) /**< 权限不允许 */
/* 互斥量特有错误码 */
#define COS_ERR_MUTEX_NOT_OWNER (-0x4001) /**< 不是互斥锁的所有者 */
#define COS_ERR_MUTEX_NESTING (-0x4002) /**< 已经拥有互斥锁,导致嵌套但并未指定嵌套选项 */
/* 邮箱特有错误码 */
#define COS_ERR_MB_FULL (-0x9001)
/**
* @}
*/
/**
* 表示永久阻塞等待,直到获得系统资源(如互斥量,信号量,事件,队列消息等)才返回。
*/
#define COS_WAIT_FOREVER ((cos_tick_t)-1)
/**
* 表示非阻塞等待,当不能获得系统资源(如互斥量,信号量,事件,队列消息等)时不会等待,而是立即返回。
*/
#define COS_NO_WAIT (0x0U)
/**
* @addtogroup cos_timer
* 提供软件定时器相关的标准定义
* @{
*/
#define COS_TIMER_OPTION_ACTIVATE (0x1u << 0) /**< 创建时激活选项 */
#define COS_TIMER_OPTION_DEACTIVATE (0x1u << 1) /**< 创建时不激活选项 */
/**
* @}
*/
/**
* @addtogroup cos_mutex
* 提供互斥锁相关的标准定义
* @{
*/
#define COS_MUTEX_NEST (0x1u << 0) /**< 开启嵌套锁支持 */
/**
* @}
*/
/**
* @addtogroup cos_sem
* 提供信号量相关的标准定义
* @{
*/
/**
* 用来指定创建一个新的信号量时的最大值,表示信号量无最大值。
*/
#define COS_SEM_NO_MAX ((uint32_t)-1)
/**
* @}
*/
/**
* @addtogroup cos_event
* 提供事件相关的标准定义
* @{
*/
/**
* 用来指定等待事件和释放事件时的选项。
*/
#define COS_EVENT_WAIT_ANY (0x1u << 0) /**< 等待任意一个事件 */
#define COS_EVENT_WAIT_ALL (0x1u << 1) /**< 等待所有事件 */
#define COS_EVENT_WAIT_CLR (0x1u << 2) /**< 等待到事件后清除该事件 */
#define COS_EVENT_RELEASE_KEEP (0x1u << 3) /**< 释放事件后是否保留该事件 */
/**
* @}
*/
typedef int32_t cos_status_t; /**< 状态码类型 */
typedef uint64_t cos_tick_t; /**< 系统tick类型 */
/**
* @addtogroup cos_mb
* 提供邮箱相关的标准定义
* @{
*/
typedef void * cos_mb_t; /**< 邮箱句柄 */
#define COS_IPC_FLAG_FIFO 0
#define COS_IPC_FLAG_PRIO 1
/**
* @}
*/
/**
* @addtogroup cos_mq
* 提供消息队列相关的标准定义
* @{
*/
typedef void * cos_mq_t; /**< 邮箱句柄 */
/**
* @}
*/
/**
* @addtogroup cos_wq
* 提供工作队列相关的标准定义
* @{
*/
typedef void * cos_wq_t; /**< 工作队列句柄 */
typedef void * cos_work_t; /**< 工作项句柄 */
typedef void (*cos_work_handle_t) (void *); /**< 任务入口函数的原型。*/
/**
* @}
*/
/**
* 用来指定创建一个新任务时任务属性的options参数表示任务创建后处于挂起状态不会被调度执行
* 直到被恢复。如果没有指定此选项(默认),任务创建后即处于就绪状态,等待调度运行。
*/
#define COS_TASK_OPTION_NORUN (0x1U << 0)
/**
* 最大任务优先级。任务优先级从0 ~ COS_TASK_PRIORITY_MAX优先级别递减即COS_TASK_PRIORITY_MAX优先级最低。
* 如内核在实现时,若其优先级级别小于`COS_TASK_PRIORITY_MAX`, 当应用传入的优先级超过内核实现的优先级时,
* 内核应调整为应用可设置的最低优先级。如果应用不关心任务的优先级,则可以使用`cos_task_attr_init`初始化为
* 默认优先级即可,不同内核在实现时,其默认优先级可以不同。
*/
#define COS_TASK_PRIORITY_MAX 100
/**
* 完全公平调度策略(非实时)。采用完全公平调度算法,对任务进行调度。适用于任务比较多的场景,
* 开发者不需要设计每个任务的合理优先级,由调度算法以完全公平的策略调度任务,但开发者可以微调任务的权重,
* 以相对增加或减少任务的运行时间片。
*/
#define COS_TASK_SCHED_CFS 0x0
/**
* 实时FIFO调度策略。当同优先级的多个任务同时就绪时按先进先出的顺序依次执行。
*/
#define COS_TASK_SCHED_FIFO 0x01
/**
* 实时Round-Robin调度策略. 当同优先级的多个任务同时就绪时,多个任务按时间片轮流执行。
*/
#define COS_TASK_SCHED_RR 0x02
/**
* @}
*/
/**
* @addtogroup cos_task
* 提供任务管理相关的标准定义
* @{
*/
/**
* 任务的句柄,代表一个任务,调用任务创建函数后返回。可以通过句柄对任务进行操作,如挂起,删除等。
*/
typedef void * cos_task_t;
typedef void (*cos_task_entry_t) (void *); /**< 任务入口函数的原型。*/
typedef struct cos_task_attr {
const char *name; /**< 任务名称(可以为NULL) */
size_t stack_size; /**< 任务栈的大小单位Byte */
uint8_t priority; /**< 任务的优先级 */
cos_tick_t tick; /**< 任务使用RR调度策略时占用的系统tick数 */
uint8_t sched_policy; /**< 调度策略 @ref COS_TASK_SCHED_RR / @ref COS_TASK_SCHED_FIFO / @ref COS_TASK_SCHED_CFS */
uint8_t cpu_bind; /**< 绑定的CPU号适用于多核系统 */
uint8_t inited; /**< 标识该结构是否被初始化 */
uint32_t options; /**< 任务创建时的选项 */
void *reserved; /**< 预留字段(可扩展)*/
} cos_task_attr_t;
/**
* @}
*/
/**
* @addtogroup cos_timer
* 提供软件定时器相关的标准定义
* @{
*/
typedef void * cos_timer_t; /**< 软件定时器句柄 */
typedef void (*cos_timer_cb_t)(void *arg); /**< 软件定时器的回调函数类型 */
/**
* @}
*/
/**
* @addtogroup cos_mutex
* 提供互斥锁相关的标准定义
* @{
*/
typedef void * cos_mutex_t; /**< 互斥锁句柄 */
/**
* @}
*/
/**
* @addtogroup cos_sem
* 提供信号量相关的标准定义
* @{
*/
typedef void * cos_sem_t; /**< 信号量句柄 */
/**
* @}
*/
/**
* @addtogroup cos_event
* 提供事件相关的标准定义
* @{
*/
typedef void * cos_event_t; /**< 事件句柄 */
typedef uint32_t cos_event_flag_t; /**< 事件标志 */
/**
* @}
*/
/**
* @brief 毫秒数转为系统tick数
*
* 把毫秒数转成系统tick数。在物联网操作系统中系统tick一般用于内核调度的基本单位
* 其频率在系统中是可以配置的。根据系统tick一般只能达到毫秒精度。
*
* @param[in] ms 毫秒数
*
* @note 可以在中断上下文中使用。
*
* @return 总是成功返回转换得到的系统tick数
*/
cos_tick_t cos_ms_to_tick(uint64_t ms);
/**
* @brief 系统tick数转为毫秒数
*
* 把系统tick数转成毫秒数。在物联网操作系统中系统tick一般用于内核调度的基本单位
* 其频率在系统中是可以配置的。根据系统tick一般只能达到毫秒精度。
*
* @param[in] tick 系统tick数
*
* @note 可以在中断上下文中使用。
*
* @return 总是成功,返回转换得到的毫秒数
*/
uint64_t cos_tick_to_ms(cos_tick_t tick);
/**
* @brief 获取当前系统tick数
*
* @note 可以在中断上下文中使用。
*
* @return 总是成功返回得到的当前系统tick数
*/
cos_tick_t cos_tick_get(void);
/**
* @addtogroup cos_task
* 提供任务管理相关的标准定义
* @{
*/
/**
* @brief 初始化一个任务属性
*
* 初始化一个任务属性,为任务属性设置默认值。
*
* @param[in] attr 任务属性的句柄
*
* @note 可以在中断上下文中使用。
* @note 此函数与创建任务同时使用。
* @note 每个内核实现的默认值可能不同。
*
* @return 无
*/
void cos_task_attr_init(cos_task_attr_t *attr);
/**
* @brief 创建新任务
*
* 创建一个新任务并初始化,新任务的句柄由参数 @c task 返回,通过任务句柄 @c task 对新任务进行后续的操作。
* 新任务成功创建后,会进入就绪队列等待调度执行。如果选项 @ref COS_TASK_OPTION_NORUN 被指定,
* 则任务创建后处于挂起状态,不会被调度执行,需要应用恢复该任务后,才能进入就绪队列等待调度执行。
* 当被调度到时从入口函数fn开始运行。从任务入口函数返回代表此任务退出系统会清理该任务的资源。
* 该函数在创建时内部会动态分配需要的内存,如果不想使用动态内存,请使用 @ref cos_task_init 。
*
* @param[out] task 新任务的句柄,后续对此任务的操作通过该句柄进行
* @param[in] fn 新任务的入口函数,新任务从此函数开始运行
* @param[in] arg 新任务的入口函数的参数
* @param[in] attr 新任务的属性
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*
* @see cos_task_init
*/
cos_status_t cos_task_create(cos_task_t *task, cos_task_entry_t fn, void *arg, cos_task_attr_t *attr);
/**
* @brief 删除任务
*
* 主动删除一个任务回收其资源。
*
* @param[in] task 任务的句柄
*
* @note 不可以在中断上下文中使用。
* @note 不能删除idle任务。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_delete(cos_task_t task);
/**
* @brief 初始化一个任务
*
* 初始化一个任务。与创建任务类似,区别是调用者为新任务的控制块分配内存,其大小为任务控制块的数据结构大小,
* 不同内核其任务控制块大小不同。通过参数 @c task 指定任务的控制块地址。 调用者还需要为新任务分配栈内存空间,
* 并通过参数 @c stack_buf 指定栈内存空间地址,栈空间大小通过 @c attr 中的stack_size传递。
*
* @param[in] task 新任务的句柄,后续对此任务的操作通过该句柄进行
* @param[in] fn 新任务的入口函数,新任务从此函数开始运行
* @param[in] arg 新任务的入口函数的参数
* @param[in] attr 新任务的属性
* @param[in] stack_buf 调用者指定的任务栈空间
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*
* @see cos_task_init
*/
cos_status_t cos_task_init(cos_task_t task, cos_task_entry_t fn, void *arg,
cos_task_attr_t *attr, void *stack_buf);
/**
* @brief 反初始化一个任务
*
* 反初始化一个任务。与 @ref cos_task_init 配套使用,销毁其初始化过的任务,把此任务置为销毁状态。
* 如果该任务销毁前处于就绪状态,会把该任务从系统就绪队列中移除。根据互斥锁的类型(鲁棒性互斥锁),
* 还会释放其拥有的互斥锁,导致唤醒等待该锁的任务。
* 但不会释放任务控制块task和任务栈的内存空间这部分内存应由调用者负责释放。
*
* @param[in] task 新任务的句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*
* @see cos_task_init
*/
cos_status_t cos_task_deinit(cos_task_t task);
/**
* @brief 退出任务
*
* 主动退出当前任务,使系统回收该任务的资源。其作用与从该任务的入口函数返回相同。
* 参数 @c status 作为后续扩展使用,目前并不支持获取一个任务退出时的状态码。
*
* @param[in] status 任务退出状态码
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
void cos_task_exit(int32_t status);
/**
* @brief 挂起任务
*
* 挂起一个任务暂停该任务的执行。可以挂起自身或其他任务但不允许挂起系统idle任务。
* 当挂起系统其他内置任务时请谨慎,可能会引起系统错误。
*
* @param[in] task 任务的句柄
*
* @note 可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_suspend(cos_task_t task);
/**
* @brief 恢复任务
*
* 恢复一个任务,使其处于就绪状态,等待调度执行。
*
* @param[in] task 任务的句柄
*
* @note 可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_resume(cos_task_t task);
/**
* @brief 当前任务让出CPU
*
* 使当前正在运行的任务让出CPU并把当前任务置于其静态优先级的就绪队列的末尾。
* 重新调度其他任务得到CPU运行。
*
* @param 无
*
* @note 可以在中断上下文中使用。
* @note 根据调度策略,如果该任务是其静态优先级的就绪队列中唯一任务,它会被再次调度到,继续运行。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_yield(void);
/**
* @brief 获取当前任务自身的句柄
*
* 返回当前任务自身的句柄,用于对自身任务的操作,如挂起和恢复等。
*
* @param 无
*
* @note 可以在中断上下文中使用。
*
* @return 函数总是执行成功并返回当前任务自身的句柄。
*/
cos_task_t cos_task_self(void);
/**
* @brief 获取一个任务的名称
*
* 返回一个任务的名称,调用者应该为存放任务名称分配足够的内存,
* 并把内存首地址和大小通过参数 @c buf 和 @c buf_size 传入。
*
* @param[in] task 任务的句柄
* @param[out] buf 存放任务名称的内存
* @param[in] buf_size 存放任务名称的内存大小
*
* @note 可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_get_name(cos_task_t task, char *buf, size_t buf_size);
/**
* @brief 根据名称查找任务
*
* 根据任务名称 @c name 查找任务的句柄。
*
* @param[in] name 任务的名称
*
* @note 可以在中断上下文中使用。
* @note 当系统中存在多个具有相同名称的任务时,函数会执行成功,但返回哪一个任务
* 的句柄是不确定的,不同的内核实现会有所不同。
*
* @return 成功则返回任务的句柄, 失败则返回 NULL
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_task_t cos_task_find(const char *name);
/**
* @brief 使当前任务睡眠一段时间
*
* 使当前任务睡眠 @c tick 个系统tick的时间等时间超期或被唤醒后再次进入就绪状态等待调度执行。
* 如果 @c tick 为0则等同于 @ref cos_task_yield 。如果 @c tick 为 @ref COS_WAIT_FOREVER , 则等同于 @ref cos_task_suspend。
*
* @param[in] tick 系统tick个数
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败,>0: 提前被唤醒时剩余的tick数
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_sleep(cos_tick_t tick);
/**
* @brief 唤醒任务
*
* 唤醒一个任务。可以用来提前唤醒一个睡眠的任务。
*
* @param[in] task 任务的句柄
*
* @note 可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_wakeup(cos_task_t task);
/**
* @brief 获取一个任务的优先级
*
* 获取一个任务的优先级,可以是自身或其他任务。获取的是任务此时的动态优先级,
* 不一定与其创建时指定的静态优先级相同,如任务此时有优先级继承发生。
*
* @param[in] task 任务的句柄
* @param[out] priority 获取到的任务动态优先级
*
* @note 可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_get_priority(cos_task_t task, uint8_t *priority);
/**
* @brief 设置一个任务的优先级
*
* 设置一个任务的优先级,可以是自身或其他任务。改变的是任务的静态优先级。
*
* @param[in] task 任务的句柄
* @param[in] priority 获取到的任务动态优先级
*
* @note 可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_set_priority(cos_task_t task, uint8_t priority);
/**
* @brief 获取任务的剩余时间片
*
* 获取一个使用RR调度策略的任务在本次轮转中剩余时间片。
*
* @param[in] task 任务的句柄
* @param[out] time_slice 获取到的任务的剩余时间片
*
* @note 可以在中断上下文中使用。
* @note 此函数仅适用于采用RR调度策略的任务 对于其他任务剩余时间片返回0.
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_get_time_slice(cos_task_t task, cos_tick_t *time_slice);
/**
* @brief 获取任务的剩余时间片
*
* 设置一个使用RR调度策略的任务在一次轮转中所分配的时间片。
*
* @param[in] task 任务的句柄
* @param[in] time_slice 获取到的任务的剩余时间片
*
* @note 可以在中断上下文中使用。
* @note 此函数仅适用于采用RR调度策略的任务对于其他任务返回错误。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_task_set_time_slice(cos_task_t task, cos_tick_t time_slice);
/**
* @}
*/
/**
* @addtogroup cos_timer
* 提供软件定时器相关的标准定义
* @{
*/
/**
* @brief 创建软件定时器
*
* 创建一个软件定时器,当定时器超期时系统会自动执行回调函数 @c cb 并传入参数 @c arg 。
* 该函数在创建时内部会动态分配需要的内存,如果不想使用动态内存,请使用 @ref cos_timer_init 。
*
* @param[out] timer 定时器句柄
* @param[in] name 定时器名称
* @param[in] cb 定时器的回调函数
* @param[in] arg 定时器的回调函数的参数
* @param[in] initial 定时器的初始定时时间即从定时器启动到第一次触发的时间间隔单位tick个数
* @param[in] period 定时器的周期定时时间即周期性触发的时间间隔单位tick个数。0代表单次触发
* @param[in] options 定时器的选项,如创建时激活 @ref COS_TIMER_OPTION_ACTIVATE
* 或者不激活 @ref COS_TIMER_OPTION_DEACTIVATE
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR 定时器未知错误
*
* @see cos_timer_init
*/
cos_status_t cos_timer_create(cos_timer_t *timer, const char *name, cos_timer_cb_t cb,
void *arg, cos_tick_t initial, cos_tick_t period, uint32_t options);
/**
* @brief 删除软件定时器
*
* 删除一个软件定时器。系统会先停止该定时器,然后删除回收其资源。
*
* @param[in] timer 定时器句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 定时器未知错误
*/
cos_status_t cos_timer_delete(cos_timer_t timer);
/**
* @brief 初始化软件定时器
*
* 初始化一个软件定时器,当定时器超期时系统会自动执行回调函数 @c cb 并传入参数 @c arg 。
* 与创建一个软件定时器类似,区别是定时器的控制块内存时由调用者传入的,一般用于需要静态内存的场景。
*
* @param[in] timer 定时器句柄
* @param[in] name 定时器名称
* @param[in] cb 定时器的回调函数
* @param[in] arg 定时器的回调函数的参数
* @param[in] initial 定时器的初始定时时间即从定时器启动到第一次触发的时间间隔单位tick个数
* @param[in] period 定时器的周期定时时间即周期性触发的时间间隔单位tick个数。0代表单次触发
* @param[in] options 定时器的选项,如创建时激活 @ref COS_TIMER_OPTION_ACTIVATE
* 或者不激活 @ref COS_TIMER_OPTION_DEACTIVATE
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR 定时器未知错误
*
* @see cos_timer_create
*/
cos_status_t cos_timer_init(cos_timer_t timer, const char *name, cos_timer_cb_t cb,
void *arg, cos_tick_t initial, cos_tick_t period, uint32_t options);
/**
* @brief 反初始化软件定时器
*
* 反初始化一个定时器。系统会先停止该定时器,从系统定时器列表中移除。但不会释放 @c timer 的内存空间,应由调用者释放。
*
* @param[in] timer 定时器句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 定时器未知错误
*/
cos_status_t cos_timer_deinit(cos_timer_t timer);
/**
* @brief 启动软件定时器
*
* 启动一个定时器,系统开始计时,直到定时器超期时执行应用设置的回调函数。
*
* @param[in] timer 定时器句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 定时器未知错误
*/
cos_status_t cos_timer_start(cos_timer_t timer);
/**
* @brief 停止软件定时器
*
* 停止一个定时器,系统停止为该定时器计时,但不会删除它。
*
* @param[in] timer 定时器句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 定时器未知错误
*/
cos_status_t cos_timer_stop(cos_timer_t timer);
/**
* @brief 修改软件定时器
*
* 修改一个定时器。一般用于修改其周期性定时时间,如果该定时器创建后还没有启动,也可以修改其初始定时时间。
*
* @param[in] timer 定时器句柄
* @param[in] initial 定时器的初始定时时间即从启动到第一次触发的时间间隔单位tick个数
* @param[in] period 定时器的周期定时时间即周期性触发的时间间隔单位tick个数。0代表单次触发
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 定时器未知错误
*/
cos_status_t cos_timer_change(cos_timer_t timer, cos_tick_t initial, cos_tick_t period);
/**
* @brief 获取定时器的时间
*
* 返回一个定时器的时间信息包括离下次触发还剩余的时间系统tick和周期触发的时间间隔系统tick
*
* @param[in] timer 定时器句柄
* @param[out] remaining 离下次触发还剩余的时间单位tick个数
* @param[out] period 周期触发的时间间隔单位tick个数。0代表单次触发
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 定时器未知错误
*/
cos_status_t cos_timer_get_time(cos_timer_t timer, cos_tick_t *remaining, cos_tick_t *period);
/**
* @}
*/
/**
* @addtogroup cos_memory
* 提供内存管理相关的标准定义
* @{
*/
/**
* @brief 申请一块连续的内存
*
* 从系统堆中申请一块 @c size 大小连续的内存成功返回申请到内存的首地址失败返回NULL。
*
* @param[in] size 想申请内存的大小单位Byte
*
* @note 不可以在中断上下文中使用。
*
* @return 成功返回申请到内存的首地址失败则返回NULL。
*/
void *cos_malloc(size_t size);
/**
* @brief 改变一块内存的大小
*
* 改变一块内存 @c ptr 的大小, @c ptr 应该是之前动态申请内存的返回值。新的内存大小可能扩大或缩小,
* 扩大时原有内存大小的内容保持不变且新增加的内存没有初始化。缩小时,被保留的内存的内容保持不变。
* 如果参数 @c ptr 为NULL不论new_size为多少则等于 @c cos_malloc(new_size)
* 如果参数 @c new_size 为0则等于 @c cos_free(prt) 。如果该函数返回的新的内存首地址与原有地址不同,
* 则原有内存被自动释放。
*
* @param[in] ptr 之前动态申请到的内存首地址
* @param[in] new_size 内存新大小
*
* @note 不可以在中断上下文中使用。
*
* @return 成功返回新申请到内存的首地址失败则返回NULL。
*/
void *cos_realloc(void *ptr, size_t new_size);
/**
* @brief 申请多块连续的内存
*
* 从系统堆中申请 @c count 个长度为 @c size 的连续的内存最终申请到内存大小为count * size个字节。
*
* @param[in] count 申请内存块的个数
* @param[in] size 每个内存块的大小
*
* @note 不可以在中断上下文中使用。
*
* @return 成功返回申请到内存的首地址失败则返回NULL。
*/
void *cos_calloc(size_t count, size_t size);
/**
* @brief 申请内存并按要求地址对齐
*
* 从系统堆内存中申请 @c size 字节的连续内存,并按 @c alignment 字节对齐,
* 申请到的内存首地址由 @c *memptr 返回。如果参数 @c size 为0则函数立即返回错误码
* @c *memptr 为NULL。 参数 @c alignment 应该是sizeof(void*)的倍数且是2的幂
* 否则立即返回错误, @c *memptr 为NULL。 释放内存通过 @ref cos_free 函数释放。
*
* @param[out] memptr 返回申请到的内存首地址
* @param[in] size 想申请内存的大小单位Byte
* @param[in] alignment 内存地址对齐大小单位Byte
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 内存管理未知错误
*/
cos_status_t cos_malloc_align(void **memptr, size_t size, size_t alignment);
/**
* @brief 释放内存
*
* 释放由参数 @c ptr 指向的一块内存, @c ptr 应该是之前动态申请函数的返回值。
*
* @param[in] ptr 动态申请到的内存首地址
*
* @note 不可以在中断上下文中使用。
*
* @return 无
*/
void cos_free(void *ptr);
/**
* @}
*/
/**
* @addtogroup cos_mb
* 提供邮箱相关的标准定义
* @{
*/
/**
* @brief 创建邮箱
*
* 从系统堆内存中申请空间创建邮箱控制块
*
* @param[in] name 邮箱名称
*
* @param[in] size 邮箱容量
*
* @param[in] flag 邮箱标志,如: COS_IPC_FLAG_FIFO 或 COS_IPC_FLAG_PRIO
*
* @param[out] mb 邮箱句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mb_create(const char* name, size_t msg_size,
uint8_t flag, cos_mb_t *mb);
/**
* @brief 创建邮箱
*
* 删除邮箱对象并释放系统堆内存空间
*
*
* @param[in] mb 邮箱句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mb_delete(cos_mb_t mb);
/**
* @brief 创建邮箱
*
* 从系统堆内存中申请空间创建邮箱控制块
*
* @param[in] name 邮箱名称
*
* @param[in] msgpool 缓冲区指针
*
* @param[in] msg_size 邮箱容量
*
* @param[in] flag 邮箱工作方式
*
* @param[out] mb 邮箱句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mb_init(const char* name, size_t msg_size,
uint8_t flag, cos_mb_t *mb);
/**
* @brief 去初始化邮箱
*
* 去初始化一个邮箱
*
* @param[in] mb 邮箱句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mb_deinit(cos_mb_t mb);
/**
* @brief 发送邮件
*
* 发送邮件,当邮箱中的邮件已经满时,发送邮件的线程或者中断程序会收到 cos_ERROR_mb_FULL 的返回值。
*
* @param[in] mb 邮箱句柄
*
* @param[in] value 邮件内容
*
* @note 无
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mb_send(cos_mb_t mb, uint32_t value);
/**
* @brief 接收邮件
*
* 当邮箱中有邮件时,接收者才能接收邮件,否则接收者会根据超时时间设置,或挂起在邮箱的等待线程队列上,或直接返回。
*
* @param[in] mb 邮箱句柄
*
* @param[out] value 邮件内容
*
* @param[in] timeout 指定的超时时间
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mb_recv(cos_mb_t mb, uint32_t* value,
int32_t timeout);
/**
* @}
*/
/**
* @addtogroup cos_mq
* 提供消息队列相关的标准定义
* @{
*/
/**
* @brief 创建消息队列
*
* 从系统堆内存中申请空间创建消息队列控制块
*
* @param[in] name 消息队列名称
*
* @param[in] msg_size 单条消息的最大长
*
* @param[in] max_msgs 消息队列的最大个数
*
* @param[in] flag 消息队列工作方式,如: COS_IPC_FLAG_FIFO 或 COS_IPC_FLAG_PRIO
*
* @param[out] mq 消息队列句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mq_create(const char* name, size_t msg_size,
size_t max_msgs, uint8_t flag, cos_mq_t* mq);
/**
* @brief 删除邮箱
*
* 从系统堆内存中删除邮箱控制块
*
* @param[out] mq 邮箱句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mq_delete(cos_mq_t mq);
/**
* @brief 初始化消息队列
*
* 初始化消息队列控制块
*
* @param[in] name 消息队列名称
*
* @param[in] msgpool 指向存放消息的缓冲区的指针
*
* @param[in] msg_size 单条消息的最大长
*
* @param[in] flag 消息队列工作方式,如: COS_IPC_FLAG_FIFO 或 COS_IPC_FLAG_PRIO
*
* @param[out] mq 消息队列句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mq_init(const char* name, void *msgpool, size_t msg_size,
size_t max_msgs, cos_mq_t mq);
/**
* @brief 去初始化消息队列
*
* 去初始化消息队列控制块
*
* @param[out] mq 邮箱句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mq_delete(cos_mq_t mq);
/**
* @brief 发送消息
*
* 发送消息,线程或者中断服务程序都可以给消息队列发送消息。
*
* @param[in] mq 消息队列的句柄
*
* @param[in] value 消息内容
*
* @param[in] size 消息大小
*
* @note 无
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERROR_MQ_DELETED 线程挂起时消息队列已被删除
* @retval COS_ERROR_MQ_FULL 消息队列已满
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mq_send(cos_mq_t mq, void* buffer, size_t size);
/**
* @brief 接收邮件
*
* 当邮箱中有邮件时,接收者才能接收邮件,否则接收者会根据超时时间设置,或挂起在邮箱的等待线程队列上,或直接返回。
*
* @param[in] mq 消息队列的句柄
*
* @param[out] buffer 消息内容
*
* @param[in] size 消息大小
*
* @param[in] timeout 指定的超时时间
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERROR_MQ_DELETED 线程挂起时消息队列已被删除
* @retval COS_ERROR_MQ_FULL 消息队列已满
* @retval COS_ERR_ISR 在中断上下文中调用
* @retval COS_ERR 未知错误
*/
cos_status_t cos_mq_recv(cos_mq_t mq, void* buffer,
size_t size, int32_t timeout);
/**
* @}
*/
/**
* @addtogroup cos_wq
* 提供工作队列相关的标准定义
* @{
*/
/**
* @brief 初始化工作项
*
* 初始化工作项,并绑定工作项的回调函数,以及自定义用户数据
*
* @param[in] work 工作项
*
* @param[in] work_func 工作项的回调函数
*
* @param[in] work_data 用户自定义数据,回调函数参数
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_work_init(cos_work_t work, cos_work_handle_t work_func, void *work_data);
/**
* @brief 删除邮箱
*
* 从系统堆内存中删除邮箱控制块
*
* @param[in] work 工作项
*
* @param[in] time 提交延时,以 tick 为单位
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_work_dowork(cos_work_t work, cos_tick_t time);
/**
* @brief 向工作队列提交工作项
*
* 将 work 指向的工作项提交到 queue 指向的工作队列中,若 time 大于 0则该提交延时 time 个 tick 之后执行。
*
* @param[in] wq 工作队列
*
* @param[in] work 工作项
*
* @param[in] time 提交延时,以 tick 为单位
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_work_submit(cos_wq_t wq, cos_work_t work, cos_tick_t time);
/**
* @brief 取消指定工作项
*
* 从 queue 指向的工作队列中将 work 指向的工作项移除。
*
* @param[in] queue 工作队列
*
* @param[in] work 工作项
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_work_cancel(cos_wq_t wq, cos_work_t work);
/**
* @brief 创建工作队列
*
* 该函数创建并初始化一个工作队列,利用参数 namestack_size 和 priority 创建工作队列内部线程,最终返回创建的工作队列。下表描述了该函数的输入参数与返回值
*
* @param[out] wq 工作队列句柄
*
* @param[in] name 线程名字
*
* @param[in] stack_size 线程栈大小
*
* @param[in] priority 线程优先级
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_workqueue_create(cos_wq_t* wq, const char *name, uint16_t stack_size, uint8_t priority);
/**
* @brief 工作队列销毁函数
*
* 销毁指定工作队列
*
* @param[in] wq 工作队列句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 未知错误
*/
cos_status_t cos_workqueue_destroy(cos_wq_t wq);
/**
* @}
*/
/**
* @addtogroup cos_mutex
* 提供互斥锁相关的标准定义
* @{
*/
/**
* @brief 创建互斥锁
*
* 创建一个互斥锁。
* 该函数在创建时内部会动态分配需要的内存,如果不想使用动态内存,请使用 @ref cos_mutex_init 。
*
* @param[out] timer 互斥锁句柄
* @param[in] name 互斥锁名称
* @param[in] options 互斥锁的选项,如开启嵌套锁支持 @ref COS_MUTEX_NEST
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中使用
* @retval COS_ERR 互斥锁未知错误
*
* @see cos_mutex_init
*/
cos_status_t cos_mutex_create(cos_mutex_t *mutex, char *name, uint32_t options);
/**
* @brief 删除互斥锁
*
* 删除一个互斥锁。系统会先唤醒所有等待该锁的任务,唤醒原因为互斥锁已被销毁,然后删除回收其资源。
*
* @param[in] mutex 互斥锁句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 互斥锁未知错误
*/
cos_status_t cos_mutex_delete(cos_mutex_t mutex);
/**
* @brief 初始化互斥锁
*
* 初始化一个互斥锁。
* 与创建一个互斥锁类似,区别是互斥锁的控制块内存是由调用者传入的,一般用于需要静态内存的场景。
*
* @param[in] mutex 互斥锁句柄
* @param[in] name 互斥锁名称
* @param[in] options 互斥锁的选项,如开启嵌套锁支持 @ref COS_MUTEX_NEST
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR_ISR 在中断上下文中使用
* @retval COS_ERR 互斥锁未知错误
*
* @see cos_mutex_create
*/
cos_status_t cos_mutex_init(cos_mutex_t mutex, char *name, uint32_t options);
/**
* @brief 反初始化互斥锁
*
* 反初始化一个互斥锁。系统会先唤醒所有等待该锁的任务,唤醒原因为互斥锁已被销毁。但不会释放 @c mutex 的内存空间,应由调用者释放。
*
* @param[in] mutex 互斥锁句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR 互斥锁未知错误
*/
cos_status_t cos_mutex_deinit(cos_mutex_t mutex);
/**
* @brief 互斥锁上锁
*
* @param[in] mutex 互斥锁句柄
* @param[in] timeout 等待互斥锁的超时时间单位tick个数
*
* @note 不可以在中断上下文中使用。
*
* @retval COS_ERR 互斥锁未知错误
* @retval COS_ERR_TIMEOUT 申请上锁超时
* @retval COS_ERR_DESTROY 互斥锁已被销毁
* @retval COS_ERR_MUTEX_NESTING 未开启嵌套锁的情况下,进行嵌套申请
*/
cos_status_t cos_mutex_lock(cos_mutex_t mutex, cos_tick_t timeout);
/**
* @brief 互斥锁解锁
*
* @param[in] mutex 互斥锁句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR 互斥锁未知错误
* @retval COS_ERR_DESTROY 互斥锁已被销毁
* @retval COS_ERR_MUTEX_NOT_OWNER 未持有该互斥锁
*/
cos_status_t cos_mutex_unlock(cos_mutex_t mutex);
/**
* @}
*/
/**
* @addtogroup cos_sem
* 提供信号量相关的标准定义
* @{
*/
/**
* @brief 创建信号量
*
* 创建一个信号量。
* 该函数在创建时内部会动态分配需要的内存,如果不想使用动态内存,请使用 @ref cos_sem_init 。
*
* @param[out] sem 信号量句柄
* @param[in] name 信号量名称
* @param[in] init_count 信号量初始值
* @param[in] max_count 信号量最大值。如果无最大值限制可使用 @ref COS_SEM_NO_MAX。
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR 信号量未知错误
*
* @see cos_sem_init
*/
cos_status_t cos_sem_create(cos_sem_t *sem, char *name, uint32_t init_count, uint32_t max_count);
/**
* @brief 删除信号量
*
* 删除一个信号量。系统会先唤醒所有等待该信号量的任务,唤醒原因为信号量已被销毁,然后删除回收其资源。
*
* @param[in] sem 信号量句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 信号量未知错误
*/
cos_status_t cos_sem_delete(cos_sem_t sem);
/**
* @brief 初始化信号量
*
* 初始化一个信号量。
* 与创建一个信号量类似,区别是信号量的控制块内存是由调用者传入的,一般用于需要静态内存的场景。
*
* @param[in] sem 信号量句柄
* @param[in] name 信号量名称
* @param[in] init_count 信号量初始值
* @param[in] max_count 信号量最大值。如果无最大值限制可使用 @ref COS_SEM_NO_MAX。
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR 信号量未知错误
*
* @see cos_sem_create
*/
cos_status_t cos_sem_init(cos_sem_t sem, char *name, uint32_t init_count, uint32_t max_count);
/**
* @brief 反初始化信号量
*
* 反初始化一个信号量。系统会先唤醒所有等待该信号量的任务,唤醒原因为信号量已被销毁。但不会释放 @c sem 的内存空间,应由调用者释放。
*
* @param[in] sem 信号量句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 信号量未知错误
*/
cos_status_t cos_sem_deinit(cos_sem_t sem);
/**
* @brief 等待信号量
*
* @param[in] sem 信号量句柄
* @param[in] timeout 等待信号量的超时时间单位tick个数
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 信号量未知错误
* @retval COS_ERR_TIMEOUT 申请超时
* @retval COS_ERR_DESTROY 信号量已被销毁
*/
cos_status_t cos_sem_wait(cos_sem_t sem, cos_tick_t timeout);
/**
* @brief 释放信号量
*
* 释放一个信号量。系统唤醒等待该信号量的最高优先级任务。
*
* @param[in] sem 信号量句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR 信号量未知错误
* @retval COS_ERR_DESTROY 信号量已被销毁
*/
cos_status_t cos_sem_release(cos_sem_t sem);
/**
* @brief 释放信号量,唤醒所有等待任务
*
* 释放一个信号量。系统唤醒等待该信号量的所有任务。
*
* @param[in] sem 信号量句柄
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR 信号量未知错误
* @retval COS_ERR_DESTROY 信号量已被销毁
*/
cos_status_t cos_sem_release_all(cos_sem_t sem);
/**
* @}
*/
/**
* @addtogroup cos_event
* 提供事件相关的标准定义
* @{
*/
/**
* @brief 创建事件
*
* 创建一个事件。
* 该函数在创建时内部会动态分配需要的内存,如果不想使用动态内存,请使用 @ref cos_sem_init 。
*
* @param[out] event 事件句柄
* @param[in] name 事件名称
* @param[in] init_flag 事件初始标志
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR 事件未知错误
*
* @see cos_event_init
*/
cos_status_t cos_event_create(cos_event_t *event, char *name, cos_event_flag_t init_flag);
/**
* @brief 删除事件
*
* 删除一个事件。系统会先唤醒所有等待该事件的任务,唤醒原因为事件已被销毁,然后删除回收其资源。
*
* @param[in] event 事件句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 事件未知错误
*/
cos_status_t cos_event_delete(cos_event_t event);
/**
* @brief 初始化事件
*
* 初始化一个事件。
* 与创建一个事件类似,区别是事件的控制块内存是由调用者传入的,一般用于需要静态内存的场景。
*
* @param[out] event 事件句柄
* @param[in] name 事件名称
* @param[in] init_flag 事件初始标志
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR_NOMEM 内存不足
* @retval COS_ERR 事件未知错误
*
* @see cos_event_create
*/
cos_status_t cos_event_init(cos_event_t event, char *name, cos_event_flag_t init_flag);
/**
* @brief 反初始化事件
*
* 反初始化一个事件。系统会先唤醒所有等待该事件的任务,唤醒原因为事件已被销毁。但不会释放 @c event 的内存空间,应由调用者释放。
*
* @param[in] event 事件句柄
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 事件未知错误
*/
cos_status_t cos_event_deinit(cos_event_t event);
/**
* @brief 等待事件
*
* @param[in] event 事件句柄
* @param[in] expect_flag 期望期待的事件标志
* @param[in] timeout 等待事件的超时时间单位tick个数
* @param[out] match_flag 等待到的事件结果
* @param[in] options 等待事件的选项,如等待一个事件即可 @ref COS_EVENT_WAIT_ANY
* 等待全部事件 @ref COS_EVENT_WAIT_ALL, 等待到事件后清除该事件 @ref COS_EVENT_WAIT_CLR
*
* @note 不可以在中断上下文中使用。
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR_PARAM 传入的参数非法
* @retval COS_ERR 事件未知错误
* @retval COS_ERR_TIMEOUT 等待超时
* @retval COS_ERR_DESTROY 事件已被销毁
*/
cos_status_t cos_event_wait(cos_event_t event, cos_event_flag_t expect_flag, cos_tick_t timeout, cos_event_flag_t *match_flag, uint32_t options);
/**
* @brief 释放事件
*
* @param[in] event 事件句柄
* @param[in] flag 要释放的事件标志
* @param[in] options 释放事件的选项,如释放后是否保留该事件 @ref COS_EVENT_RELEASE_KEEP
*
* @return COS_OK: 成功, <0: 失败
* @retval COS_ERR 事件未知错误
* @retval COS_ERR_DESTROY 事件已被销毁
*/
cos_status_t cos_event_release(cos_event_t event, cos_event_flag_t flag, uint32_t options);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /*_COSIT_H*/