事件基本概念
事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用32位无符号整型变量来表示,每一位代表一个事件。
事件运作机制- 读事件时,可以根据入参事件掩码类型uwEventMask读取事件的单个或者多个事件类型。事件读取成功后,如果设置LOS_WAITMODE_CLR会清除已读取到的事件类型,反之不会清除已读到的事件类型,需显式清除。可以通过入参选择读取模式,读取事件掩码类型中所有事件还是读取事件掩码类型中任意事件。
- 写事件时,对指定事件写入指定的事件类型,可以一次同时写多个事件类型。写事件会触发任务调度。
- 清除事件时,根据入参事件和待清除的事件类型,对事件对应位进行清0操作。
- 创建事件标记对象: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);
#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);
- 编译烧录运行