UCOSIII事件标志组

我们可以使用信号量来完成任务同步,这里我们再讲解一下另外一种任务同步的方法,就是事件标志组,事件标志组用来解决一个恩物和多个事件之
间的同步
事件标志组
有时候一个任务可能需要和多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步,当
任何一个事情发生,任务都被同步的同步机制是“或”同步;需要所有的事件都发生任务才会被同步的同步机制是“与”同步,这两种同步机制
如下图所示。
![时间标志组](https://img-blog.csdn.net/20160810101401035)
(1)在UCOSIII中事件标志组是OS_FLAG_GRP,在os.h文件中有定义,事件标志组中也包含了一串任务,这些任务都在等待着事件标志组中的部分
(或全部)事件标志被置1或被清零,在使用之前,必须创建事件标志组。
(2)任务和ISR(中断服务程序)都可以发布事件标志,但是只有任务可以创建/删除事件标志组以及取消其他任务对事件标志组的等待。
(3)任务可以通过调用函数OSFlagPend()等待事件标志组中任意个事件标志,调用函数OSFlagPend()的时候可以设置一个超时时间,如果过了
超时时间请求的事件还没有被发布,那么任务就会重新进入就绪状态。
(4)我们可以设置同步机制为“或”同步还是“与”同步。

UCOSIII中关于事件标志组的API函数如下表,一般情况下我们只使用OSFlagCreate()、OSFlagPend()、OSFlagPost()这三个函数。
![事件标志组API函数](https://img-blog.csdn.net/20160810102524604)

事件标志组相关函数
创建事件标志组
在使用时间标志组之前,需要调用函数OSFlagCreate()创建一个事件标志组
p_grp : 指向事件标志组 ,事件标志组的存储空间需要应用程序进行实际分配我们可以按照下面的例子来定义一个事件标志组。
    OS_FLAG_GRP EventFlag; EventFlag;EventFlag;
p_name: 事件标志组的名字。
flags : 定义事件标志组的初始值。
p_err: 用来保存调用此函数后返回的错误码。

等待事件标志组
等待一个事件标志组需要调用函数OSFlagPend()
OSFlagPend() 允许将事件标志组里的“与或”组合状态设置成任务的等待条件。 任务等待的条件可以是标志组里意一个置位或清零,也可以是
所有事件标志位都置位或清零。如果任务等待的事件标志组不满足设置的条件,那么该任务被置位挂起状态,直到事件标志组满足条件、指定的
超时间到、事件标志被删除或另一个任务终止了该挂起状态。
p_grp : 指向事件标志组。
flags : bit 序列,任务需要等待事件标志组的哪个位就把这对应位置1,根据设置这个序列可以是 8bit 、16bit 或者 32 bit。 比如任务需要
等待时间标志组的 bit0 和 bit1 时(无论是等待置位还清零),flag 的值就为0X03。
timeout : 指定等待事件标志组的超时时间( 时钟节拍数 ),如果在指定的超时间内所等待的一个或多个事件没有发生,那么任务恢复运行。如果
此值设置为0则任务就将一直等待下去,到一个或多个事件发生。
opt : 决定任务等待的条件是所有标志置位、所有标志清零、任意一个标志位置位还是任意一个标志位清零,具体的定义如下。
    OS_OPT_PEND_FLAG_CLR_ALL 等待事件标志组所有的位清零
    OS_OPT_PEND_FLAG_CLR_ANY 等待事件标志组中任意一个标志清零
    OS_OPT_PEND_FLAG_SET_ALL 等待事件标志组中所有的位置位
    OS_OPT_PEND_FLAG_SET_ANY 等待事件标志组中任意一个标志置位
        调用上面四个选项的时候还可以搭配下三个选项
    OS_OPT_PEND_FLAG_CONSUME 用来设置是否继续保留该事件标志的状态。
    OS_OPT_PEND_NON_BLOCKING 标志组不满足条件时不挂起任务。
    OS_OPT_PEND_BLOCKING 标志组不满足条件时挂起任务。
        这里应该注意选项OS_OPT_PEND_FLAG_CONSUME 的使用方法,如果我们希望任务等待事件标志组的任意一个置位,并在满足条后
将对应清零那么就可以搭配使用选项OS_OPT_PEND_FLAG_CONSUME 。
p_ts : 指向一个时间戳,记录了发送、终止和删除事件标志组的时刻,如果为这个指针赋值 NULL ,则函数的调用者将不会收到时间戳。
p_err:用来保存调用此函数后返回的错误码。

向实践标志组发布标志
调用函数PSFlagPost()可以对事件标志组置位或者清零
一般情况下,需要进行置位或者清零的标志由一个掩码确定(参数 flags )。 OSFlagPost()修改完事件标志后,将检查并使那些等待条件已经
满足的任务进入就绪态。该函数可以对已经置位或清零的标志进行重复置位和清零操作。
p_grp : 指向事件标志组。
flags : 决定对哪些位清零和置,当 opt 参数为OS_OPT_POST_FLAG_SET的时,参数flags中置位的就会在事件标志组对应的位也将被置位。当 opt 
为 OS_OPT_POST_FLAG_CLR 的时候参数flags中置位的位在事件标志组中对应的位将中被清零。
opt : 决定对标志位的操作 ,有两种选项。
    OS_OPT_POST_FLAG_SET 对标志位进行置位操作
    OS_OPT_POST_FLAG_CLR 对标志位进行清零操作
p_err: 保存调用此函数后返回的错误码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值