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

发布者:CuriousObserver最新更新时间:2019-04-24 来源: eefocus关键字: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函数:


1.2.1 创建事件标志组

void  OSFlagCreate (OS_FLAG_GRP  *p_grp,//事件标志组 OS_FLAG_GRP EventFlag

                    CPU_CHAR     *p_name,//事件标志组名字

                    OS_FLAGS      flags,//定义事件标志组的名字

                    OS_ERR       *p_err)

1.2.2 等待事件标志组

OS_FLAGS  OSFlagPend (OS_FLAG_GRP  *p_grp,//事件标志组

                      OS_FLAGS      flags,//bit序列,把对应序列置1

                      OS_TICK       timeout,//超时时间,同信号量

                      OS_OPT        opt,//决定任务等待的条件,四个选项可选

                      CPU_TS       *p_ts,//指向时间戳,记录发送、终止等事件时刻

                      OS_ERR       *p_err)

1.2.3 向事件标志组发布标志

OS_FLAGS  OSFlagPost (OS_FLAG_GRP  *p_grp,//指向事件标志组

                      OS_FLAGS      flags,//决定对哪些位清零和置位

                      OS_OPT        opt,//决定对标志位的操作,有两种选项

                      OS_ERR       *p_err)

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

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

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


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



2.2、OSPendMulti()函数:等待多个内核对象

    一个任务可以调用函数OSPendMulti()函数来等待多个对象,并且可以根据需要指定一个等待超时值,函数OSPendMulti()原型如下:


OS_OBJ_QTY  OSPendMulti (OS_PEND_DATA   *p_pend_data_tbl,//指向OS_PEND_DATA表的指针

                         OS_OBJ_QTY     tbl_size,//表p_pend_data_tbl的大小:内核对象数量

                         OS_TICK        timeout,//超时时间

                         OS_OPT         opt,//选择是否使用阻塞模式,两个选项

                         OS_ERR         *p_err)

在调用函数OSPendMulti()之前我们需要先初始化OS_PEND_DATA数组,数组的大小取决于任务同时等待的内核对象的总数量。


2.3、初始化OS_PEND_DATA数组

       2.3.1、定义内核对象,如下:

       


OS_SEM     Test_Sem1;                   //信号量1

 

OS_SEM     Test_Sem2;                   //信号量2

 

OS_Q  Test_Q;                        //消息队列

        2.3.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;

 


关键字:UCOSIII  事件标志组  内核对象 引用地址:UCOSIII事件标志组和同时等待多个内核对象

上一篇:UCOSIII存储管理
下一篇:UCOSIII任务间的通信

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved