您当前的位置: 首页 >  HarmonyOS

仙剑情缘

暂无认证

  • 0浏览

    0关注

    333博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Bearpi开发板之HarmonyOS事件管理

仙剑情缘 发布时间:2022-05-02 10:01:46 ,浏览量:0

事件基本概念

事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用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 0x00000001U

void 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 0x00000004U

void 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);
  • 编译烧录运行 在这里插入图片描述
关注
打赏
1658017818
查看更多评论
立即登录/注册

微信扫码登录

0.0386s