Bearpi开发板之HarmonyOS事件管理

news/2024/7/21 12:09:01 标签: harmonyos, Bearpi开发板, 事件管理

事件基本概念

事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用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 <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include <string.h>
#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 <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include <string.h>
#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);
  • 编译烧录运行
    在这里插入图片描述

http://www.niftyadmin.cn/n/1226527.html

相关文章

使用MicroPython制作植物土壤水分监控

我们将探索将数据记录与数据可视化相结合。 我们将使用HTML服务器等技术。 我们还将看到如何使用模拟传感器-一种产生模拟数据的传感器&#xff0c;然后我们必须对其进行解释。 实际上&#xff0c;我们将依靠电路板的模数转换&#xff08;ADC&#xff09;功能将读取的电压更改为…

Bearpi开发板之HarmonyOS互斥锁

互斥锁的概念 1、互斥锁又称互斥型信号量&#xff0c;是一种特殊的二值性信号量&#xff0c;用于实现对共享资源的独占式处理。 2、任意时刻互斥锁的状态只有两种&#xff1a;开锁或闭锁。 3、当有任务持有时&#xff0c;互斥锁处于闭锁状态&#xff0c;这个任务获得该互斥锁的…

MicroPython和MQTT云端迷你气象站

我们将实施简化的气象站物联网解决方案。 我们将使用分线板上的小型传感器记录温度&#xff0c;大气压力和湿度。 虽然这三个数据点并非完全是一个完整的&#xff0c;专业的&#xff08;业余爱好者较少&#xff09;等级的天气解决方案&#xff0c;但它可以准确地向您显示从传感…

Bearpi开发板之HarmonyOS消息队列

消息队列的概念 消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;实现了接收来自任务或中断的不固定长度的消息&#xff0c;并根据不同的接口选择传递消息是否存放在自己空间。任务能够从队列里面读取消息&#xff0c;当队列中的消息是空时&#xff0c;挂起…

ARM Mbed数字信号处理

信号处理对于许多应用而言很重要。 借助现代计算机的强大功能&#xff0c;许多信号处理功能现在都可以通过数字方式完成。 本文&#xff0c;我们将说明如何使用Arm Mbed -DSP库进行数字信号处理和控制。 低通滤波器 在Arm Mbed 网站上&#xff0c;有关于如何设计和实现低通FI…

S132协议栈之Response广播

初时化广播代码 static uint8_t rsp_data[1]; static ble_advdata_manuf_data_t m_rsp_spec_data; /**brief Function for initializing the Advertising functionality.*/ static void advertising_init(void) {uint32_t err_code;ble_advertising_init_t init…

ARM Mbed在线IDE编程意法半导体(ST)开发板

硬件 软件 介绍 STM32F407发现板不直接支持MBED在线IDE。 但是该板上的MCU也用于另一块官方MBED板上&#xff08;Seeed Studio Arch Max v1.1&#xff09;。 因此&#xff0c;可以通过将发现板当作Arch Max板进行编程。 这是使用MBED在线IDE快速进行原型制作的一种简便方法…

Bearpi开发板HarmonyOS之GPIO中断

GPIO 中断API介绍 wifiiot_gpio.h中包含声明GPIO中断相关函数 设置GPIO引脚中断功能 unsigned int GpioRegisterIsrFunc(WifiIotGpioIdx id, WifiIotGpioIntType intType, WifiIotGpioIntPolarity intPolarity, GpioIsrCallbackFunc func, char *arg);取消GPIO引脚中断功能 u…