HarmonyOS系统内核中使用事件标志的方法

简介: 大家好,今天主要和大家聊一聊,如何利用HarmonyOS系统中事件标志。

162c8abeada2442797c63b0ed365a33d.png

第一:事件标志简介

     每个事件标志由一个位表示,每个事件标志按照32个字节为一组的形式排列,线程可以同时对组中的所有32个事件标记执行操作。

第二:事件标志API分析

     osEventFlagsNew()

osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)

   功能描述:


   osEventFlagsNew函数创建了一个新的事件标志对象,用于跨线程发送事件,并返回事件标志对象标识符的指针,或者在出现错误时返回NULL。可以在RTOS启动(调用osKernelStart)之前安全地调用该函数,但不能在内核初始化(调用osKernellnitialize)之前调用该函数。


注意:不能在中断服务函数中调用。

参数:

名字 描述

attr 事件标志属性;空:默认值.

osEventFlagsSet()

uint32_t osEventFlagsSet(osEventFlagsId_t ef_id,uint32_t flags)

 功能描述:osEventFlagsSet函数在一个由参数ef_id指定的事件标记对象中设置由参数flags指定的事件标记。

   注意:不能在中断服务中调用该函数

参数:

名字 描述

ef_id 事件标志由osEventFlagsNew获得的ID.

flags 指定设置的标志.

osEventFlagsWait()

uint32_t osEventFlagsWait(osEventFlagsId_t ef_id,uint32_t flags,uint32_t options,uint32_t tim

功能描述:osEventFlagsWait函数挂起当前运行线程,直到设置了由参数ef_id指定的事件对象中的任何或所有由参数flags指定的事件标志。当这些事件标志被设置,函数立即返回。否则,线程将被置于阻塞状态。


   注意 :如果参数timeout设置为0,可以从中断服务例程调用

参数:

名字 描述
ef_id 事件标志由osEventFlagsNew获得的ID.
flags 指定要等待的标志.
options 指定标记选项.
timeout 超时时间,0表示不超时

第三:软件设计

在Event_example函数中,通过osEventFlagsNew()函数创建了事件标记ID,Thread_EventReceiver()函数中通过osEventFlagsWait()函数一直将线程置于阻塞状态,等待事件标记。在Thread_EventSender()函数中通过osEventFlagsSet()函数每隔1S设置的标志,实现任务间的同步。

void Thread_EventSender (void *argument) 
{
  (void)argument;
  while (1) 
  {    
    osEventFlagsSet(evt_id, FLAGS_MSK1);
    osThreadYield();                            // suspend thread
    osDelay(100);
  }
}
void Thread_EventReceiver (void *argument) 
{
  (void)argument;
  uint32_t flags;
  while (1) 
  {
    flags = osEventFlagsWait(evt_id, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
    printf("Receive Flags is %d\n",flags);
  }
}
static void Event_example (void) 
{
  evt_id = osEventFlagsNew(NULL);
  if (evt_id == NULL) {
    printf("Falied to create EventFlags!\n");
  }
  osThreadAttr_t attr;
  attr.attr_bits = 0U;
  attr.cb_mem = NULL;
  attr.cb_size = 0U;
  attr.stack_mem = NULL;
  attr.stack_size = 1024*4;
  attr.priority = 25;
  attr.name = "Thread_EventSender";
  if (osThreadNew(Thread_EventSender, NULL, &attr) == NULL) {
      printf("Falied to create Thread_EventSender!\n");
  }
  attr.name = "Thread_EventReceiver";
  if (osThreadNew(Thread_EventReceiver, NULL, &attr) == NULL) {
      printf("Falied to create Thread_EventReceiver!\n");
  }
} 

第四:编译与调试

   修改 BUILD.gn 文件

修改 applications\BearPi\BearPi-HM_Nano\sample路径下 BUILD.gn 文件,指定 event_example 参与编译。

#"A1_kernal_thread:thread_example",
#"A2_kernel_timer:timer_example",
"A3_kernel_event:event_example",
#"A4_kernel_mutex:mutex_example",
#"A5_kernel_semaphore:semaphore_example",
#"A6_kernel_message:message_example",

第五:运行结果

   示例代码编译烧写后,按下开发板的RESET按键,通过串口助手查看日志,会每隔1S输出一次日志。

Receive Flags is 1
Receive Flags is 1
Receive Flags is 1
Receive Flags is 1
Receive Flags is 1


目录
相关文章
|
24天前
|
JavaScript 前端开发 物联网
「Mac畅玩鸿蒙与硬件1」鸿蒙开发环境配置篇1 - 认识鸿蒙系统与开发工具
本篇将介绍鸿蒙操作系统(HarmonyOS)的基本概念以及在 Mac 环境下进行鸿蒙开发所需的工具。通过了解鸿蒙系统和开发工具的特点,为后续的学习和实践奠定基础。
72 1
「Mac畅玩鸿蒙与硬件1」鸿蒙开发环境配置篇1 - 认识鸿蒙系统与开发工具
|
18天前
|
监控 UED 开发者
鸿蒙next版开发:订阅应用事件(ArkTS)
在HarmonyOS 5.0中,ArkTS引入了强大的应用事件订阅机制,允许开发者订阅和处理系统或应用级别的事件,这对于监控应用行为、优化用户体验和进行性能分析至关重要。本文详细介绍了如何在ArkTS中订阅应用事件,并提供了示例代码,包括导入模块、创建观察者、设置事件参数等步骤。通过这些方法,开发者可以更智能地管理和响应应用事件。
72 11
|
17天前
|
监控 开发者 UED
鸿蒙5.0版开发:订阅卡死事件(ArkTS)
在HarmonyOS 5.0中,开发者可以通过ArkTS订阅应用的卡死事件,以便在应用卡死时进行处理。本文详细介绍如何在ArkTS中订阅卡死事件,并提供示例代码。通过导入hiAppEvent和hilog模块,设置自定义参数,添加事件观察者,开发者可以监控应用稳定性并在问题发生时快速定位原因。示例代码展示了如何创建按钮订阅卡死事件,并在事件发生时通过回调函数处理和记录日志。
39 5
|
17天前
|
监控 开发者 UED
鸿蒙5.0版开发:订阅资源泄漏事件(ArkTS)
在HarmonyOS 5.0中,资源泄漏是常见问题,尤其在多线程和复杂应用逻辑下。ArkTS提供了hiAppEvent模块来订阅和处理资源泄漏事件,帮助开发者监控和优化应用性能。本文详细介绍了如何在ArkTS中订阅资源泄漏事件,并提供了示例代码。通过导入hiAppEvent和hilog模块,添加事件观察者并实现回调函数,可以在资源泄漏事件发生时进行自定义处理,如记录日志、发送通知或执行资源清理操作。
63 4
|
2月前
|
存储 数据管理 调度
HarmonyOS架构理解:揭开鸿蒙系统的神秘面纱
【10月更文挑战第21天】华为的鸿蒙系统(HarmonyOS)以其独特的分布式架构备受关注。该架构包括分布式软总线、分布式数据管理和分布式任务调度。分布式软总线实现设备间的无缝连接;分布式数据管理支持跨设备数据共享;分布式任务调度则实现跨设备任务协同。这些特性为开发者提供了强大的工具,助力智能设备的未来发展。
91 1
|
2月前
|
安全 物联网 大数据
基于开元鸿蒙(OpenHarmony)的【智能药房与药品管理综合应用系统
基于开元鸿蒙(OpenHarmony)的【智能药房与药品管理综合应用系统
85 8
|
2月前
|
传感器 监控 算法
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
104 6
|
2月前
|
传感器 人工智能 监控
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
124 6
|
2月前
|
搜索推荐 物联网 开发工具
基于OpenHarmony(开源鸿蒙)的智慧医疗综合应用系统
基于OpenHarmony(开源鸿蒙)的智慧医疗综合应用系统
93 5
|
6月前
|
网络协议 安全 调度
阿里云公共DNS发布支持鸿蒙系统版的SDK
阿里云公共DNS发布支持鸿蒙系统版SDK,赋能鸿蒙开发者快速接入阿里云公共DNS服务。公共DNS将帮助接入的鸿蒙应用免除LocalDNS劫持困扰、解析加速、精准调度。
下一篇
无影云桌面