概述
事件是AliOS Things内核提供的一种任务间通信方式,它不同于信号量和互斥量,可以使用事件组实现一个任务同时等待多个事件的发生,或者等待同一个事件的任务在事件发生时解除阻塞状态。事件组是一个32位的数,每一位都对应一个事件标志,事件标志只有两种状态:
1 代表被设置,即当有事件发生时,该事件对应的事件标志位将被设置为1
0 代表被清除,即任务获得事件后,将事件对应的事件标志位被清除为0。
应用程序可以使用事件的如下特性来实现任务间同步:
任务可以等待事件组中设置的所有事件都发生后,即“与”的方式,任务才解除阻塞进入就绪状态;
任务可以等待事件组中设置的任意一个事件发生,即“或”的方式,任务就解除阻塞进入就绪状态;
如果有多个任务等待同一事件,当事件发生时,若任务等待条件满足均会解除阻塞。
超时时间
事件等待可设置超时时间,如果任务在超时时间到期后仍未等到事件发生,则任务解除阻塞进入就绪状态。
事件功能函数
函数名 | 描述 |
aos_event_create() | 事件创建函数(推荐) |
aos_event_new() | 事件创建函数(兼容3.1) |
aos_event_free() | 事件删除函数 |
aos_event_get() | 获取事件函数 |
aos_event_set() | 设置事件函数 |
aos_event_is_valid() | 判断事件具柄是否合法函数 |
常用配置
事件功能:默认使能,如需修改,在YAML中修改RHINO_CONFIG_EVENT_FLAG配置
def_config:
RHINO_CONFIG_EVENT_FLAG: 0
API说明
使用示例
示例代码参考example/event_example.c,该示例使用事件机制实现任务间同步,具体场景为创建任务A和认为B,以及一事件。任务A以“与”的方式等待事件1和事件2;任务B以“或”的方式等待事件1和事件2。测试任务T设置事件1,则任务B因获取事件得到运行,之后测试任务T设置事件2,则任务A因等到全部事件而得到运行。
示例说明如下:
t0时刻,任务T调用aos_event_create()创建一事件。任务T然后调用aos_task_create()创建任务A和任务B。任务A调用aos_event_get()以RHINO_AND为选项参数等待事件1和事件2的发生;任务B调用aos_event_get()以RHINO_OR为选项参数等待事件1或事件2的发生。
t1时刻,任务T调用aos_event_get()设置事件1,任务B因等到事件1得到运行。
t2时刻,任务T调用aos_event_get()设置事件2,任务A因等到了所有事件1和2而得到运行。
该示例可配置到helloworld_demo中运行,相关代码的下载、编译和固件烧录均依赖AliOS Things配套的开发工具 ,所以首先需要参考《AliOS Things集成开发环境使用说明之搭建开发环境》,下载安装 。 待开发环境搭建完成后,可以按照以下步骤进行示例的测试。
步骤1 创建或打开工程
打开已有工程
如果用于测试的案例工程已存在,可参考《AliOS Things集成开发环境使用说明之打开工程》打开已有工程。
创建新的工程
组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择helloworld_demo案例。helloworld_demo案例相关的源代码下载可参考《AliOS Things集成开发环境使用说明之创建工程》。
步骤2 添加组件
案例下载完成后,需要在helloworld_demo组件的package.yaml中添加对组件的依赖:
depends:
- osal_aos: dev_aos # helloworld_demo中引入osal_aos组件
步骤3 下载组件
在已安装了的开发环境工具栏中,选择Terminal -> New Terminal启动终端,并且默认工作路径为当前工程的workspace,此时在终端命令行中输入:
aos install osal_aos
上述命令执行成功后,组件源码则被下载到了./components/osal_aos路径中。
步骤4 添加示例
在osal_aos组件的package.yaml中添加example示例代码:
depends:
- rhino: dev_aos
- cli: dev_aos # 添加cli依赖
source_file:
- "*.c"
- "example/evnet_example.c" # 添加 evnet_example.c
步骤5 编译固件
在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译helloworld_demo案例来生成固件了,具体编译方法可参考《AliOS Things集成开发环境使用说明之编译固件》。
步骤6 烧录固件
helloworld_demo案例的固件生成后,可参考《AliOS Things集成开发环境使用说明之烧录固件》来烧录固件。
步骤7 打开串口
固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考《AliOS Things集成开发环境使用说明之查看日志》。
当串口终端打开成功后,可在串口中输入help来查看已添加的测试命令。
步骤8 测试示例
CLI命令行输入:
event_example
关键日志:
[aos_event_example]set event 1!
[aos_event_example][taskA]field1=0, field2=0, field3=0, field4=0
[aos_event_example]set event 2!
[aos_event_example][taskB]field1=1123961442, field2=1123961442, field3=1123961442, field4=1123961442
注意事项
在删除事件时,如果有任务阻塞在该事件上,则将这些任务从此事件上脱离,这种任务行为像是事件发生导致的,但实际上并非如此。所以删除事件时需要谨慎。
FAQ
Q1: 调用aos_event_get()接口无限期的等待事件,timeout参数怎么设置? 答:将timeout赋值为AOS_WAIT_FOREVER。