FreeRtos事件组

一、事件的基本概念

        事件是一种实现任务间通信的机制,主要用于实现多任务的同步,但事件通信只能是事件类型之间的通信,无数据的传输。与信号量不同的是,它可以实现一对多,多对多的同步。当configUSE_16_bit_Ticks定义为0,那么uxEventBits是32位的,有24个位用来实现事件标志组。一对多同步类型:一个任务等待多个事件的触发,这种情况是比较常见的。多对多同步模型:多个任务等待多个事件的触发。

二、事件特点

        1、事件只与任务相关联,事件相互独立,一个32位的事件集合(EventBits_t 类型的变量,实际可用与表示事件的只有24位),用于标识该任务的事件类型,其中每一位位表示一种事件类型(0表示该类型事件未发生、1表示该事件已经发生),一共24种事件类型。

        2、事件仅用于同步,不提供数据传输功能。

        3、事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读走),等效于只设置一次。

        4、允许多个任务对同一事件进行读写操作。

        5、支持事件等待超时机制。

        

三、事件的应用场景 

         FreeRTOS 的事件用于事件类型的通讯,无数据传输,也就是说,我们可以用事件来做标志位,判断某些事件是否发生了,然后根据结果做处理,作用类型于我们在裸机编写中的标志位,我们通常把全局变量作为标志位,来进行信息的传输。但使用全局变量作为标志位的话,就需要任务中轮询查看事件是否发送,这对CPU资源是一种极大的浪费,因此在操作系统当中使用事件这种通信机制就能解决以上问题。在一些特定的场合,需要多个事件发生才能进行下一步的操作,比如一些复杂的机器,需要各项指标的检测,当有一个指标不通过便无法启动该机器,但是指标的检测不可能在同一时间全部检测完,检测需要分先后顺序,当一个指标检测通过就发送一个事件,而触发机器启动的条件就是所有指标都通过也就是需要集齐所有的指标发送的事件,那么机器才允许启动。

        事件也可在一定程度上替代信号量的工作,用于任务于任务,任务与中断之间的同步,一个任务或中断服务例程发送一个事件给事件对象,而后等待的任务被唤醒并对相应的事件进行处理。与信号量有所区别的是,信号量是一个信号量对应一个任务,而事件可多个事件对应一个任务或多个任务,同时按照任务等待的参数,可选择是“逻辑或”触发还 是“逻辑与”触发。这个特性也是信号量等所不具备的,信号量只能识别单一同步动作, 而不能同时等待多个事件的同步。

           各个事件可单独也可一起发送事件对象,而一个任务可等待多个事件,满足任务所需获得的事件,才启动任务,任务仅对感兴趣的事件进行关注。

四、事件的运作机制

          接收事件时,任务可以选择自己感兴趣的事件进行接收,事件接收成功之后必须使用xClearOnExit选项来清除已接受的事件选项,否则不会清除接收到的事件,这样就需要用户手动清除事位。

        用户可 以自 定义 通过 传入参 数 xWaitForAllBits 选择读取模式,是等待所有感兴趣的事件还是等待感兴趣的任意一个事件。 

     设置事件时,对指定事件写入指定的事件类型,设置事件集合的对应事件位为 1,可 以一次同时写多个事件类型,设置事件成功可能会触发任务调度。 

       清除事件时,根据入参数事件句柄和待清除的事件类型,对事件对应位进行清 0 操作。 事件不与任务相关联,事件相互独立,一个 32位的变量(事件集合,实际用于表示事 件的只有 24 位),用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0 表 示该事件类型未发生、1表示该事件类型已经发生),一共 24种事件类型具体见图

        

        事件唤醒机制,任务因等待某个事件或多个事件而进入阻塞态,当事件产生时才会被唤醒。任务1对事件3或事件5感兴趣,于是事件3产生时,任务一便会被唤醒,然后执行相应的操作。任务1对事件3和事件5都有兴趣,于是事件5产生时同样也会唤醒任务1,也就是逻辑或的关系。(这就相当于一个胃口小的小孩,吃饭或吃面都能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值