## 事件介绍 ### 什么是事件 事件机制可以实现线程之间的通讯。事件通讯只能是事件类型的通讯,无数据传输。 UniProton事件作为任务的扩展,实现任务之间的通讯。每个任务支持32种类型事件(32个 bit位,每bit代表一种事件类型)。 UniProton提供读取本任务事件和写指定任务事件功能。读事件时可以同时读取多种事件,也可以只读一种事件,写事件时也可以同时写一种或多种类型事件。 ### 为什么需要事件 用户在创建多个任务时,往往需要一些任务之间的同步,即一个任务运行到某些特定的代码时需要通知另外一个任务去做对应的处理。引入事件机制,可以给需要通知的任务发送事件(写事件),也可以在任务中接收事件(读事件),事件接收成功后根据事件类型做对应的处理。 ### 运作机制 #### 写事件运作机制 在写事件过程中,需要完成以下步骤: 1. 对指定任务事件类型写上输入事件。 2. 判断目的任务是否正在接收等待事件,且其等待的事件是否已经符合唤醒条件。(唤醒条件即读取的事件已经发生) 3. 如果符合唤醒条件,则需清除任务读事件状态。 4. 清除任务超时状态。 5. 在任务没有被挂起的情况下,需要将任务加入就绪队列并尝试任务调度。 #### 读事件运作机制 读事件过程如下: 1. 根据入参事件掩码类型对自身任务输入读取事件类型。 2. 判断事件读取模式,是读取输入的所有事件还是其中的任意一种事件。 3. 根据读取模式,判断期望的事件是否满足读取情况。 4. 判断事件等待模式:如果为等待事件模式则根据模式来设置相应的超时时间;如果为非等待模式则事件读取失败。 5. 如果需要等待阻塞读取,则需要将自己任务从就绪列表中删除,并进行任务调度。 6. 读取成功后,清除读到的事件类型,并且把事件类型返回。 ### 注意事项 - 事件无需创建,每个任务创建后自动支持32种事件类型。 - 在非任务线程中可以对任务写事件,但不能读事件。 - 不能在IDLE任务中读事件,因为读事件可能会引发IDLE任务阻塞(当期望的事件未发生时),从而导致异常发生。 - 在系统初始化之前不能调用读写事件接口。如果调用,则系统运行会不正常。