一、事件基本概念
事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用 32 位无符号整型变量来表示,每一位代表一个事件。
事件的第 25 位为保留位,不可以进行位设置。
事件(Event)是一种任务间的通信机制,可用于任务间的同步操作。事件的特点是:
- 任务间的事件同步,可以一对多,也可以多对多。一对多表示一个任务可以等待多个事件,多对多表示多个任务可以等待多个事件。但是一次写事件最多触发一个任务从阻塞中醒来。
- 事件读超时机制。
- 只做任务间同步,不传输具体数据。
提供了事件初始化、事件读写、事件清零、事件销毁等接口。
二、事件运行机制
事件初始化:会创建一个事件控制块,该控制块维护一个已处理的事件集合,以及等待特定事件的任务链表。
写事件:会向事件控制块写入指定的事件,事件控制块更新事件集合,并遍历任务链表,根据任务等待具体条件满足情况决定是否唤醒相关任务。
读事件:如果读取的事件已存在时,会直接同步返回。其他情况会根据超时时间以及事件触发情况,来决定返回时机:等待的事件条件在超时时间耗尽之前到达,阻塞任务会被直接唤醒,否则超时时间耗尽该任务才会被唤醒。
读事件条件满足与否取决于入参 eventMask 和 mode,eventMask 即需要关注的事件类型掩码。mode 是具体处理方式,在 los_event.h 中定义了以下三种情况:
- 所有事件(LOS_WAITMODE_AND):读取掩码中所有事件类型,只有读取的所有事件类型都发生了,才能读取成功。
- 任一事件(LOS_WAITMODE_OR):读取掩码中任一事件类型,读取的事件中任意一种事件类型发生了,就可以读取成功。
- 清除事件(LOS_WAITMODE_CLR):LOS_WAITMODE_AND|LOS_WAITMODE_CLR 或LOS_WAITMODE_OR|LOS_WAITMODE_CLR 时表示读取成功后,对应事件类型位会自动清除。
事件清零:根据指定掩码,去对事件控制块的事件集合进行清零操作。当掩码为 0 时,表示将事件集合全部清零。当掩码为 0xffff 时,表示不清除任何事件,保持事件集合原状。
事件销毁:销毁指定的事件控制块。
三、事件开发流程
- 初始化事件控制块
- 阻塞读事件控制块
- 写入相关事件
- 阻塞任务被唤醒,读取事件并检查是否满足要求
- 处理事件控制块
- 事件控制块销毁
四、事件使用说明
- 进行事件读写操作时,事件的第 25 位为保留位,不可以进行位设置。
- 对同一事件反复写入,算作一次写入。
- 执行 LOS_EventRead()时,其中的事件类型掩码等于等待的所有事件类型掩码按位与(LOS_WAITMODE_AND)或是按位或(LOS_WAITMODE_OR)的结果。
五、事件接口
功能类别 | 接口函数 | 描述 |
---|---|---|
初始化事件 | LOS_EventInit | 初始化一个事件控制块 |
读/写事件 | LOS_EventRead | 读取指定事件类型,超时时间为相对时间:单位为Tick |
LOS_EventWrite | 写指定的事件类型 | |
清除事件 | LOS_EventClear | 清除指定的事件类型 |
校验事件掩码 | LOS_EventPoll | 根据用户传入的事件ID、事件掩码及读取模式,返回用户传入的事件是否符合预期 |
销毁事件 | LOS_EventDestroy | 销毁指定的事件控制块 |