官方概述
先看官方对事件的描述.
事件(Event)是一种任务间通信的机制,可用于任务间的同步。
多任务环境下,任务之间往往需要同步操作,一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。
-
一对多同步模型:一个任务等待多个事件的触发。可以是任意一个事件发生时唤醒任务处理事件,也可以是几个事件都发生后才唤醒任务处理事件。
-
多对多同步模型:多个任务等待多个事件的触发。
鸿蒙提供的事件具有如下特点:
- 任务通过创建事件控制块来触发事件或等待事件。
- 事件间相互独立,内部实现为一个32位无符号整型,每一位标识一种事件类型。第25位不可用,因此最多可支持31种事件类型。
- 事件仅用于任务间的同步,不提供数据传输功能。
- 多次向事件控制块写入同一事件类型,在被清零前等效于只写入一次。
- 多个任务可以对同一事件进行读写操作。
- 支持事件读写超时机制。
再看事件图

注意图中提到了三个概念 事件控制块 事件 任务
接下来结合代码来理解事件模块的实现.
事件控制块长什么样?
typedef struct tagEvent {
UINT32 uwEventID; /**< Event mask in the event control block,//标识发生的事件类型位,事件ID,每一位标识一种事件类型
indicating the event that has been logically processed. */
LOS_DL_LIST stEventList; /**< Event control block linked list *///读取事件任务链表
} EVENT_CB_S, *PEVENT_CB_S;
简单是简单,就两个变量,如下:
uwEventID:用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生),一共31种事件类型,第25位系统保留。
stEventList,这又是一个双向链表, 双向链表是内核最重要的结构体.
LOS_DL_LIST像狗皮膏药一样牢牢的寄生在宿主结构体上stEventList上挂的是所有等待这个事件的任务.
事件控制块<>事件<>任务 三者关系
一定要搞明白这三者的关系,否则搞不懂事件模块是如何运作的.
-
任务是事件的生产者,通过
LOS_EventWrite,向外部广播发生了XX事件,并唤醒此前已在事件控制块中登记过的要等待XX事件发生的XX任务. -
事件控制块
EVENT_CB_S是记录者,只干两件事件:1.
uwEventID按位记录哪些事件发生了,它只是记录,怎么消费它不管的.2.
stEventList记录哪些任务在等待事件,但任务究竟在等待哪些事件它也是不记录的 -
任务也是消费者,通过
LOS_EventRead消费,只有任务自己清楚要以什么样的方式,消费什么样的事件.
先回顾下任务结构体LosTaskCB对事件部分的描述如下:
typedef struct {
//...去掉不相关的部分
VOID *taskEvent; //和任务发生关系的事件控制块
UINT32 eventMask; //对哪些事件进行屏蔽
UINT32 eventMode; //事件三种模式(LOS_WAITMODE_AND,LOS_WAITMODE_OR,LOS_WAITMODE_CLR)
} LosTaskCB;
`taskEvent` 指向的就是 `EVENT_CB_S`
`eventMask` 屏蔽掉 事件控制块 中的哪些事件
`eventMode` 已什么样的方式去消费事件,三种读取模式
#define LOS_WAITMODE_AND 4U
#define LOS_WAITMODE_OR 2U
#define LOS_WAITMODE_CLR 1U
* 所有事件(`LOS_WAITMODE_AND`):逻辑与,基于接口传入的事件类型掩码`eventMask`,只有这些事件都已经发生才能读取成功,否则该任务将阻塞等待或者返回错误码。
* 任一事件(`LOS_WAITMODE_OR`):逻辑或,基于接口传入的事件类型掩码`eventMask`,只要这些事件中有任一种事件发生就可以读取成功,否则该任务将阻塞等待或者返回错误码。
* 清除事件(`LOS_WAITMODE_CLR`):这是一种附加读取模式,需要与所有事件模式或任一事件模式结合使用(`LOS_WAITMODE_AND | LOS_WAITMODE_CLR`或 `LOS_WAITMODE_OR

本文详细解析了鸿蒙系统中的事件机制,包括事件控制块的结构、事件的一对多和多对多同步模型,以及OsEventWrite和OsEventRead等关键函数的作用。通过实例演示了任务如何生产事件并消费事件,帮助读者理解事件在多任务环境中的作用和用法。
最低0.47元/天 解锁文章
827

被折叠的 条评论
为什么被折叠?



