
# 开发指导
#### 使用场景
事件可应用于多种任务同步场景，在某些同步场景下可替代信号量。
#### 功能
Huawei LiteOS 的事件模块为用户提供下面几种功能，接口详细信息可以查看API参考。
| 功能分类   | 接口名              | 描述                                    |
|:---|:---|:---|
| 初始化事件  | LOS_EventInit    | 初始化一个事件控制块                            |
| 读/写事件  | LOS_EventRead    | 读取指定事件类型，超时时间为相对时间：单位为Tick            |
| 读/写事件  | LOS_EventWrite   | 写指定的事件类型                              |
| 清除事件   | LOS_EventClear   | 清除指定的事件类型                             |
| 校验事件掩码 | LOS_EventPoll    | 根据用户传入的事件ID、事件掩码及读取模式，返回用户传入的事件是否符合预期 |
| 销毁事件   | LOS_EventDestroy | 销毁指定的事件控制块                            |
   
#### Event错误码
对存在失败可能性的操作返回对应的错误码，以便快速定位错误原因。
| 序号 | 定义                                  | 实际值        | 描述                                         | 参考解决方案         |
|:---|:---|:---|:---|:---|
| 1  | LOS_ERRNO_EVENT_SETBIT_INVALID      | 0x02001c00 | 写事件时，将事件ID的第25个bit设置为1。这个比特位OS内部保留，不允许设置为1 | 事件ID的第25bit置为0 |
| 2  | LOS_ERRNO_EVENT_READ_TIMEOUT        | 0x02001c01 | 读事件超时                                      | 增加等待时间或者重新读取   |
| 3  | LOS_ERRNO_EVENT_EVENTMASK_INVALID   | 0x02001c02 | 入参的事件ID是无效的                                | 传入有效的事件ID参数    |
| 4  | LOS_ERRNO_EVENT_READ_IN_INTERRUPT   | 0x02001c03 | 在中断中读取事件                                   | 启动新的任务来获取事件    |
| 5  | LOS_ERRNO_EVENT_FLAGS_INVALID       | 0x02001c04 | 读取事件的mode无效                                | 传入有效的mode参数    |
| 6  | LOS_ERRNO_EVENT_READ_IN_LOCK        | 0x02001c05 | 任务锁住，不能读取事件                                | 解锁任务，再读取事件     |
| 7  | LOS_ERRNO_EVENT_PTR_NULL            | 0x02001c06 | 传入的参数为空指针                                  | 传入非空入参         |
| 8  | LOS_ERRNO_EVENT_READ_IN_SYSTEM_TASK | 0x02001c07 | 在系统任务中读取事件，如idle和软件定时器                     | 启动新的任务来获取事件    |
| 9  | LOS_ERRNO_EVENT_SHOULD_NOT_DESTORY  | 0x02001c08 | 事件链表上仍有任务，无法被销毁                            | 先检查事件链表是否为空    |
   
![](https://support.huaweicloud.com/kernelmanual-LiteOS/public_sys-resources/notice_3.0-zh-cn.png)
错误码定义见[错误码简介](https://support.huaweicloud.com/kernelmanual-LiteOS/zh-cn_topic_0311018405.html#ZH-CN_TOPIC_0311018405__zh-cn_topic_0175230332_section29852515161)。8\~15位的所属模块为事件模块，值为0x1c。
#### 开发流程
使用事件模块的典型流程如下：
1. 执行make menuconfig命令，进入Kernel ---\> Enable Event菜单，完成事件模块的配置。
   
   | 配置项                         | 含义           | 取值范围   | 默认值  | 依赖                    |
   |:---|:---|:---|:---|:---|
   | LOSCFG_BASE_IPC_EVENT       | 事件功能的裁剪开关    | YES/NO | YES  | 无                     |
   | LOSCFG_BASE_IPC_EVENT_LIMIT | 最大支持的事件控制块数量 | 无      | 1024 | LOSCFG_BASE_IPC_EVENT |
      
   
2. 调用事件初始化LOS_EventInit接口，初始化事件等待队列。
3. 写事件LOS_EventWrite，写入指定的事件类型。
4. 读事件LOS_EventRead，可以选择读取模式。
5. 清除事件LOS_EventClear，清除指定的事件类型。
 
#### 平台差异性
无。
