【IoT】LiteOS 实时操作系统事件标志组 event 操作解析

信号量同步只能与单个的事件或任务进行同步,事件标志组与多个事件或任务进行同步事件位用来表明某个事件是否发生,事件组是一组事件位。

1、基本概念

事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。

一个任务可以等待多个事件的发生:

1)可以是任意一个事件发生时唤醒任务进行事件处理;

2)也可以是几个事件都发生后才唤醒任务进行事件处理。

事件集合用32位无符号整型变量来表示,每一位代表一个事件。

多任务环境下,任务之间往往需要同步操作,一个等待即是一个同步。

事件可以提供一对多、多对多的同步操作。

一对多同步模型:一个任务等待多个事件的触发;

多对多同步模型:多个任务等待多个事件的触发。

任务可以通过创建事件控制块来实现对事件的触发和等待操作。

Huawei LiteOS 的事件仅用于任务间的同步,不提供数据传输功能。

2、Huawei LiteOS event 特点

1)事件不与任务相关联,事件相互独立,一个32位的变量,用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生),一共31种事件类型(第25位保留);

2)事件仅用于任务间的同步,不提供数据传输功能;

3)多次向任务发送同一事件类型,等效于只发送一次;

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

5)支持事件读写超时机制。

事件控制块:

/**
 * @ingroup los_event
 * Event control structure
 */
typedef struct tagEvent
{
    UINT32 uwEventID;            /**标识发生的事件类型位*/
    LOS_DL_LIST    stEventList;  /**读取事件任务链表*/
} EVENT_CB_S, *PEVENT_CB_S;

uwEventID:

用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生),一共31种事件类型,第25位系统保留。

3、事件读取模式

在读事件时,可以选择读取模式;在系统初始化之前不能调用读写事件接口,如果调用,则系统运行会不正常;在中断中,可以对事件对象进行写操作,但不能读操作。

读取模式如下:

1)所有事件(LOS_WAITMODE_AND):

读取掩码中所有事件类型,只有读取的所有事件类型都发生了,才能读取成功。

2)任一事件(LOS_WAITMODE_OR): 

读取掩码中任一事件类型,读取的事件中任意一种事件类型发生了,就可以读取成功。

3)清除事件(LOS_WAITMODE_CLR):

LOS_WAITMODE_AND| LOS_WAITMODE_CLR或 LOS_WAITMODE_OR| LOS_WAITMODE_CLR 时表示读取成功后,对应事件类型位会自动清除。

4、运作机制

读事件时,可以根据入参事件掩码类型uwEventMask读取事件的单个或者多个事件类型。

事件读取成功后,如果设置LOS_WAITMODE_CLR会清除已读取到的事件类型,反之不会清除已读到的事件类型,需显式清除。

可以通过入参选择读取模式,读取事件掩码类型中所有事件还是读取事件掩码类型中任意事件。

写事件时,对指定事件写入指定的事件类型,可以一次同时写多个事件类型,写事件会触发任务调度。

清除事件时,根据入参事件和待清除的事件类型,对事件对应位进行清0操作。

在锁任务调度状态下,禁止任务阻塞与读事件。

LOS_EventClear 入参值是:要清除的指定事件类型的反码(~uwEvents)。

事件掩码的第25位不能使用,原因是为了区别LOS_EventRead接口返回的是事件还是错误码。

5、使用场景

事件可应用于多种任务同步场合,能够一定程度替代信号量。

6、功能

Huawei LiteOS 系统中的事件模块为用户提供下面几个接口。


7、开发流程

使用事件模块的典型流程如下:

调用事件初始化LOS_EventInit接口,初始化事件等待队列;

写事件LOS_EventWrite,配置事件掩码类型;

读事件LOS_EventRead,可以选择读取模式;

清除事件LOS_EventClear,清除指定的事件类型。

8、示例

任务Example_TaskEntry创建一个任务Example_Event,Example_Event读事件阻塞,Example_TaskEntry向该任务写事件。

1) 在任务Example_TaskEntry创建任务Example_Event,其中任务Example_Event优先级高于Example_TaskEntry;

2) 在任务Example_Event中读事件0x00000001,阻塞,发生任务切换,执行任务Example_TaskEntry;

3) 在任务Example_TaskEntry向任务Example_Event写事件0x00000001,发生任务切换,执行任务Example_Event;

4) Example_Event得以执行,直到任务结束;

5) Example_TaskEntry得以执行,直到任务结束;

 

 

 


refer:

https://blog.csdn.net/wzjwzj123456/article/details/82695705 

https://blog.csdn.net/zhangxuechao_/article/details/80254465

 


 

发布了338 篇原创文章 · 获赞 293 · 访问量 51万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览