Bearpi开发板之HarmonyOS事件管理
事件基本概念
事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用32位无符号整型变量来表示,每一位代表一个事件。
事件运作机制
- 读事件时,可以根据入参事件掩码类型uwEventMask读取事件的单个或者多个事件类型。事件读取成功后,如果设置LOS_WAITMODE_CLR会清除已读取到的事件类型,反之不会清除已读到的事件类型,需显式清除。可以通过入参选择读取模式,读取事件掩码类型中所有事件还是读取事件掩码类型中任意事件。
- 写事件时,对指定事件写入指定的事件类型,可以一次同时写多个事件类型。写事件会触发任务调度。
- 清除事件时,根据入参事件和待清除的事件类型,对事件对应位进行清0操作。
cmsis_os2的API事件接口简介
- 创建事件标记对象:osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr);
- 设置事件标记:uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags);
- 等待事件标记触发:uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout);
- 删除事件标记对象:osStatus_t osEventFlagsDelete (osEventFlagsId_t ef_id);
创建一个事件对象和2个任务,一个任务用于设置事件标志,另一个事件用于等待事件标志
#include #include #include "ohos_init.h"#include #include "cmsis_os2.h"#include "wifiiot_gpio.h"#include "wifiiot_gpio_ex.h"#define FLAGS_MSK1 0x00000001Uvoid thread1(void *p){ uint32_t flags; while(1) { flags = osEventFlagsSet(p,FLAGS_MSK1); printf("event set flags is 0x%04x\n",flags);osDelay(100); }}void thread2(void *p){ uint32_t flags; while(1) { flags = osEventFlagsWait(p,FLAGS_MSK1,osFlagsWaitAny,osWaitForever); printf("Receive Flags is 0x%04x\n", flags); osDelay(50); }}void my_led_example(void){ GpioInit(); IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_GPIO); GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_DIR_OUT); osThreadAttr_t attr; attr.attr_bits = 0; attr.cb_mem = NULL; attr.cb_size = 0; attr.stack_mem = NULL; attr.stack_size = 1024; attr.priority = 25; static osEventFlagsId_t event; event = osEventFlagsNew(NULL); if (event == NULL) {printf("Falied to create EventFlags!\n"); } osThreadId_t id = osThreadNew(thread1,event,&attr); if(id == NULL) { printf("Falied to create thread1!\n"); } id = osThreadNew(thread2,event,&attr); if(id == NULL) { printf("Falied to create thread2!\n"); }}SYS_RUN(my_led_example);
- 编译烧录运行
扩展实验代码
#include #include #include "ohos_init.h"#include #include "cmsis_os2.h"#include "wifiiot_gpio.h"#include "wifiiot_gpio_ex.h"#define FLAGS_MSK1 0x00000001U#define FLAGS_MSK2 0x00000002U#define FLAGS_MSK3 0x00000004Uvoid thread1(void *p){ while(1) { osEventFlagsSet(p,FLAGS_MSK1); osEventFlagsSet(p,FLAGS_MSK2); osEventFlagsSet(p,FLAGS_MSK3);osDelay(100); }}void thread2(void *p){ uint32_t flags; while(1) { flags = osEventFlagsWait(p,FLAGS_MSK1 | FLAGS_MSK2 | FLAGS_MSK3,osFlagsWaitAll,osWaitForever); printf("Receive Flags is 0x%04x\n", flags); osDelay(50); }}void my_led_example(void){ GpioInit(); IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_GPIO); GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_DIR_OUT); osThreadAttr_t attr; attr.attr_bits = 0; attr.cb_mem = NULL; attr.cb_size = 0; attr.stack_mem = NULL; attr.stack_size = 1024; attr.priority = 25; static osEventFlagsId_t event; event = osEventFlagsNew(NULL); if (event == NULL) {printf("Falied to create EventFlags!\n"); } osThreadId_t id = osThreadNew(thread1,event,&attr); if(id == NULL) { printf("Falied to create thread1!\n"); } id = osThreadNew(thread2,event,&attr); if(id == NULL) { printf("Falied to create thread2!\n"); }}SYS_RUN(my_led_example);
- 编译烧录运行