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事件标志组和同时等待多个内核对象的主要内容,如果未能解决你的问题,请参考以下文章

事件对象

ucosiii浅析内核对象-软件定时器

ucosiii文件结构及内核对象概念

FreeRTOS 事件标志组

linux 等待队列

Even事件