> 文档中心 > Bearpi开发板之HarmonyOS事件管理

Bearpi开发板之HarmonyOS事件管理


事件基本概念

事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用32位无符号整型变量来表示,每一位代表一个事件。

事件运作机制

  • 读事件时,可以根据入参事件掩码类型uwEventMask读取事件的单个或者多个事件类型。事件读取成功后,如果设置LOS_WAITMODE_CLR会清除已读取到的事件类型,反之不会清除已读到的事件类型,需显式清除。可以通过入参选择读取模式,读取事件掩码类型中所有事件还是读取事件掩码类型中任意事件。
  • 写事件时,对指定事件写入指定的事件类型,可以一次同时写多个事件类型。写事件会触发任务调度。
  • 清除事件时,根据入参事件和待清除的事件类型,对事件对应位进行清0操作。

cmsis_os2的API事件接口简介

  1. 创建事件标记对象:osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr);
  2. 设置事件标记:uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags);
  3. 等待事件标记触发:uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout);
  4. 删除事件标记对象: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);
  • 编译烧录运行
    在这里插入图片描述

牙刷城