Niobe开发板OpenHarmony内核编程开发——事件标志

news/2024/11/28 15:50:00/

本示例将演示如何在Niobe Wifi IoT开发板上使用cmsis 2.0 接口使用事件标志同步线程

EventFlags API分析

osEventFlagsNew()

    /// Create and Initialize an Event Flags object./// \param[in]     attr          event flags attributes; NULL: default values./// \return event flags ID for reference by other functions or NULL in case of error.
osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)

描述:

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

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

参数:

名字描述
attr事件标志属性;空:默认值.

osEventFlagsSet()

   /// Set the specified Event Flags./// \param[in]     ef_id         event flags ID obtained by \ref osEventFlagsNew./// \param[in]     flags         specifies the flags that shall be set./// \return event flags after setting or error code if highest bit set.
uint32_t osEventFlagsSet(osEventFlagsId_t ef_id,uint32_t flags)

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

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

参数:

名字描述
ef_id事件标志由osEventFlagsNew获得的ID.
flags指定设置的标志.
return返回设置的事件标志,或者如果高位设置值则返回错误码.

osEventFlagsWait()

       /// Wait for one or more Event Flags to become signaled./// \param[in]     ef_id         event flags ID obtained by \ref osEventFlagsNew./// \param[in]     flags         specifies the flags to wait for./// \param[in]     options       specifies flags options (osFlagsXxxx)./// \param[in]     timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out./// \return event flags before clearing or error code if highest bit set.
uint32_t osEventFlagsWait(osEventFlagsId_t ef_id,uint32_t flags,uint32_t options,uint32_t timeout)

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

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

参数:

名字描述
ef_id事件标志由osEventFlagsNew获得的ID.
flags指定要等待的标志.
options指定标记选项.
timeout超时时间,0表示不超时
return返回设置的事件标志,或者如果高位设置值则返回错误码.

软件设计

软件设计

主要代码分析

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

/***发送事件*\param[in] argument 发送参数*/
void OS_Thread_EventSender(void *argument)
{osEventFlagsId_t flags;(void)argument;while (1){/// Set the specified Event Flags./// \param[in]     ef_id         event flags ID obtained by \ref osEventFlagsNew./// \param[in]     flags         specifies the flags that shall be set./// \return event flags after setting or error code if highest bit set.flags = osEventFlagsSet(g_event_flags_id, FLAGS_MSK1);printf("Sender Flags is %d\n", flags);//挂起线程,让位其他线程调度osThreadYield();osDelay(100);}
}/***  接收事件* \param[in] argument 发送参数
*/
void OS_Thread_EventReceiver(void *argument)
{(void)argument;uint32_t flags;while (1){/// Wait for one or more Event Flags to become signaled./// \param[in]     ef_id         event flags ID obtained by \ref osEventFlagsNew./// \param[in]     flags         specifies the flags to wait for./// \param[in]     options       specifies flags options (osFlagsXxxx)./// \param[in]     timeout       \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out./// \return event flags before clearing or error code if highest bit set.flags = osEventFlagsWait(g_event_flags_id, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);printf("Receive Flags is %d\n", flags);}
}/*** 事件测试Example
*/
static void OS_Event_example(void)
{//  ==== Event Flags Management Functions ====/// Create and Initialize an Event Flags object./// \param[in]     attr          event flags attributes; NULL: default values./// \return event flags ID for reference by other functions or NULL in case of error.g_event_flags_id = osEventFlagsNew(NULL);if (g_event_flags_id == NULL){printf("Falied to create EventFlags!\n");return;}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";/// Create a thread and add it to Active Threads./// \param[in]     func          thread function./// \param[in]     argument      pointer that is passed to the thread function as start argument./// \param[in]     attr          thread attributes; NULL: default values./// \return thread ID for reference by other functions or NULL in case of error//osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);if (osThreadNew(OS_Thread_EventSender, NULL, &attr) == NULL){printf("Falied to create Thread_EventSender!\n");return;}attr.name = "Thread_EventReceiver";if (osThreadNew(OS_Thread_EventReceiver, NULL, &attr) == NULL){printf("Falied to create Thread_EventReceiver!\n");return;}
}

编译调试

修改 BUILD.gn 文件

修改 applications\app路径下 BUILD.gn 文件,指定 os_event_example 参与编译。

#"TW001_OS_helloworld:helloworld_example",
#"TW002_OS_thread:os_thread_example",
#"TW003_OS_timer:os_timer_example",
"TW004_OS_event:os_event_example",
#"TW005_OS_mutex:os_mutex_example",
#"TW006_OS_semp:os_semaphore_example",
#"TW007_OS_message:os_message_example",

运行结果

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

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

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.ppmy.cn/news/1418558.html

相关文章

结构体是不同数据类型的集合

1.如何定义结构体 每个成员列表都是结构体中的域&#xff0c;也被称为域表 细节问题&#xff1a; 编程习惯要求结构体名大写开头 strcuct 告诉系统是一个结构体 最后的分号不能忘 #include <stdio.h>struct Student {int num;char name[32];char sex;int age;double sc…

4.11 驱动开发

作业 3.1 实验现象 crw------- 1 root root 236, 0 Apr 11 15:55 /dev/myled0 crw------- 1 root root 236, 1 Apr 11 15:55 /dev/myled1 crw------- 1 root root 236, 2 Apr 11 15:55 /dev/myled2在串口工具&#xff0c;输入如下命令实现控制对应的LED灯进行工作echo 1 >…

使用 Prometheus 在 KubeSphere 上监控 KubeEdge 边缘节点(Jetson) CPU、GPU 状态

作者&#xff1a;朱亚光&#xff0c;之江实验室工程师&#xff0c;云原生/开源爱好者。 KubeSphere 边缘节点的可观测性 在边缘计算场景下&#xff0c;KubeSphere 基于 KubeEdge 实现应用与工作负载在云端与边缘节点的统一分发与管理&#xff0c;解决在海量边、端设备上完成应…

ffmpeg cuda硬件解码后处理使用opengl渲染,全硬件流程

1 ffmpeg 硬件解码 使用硬件解码后不要transfer到内存&#xff0c;使用cuda转化nv12 -> bgr24 转化完毕后cuda里面存了一份bgr24 2 gpumat 和 cuda 互操作 如果需要opencv gpumat直接使用cuda内存&#xff0c;则可以手动构造gpumat 可以使用gpumat的各种函数 uchar3* cu…

【面经】4月9日 腾讯/csig/腾讯云/一面/1h30m

自我介绍 项目&#xff1a; 介绍项目 你这个项目和别人已有系统的项目相比&#xff0c;优势在哪里&#xff1f;如果别人系统的数据要迁到你这个系统里来&#xff0c;应该怎么做&#xff1f; 服务部署有了解吗&#xff1f;一个节点如果只能部署一个服务不是很浪费吗&#xff1f…

rocketmq面试

broker主从复制机制 同步复制&#xff1a; 等Master和Slave均写成功后&#xff0c;才反馈给客户端写成功状态&#xff1b; 如果Master出故障&#xff0c; Slave上有全部的备份数据&#xff0c;容易恢复&#xff0c;但是同步复制会增大数据写入延迟&#xff0c;降低系统吞吐量。…

今天掏心窝子!聊聊35岁了程序员何去何从?

今天的内容不聊技术&#xff0c;聊聊轻松的话题&#xff0c;脑子高速转了好几周&#xff0c;停下来思考一下人生…… 不对&#xff0c;关于35岁的问题好像也不轻松&#xff0c;些许有点沉重&#xff0c;反正不是技术&#xff0c;不用高速转动脑细胞了&#xff0c;哈哈。 兄弟…

Git 自定义命令

前言 在使用 hexo 搭建个人博客时&#xff0c;共两种部署的方法。分别为&#xff1a; 本地利用 hexo 的插件 hexo-deployer-git 来实现部署&#xff0c;缺点是需要多敲几个命令行且不方便对源码进行云端备份使用 Github Action 的 workflow 自动化部署&#xff0c;优势就是可…