UCOSIII事件标志组和同时等待多个内核对象

1、UCOSIII事件标志组

1.1、事件标志组:

有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步。“或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步。“与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。

在UCOSIII中事件标志组为OS_FLAG_GRP,如果需要使用事件标志组的时候需要将宏OS_CFG_FLAG_EN置1,

struct  os_flag_grp {

OS_OBJ_TYPE          Type;                            

CPU_CHAR             *NamePtr;

OS_PEND_LIST         PendList;

#if OS_CFG_DBG_EN > 0u

    OS_FLAG_GRP      *DbgPrevPtr;

    OS_FLAG_GRP      *DbgNextPtr;

    CPU_CHAR         *DbgNamePtr;

#endif

OS_FLAGS             Flags;

CPU_TS               TS;

};

1.2、事件标志组API函数:

OSFlagCreate()              创建事件标志组

OSFlagDel()                 删除事件标志组

OSFlagPend()                等待事件标志组

OSFlagPendAbort()           取消等待事件标志

OSFlagPendGetFlagsRdy()     获取使任务就绪的事件标志

OSFlagPost()                向事件标志组发布标志

2、UCOSIII同时等待多个内核对象

2.1、同时等待多个内核对象:

前面我们讲过都是等待单个内核对象,包括:信号量、互斥信号量、消息队列和事件标志组。在UCOSIII中允许任务同时等待多个信号量和多个消息队列,也就是说,UCOSIII不支持同时等待多个事件标志组或互斥信号量。

一个任务可以等待任意数量的信号量和消息队列,第一个信号量或消息队列的发布会导致该任务进入就绪态。

2.2、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数组,数组的大小取决于任务同时等待的内核对象的总数量。

2.3、初始化OS_PEND_DATA数组:

(1) 定义内核对象,如下:   

OS_SEM    Test_Sem1;            //信号量1

OS_SEM    Test_Sem2;            //信号量2

OS_Q    Test_Q;                //消息队列

(2) 初始化OS_PEND_DATA数组

OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM];      //定义数组   

pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1;

pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2;

pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q;

你可能感兴趣的:(uC/OS,III学习)