当前位置: 首页 > news >正文

OpenHarmony之消息机制实现

OpenHarmony之消息机制实现

背景

在之前的介绍(OpenHarmony之HDF驱动框架)中,了解到OpenHarmony的消息机制主要有以下两种:

  • 用户态应用发送消息到驱动。
  • 用户态应用接收驱动主动上报事件。

下面我们分别来看看两种机制用户态的流程及实现

用户态应用发送消息到驱动

用户态主要代码

struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME);......ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_WRITE_READ, data, reply);
if (ret != HDF_SUCCESS) {HDF_LOGE("fail to send service call");goto out;
}

重点就是通过HdfIoServiceBind绑定服务,调用服务的Dispatch接口

HdfIoServiceBind接口流程

HdfIoServiceBind接口的主要作用是open对应服务的字符设备节点/dev/hdf/serviceName,细节流程如下:

HdfIoServiceBind(`drivers/hdf_core/framework/core/shared/src/hdf_io_service.c`)-> HdfIoServiceAdapterObtain-> open /dev/hdf/serviceName-> .Dispatch = HdfSyscallAdapterDispatch

HdfIoServiceAdapterObtain函数有两处实现:

  • 针对内核态,给内核用:drivers/hdf_core/framework/core/adapter/vnode/src/hdf_vnode_adapter.c
  • 针对用户态,给应用用:drivers/hdf_core/framework/core/adapter/syscall/src/hdf_syscall_adapter.c

这里主要看用户态的实现,即hdf_syscall_adapter.c

Dispatch接口流程

serv->dispatcher->Dispatch()
dispatcher -> Dispatch()-> HdfSyscallAdapterDispatch -> ioctl - HDF_WRITE_READ

最底层就是通过系统调用ioctl来读写消息(HDF_WRITE_READ)。

用户态应用接收驱动上报事件

用户态代码

struct HdfIoService *serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME);......static struct HdfDevEventlistener listener = {.callBack = OnDevEventReceived,.priv ="Service0"
};if (HdfDeviceRegisterEventListener(serv, &listener) !=          HDF_SUCCESS) {HDF_LOGE("fail to register event listener");return HDF_FAILURE;
}

主要是通过HdfDeviceRegisterEventListener注册回调函数

HdfDeviceRegisterEventListener函数流程

drivers/hdf_core/framework/core/adapter/syscall/src/hdf_syscall_adapter.c

HdfDeviceRegisterEventListener-> HdfDeviceRegisterEventListenerWithSchedPolicy-> HdfIoServiceStartListen-> HdfIoServiceThreadBindLocked-> HdfDevListenerThreadInit-> HdfDevListenerThreadDoInit-> OsalThreadCreate HdfDevEventListenTask-> HdfDevListenerThreadStart-> HdfAdapterStartListenIoctl  -> ioctl  - HDF_LISTEN_EVENT_START-> OsalThreadStart HdfDevEventListenTask

以上的核心就是基于poll,通过ioctl来读取消息(HDF_READ_DEV_EVENT),然后再去调用上面传过来的回调函数

总结

以上只是消息机制核外用户态的实现,最后会执行到系统调用

以上的内容只是简单介绍了OpenHarmony之消息机制实现,没有具体到代码分析,移植等细节。

要想成为一名鸿蒙高级开发,以上知识点是必须要掌握的,除此之外,还需要掌握一些鸿蒙应用开发相关的一些技术,需要我们共同去探索。

为了节省大家一些查找的时间,这边联合几位行业大佬,为大家准备了一份《Open Harmony4.0&Next》的学习导图从入门到进阶再到南向开发实战的一整套完整体系,想要学习了解更多鸿蒙开发的相关知识可以借鉴:

除了以上的知识内容,我还为大家整理了一份《鸿蒙 (Harmony OS)开发学习手册》都是整理成PDF文档方式,分享给大家参考学习:《鸿蒙开发学习指南》

《鸿蒙 (Harmony OS)开发学习手册》

一、入门必看

1. 应用开发导读(ArkTS)

2. 应用开发导读(Java)

3.......

二、HarmonyOS 概念

1. 系统定义

2. 技术架构

3. 技术特性

4. 系统安全

5......

三、如何快速入门?《做鸿蒙应用开发到底学习些啥?》

1. 基本概念

2. 构建第一个ArkTS应用

3. 构建第一个JS应用

4. ……

四、开发基础知识

1. 应用基础知识

2. 配置文件

3. 应用数据管理

4. 应用安全管理

5. 应用隐私保护

6. 三方应用调用管控机制

7. 资源分类与访问

8. 学习ArkTS语言

9. ……

五、基于ArkTS 开发

1. Ability开发

2. UI开发

3. 公共事件与通知

4. 窗口管理

5. 媒体

6. 安全

7. 网络与链接

8. 电话服务

9. 数据管理

10. 后台任务(Background Task)管理

11. 设备管理

12. 设备使用信息统计

13. DFX

14. 国际化开发

15. 折叠屏系列

16. ……

相关文章:

  • 将PPT4页并排成1页
  • 全志F1C100s Linux 系统编译出错:不能连接 github
  • 计算机基础面试题 |11.精选计算机基础面试题
  • C语言实验4:指针
  • VUE--保留小数(过滤器)
  • 在Go语言中处理HTTP请求中的Cookie
  • Huggy Lingo: 利用机器学习改进 Hugging Face Hub 上的语言元数据
  • 第11章 GUI Page462~476 步骤二十三 步骤二十四 Undo/Redo ②“添加操作”支持“Undo/Redo”
  • Android开发中“真正”的仓库模式
  • vue项目报错RangeError: Maximum call stack size exceeded
  • RMAN-03002 RMAN-06059 ORA-19625
  • Ubuntun使用ISO镜像中的软件包作为本地镜像源
  • 2024年MySQL学习指南(四),探索MySQL数据库,掌握未来数据管理趋势
  • 云计算:OpenStack 分布式架构部署(单控制节点与单计算节点)
  • JMeter使用
  • 自己简单写的 事件订阅机制
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • avalon2.2的VM生成过程
  • CSS中外联样式表代表的含义
  • docker容器内的网络抓包
  • ES6 ...操作符
  • JS+CSS实现数字滚动
  • PHP变量
  • webpack入门学习手记(二)
  • 笨办法学C 练习34:动态数组
  • 编写符合Python风格的对象
  • 初探 Vue 生命周期和钩子函数
  • 高度不固定时垂直居中
  • 给新手的新浪微博 SDK 集成教程【一】
  • 工作手记之html2canvas使用概述
  • 判断客户端类型,Android,iOS,PC
  • 使用Swoole加速Laravel(正式环境中)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 小程序开发之路(一)
  • ​ArcGIS Pro 如何批量删除字段
  • ​iOS实时查看App运行日志
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (笔试题)分解质因式
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)Controller接口控制器详解(三)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .aanva
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .gitignore
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET4.0并行计算技术基础(1)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • // an array of int
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Documented注解的作用