UCOSIII事件标志组和同时等待多个内核对象
Posted 想成为大师啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UCOSIII事件标志组和同时等待多个内核对象相关的知识,希望对你有一定的参考价值。
1.1、事件标志组
有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步
- “或同步”:等待多个事件时,任何一个事件发生,任务都被同步,这个就称为“或”同步
- “与”同步:当所有的事件都发生时任务才被同步,这种同步机制都被称为“与”同步
在UCOSIII中事件标志组为 OS_FLAG_GRP,如果需要使用事件标志组的时候需要将宏 OS_CFG_FLAG_EN置1
struct os_flag_grp /* Event Flag Group */
/* ------------------ GENERIC MEMBERS ------------------ */
OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_FLAG */
CPU_CHAR *NamePtr; /* Pointer to Event Flag Name (NUL terminated ASCII) */
OS_PEND_LIST PendList; /* List of tasks waiting on event flag group */
#if OS_CFG_DBG_EN > 0u
OS_FLAG_GRP *DbgPrevPtr;
OS_FLAG_GRP *DbgNextPtr;
CPU_CHAR *DbgNamePtr;
#endif
/* ------------------ SPECIFIC MEMBERS ------------------ */
OS_FLAGS Flags; /* 8, 16 or 32 bit flags */
CPU_TS TS; /* Timestamp of when last post occurred */
;
1.2、事件标志组API函数
函数名 | 作用 |
---|---|
OSFlagCreate | 创建事件标志组 |
OSFlagDel() | 删除事件标志组 |
OSFlagPend() | 等待事件标志组 |
OSFlagPendAbort() | 取消等待事件标志 |
OSFlagPendGetFlagsRdy() | 获取使任务就绪的事件标志 |
OSFlagPost() | 向事件标志组发布标志 |
创建事件标志组:在使用事件标志组之前,需要调用函数OSFlagCreate()创建一个事件标志组,OSFlagCreate()函数原型如下:
void OSFlagCreate (OS_FLAG_GRP *p_grp, // 指向事件标志组,事件标志组的存储空间需要应用程序进行实际分配
CPU_CHAR *p_name, // 事件标志组的名字
OS_FLAGS flags, // 定义事件标志组的初始值
OS_ERR *p_err // 用来保存调用此函数后返回的错误码
)
等待事件标志组:等待一个事件标志组需要调用函数 OSFlagPend()
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp, // 指向事件标志组
OS_FLAGS flags, // bit序列
OS_TICK timeout, // 指等待事件标志组的超时时间
OS_OPT opt, // 决定任务等待的条件的是所有标志置位、所有标志清零、任意一个标志置位还是任意一个标志清零
CPU_TS *p_ts, // 指向一个时间戳
OS_ERR *p_err // 用来保存调用此函数后返回的错误码
)
2、UCOSIII同时等待多个内核对象
2.1、同时等待多个内核对象
前面的内容都是等待单个内核对象,包括:信号量、互斥信号量、消息队列和事件标志组。在UCOSIII中允许任务同时等待多个信号量和多个消息队列,也就是说,UCOSIII不支持同时等待多个事件标志组或互斥信号量
一个任务可以等待任意数量的信号量和消息队列,第一个信号量或消息队列的发布会导致该任务进入就绪态
2.1、OSPendMulti()函数
一个任务可以调用函数OSPendMulti()函数来等待多个对象,并且可以根据需要指定一个等待超时值,函数OSPendMulti()原型如下:
OS_OBJ_QTY OSPendMulti (OS_PEND_DATA *p_pend_data_tbl,
OS_OBJ_QTY tbl_size,
OS_TICK timeout,
OS_OPT opt,
OS_ERR *p_err)
在调用函数 OSPendMulti()之前我们需要先初始化OS_PEND_DATA数组,数组的大小取决于任务同时等待的内核对象的总数量
以上是关于UCOSIII事件标志组和同时等待多个内核对象的主要内容,如果未能解决你的问题,请参考以下文章