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)开发学习手册》
一、入门必看
-
应用开发导读(ArkTS)
-
应用开发导读(Java)
3.......

二、HarmonyOS 概念
-
系统定义
-
技术架构
-
技术特性
-
系统安全
5......

三、如何快速入门?《做鸿蒙应用开发到底学习些啥?》
-
基本概念
-
构建第一个ArkTS应用
-
构建第一个JS应用
-
......

四、开发基础知识
-
应用基础知识
-
配置文件
-
应用数据管理
-
应用安全管理
-
应用隐私保护
-
三方应用调用管控机制
-
资源分类与访问
-
学习ArkTS语言
-
......

五、基于ArkTS 开发
-
Ability开发
-
UI开发
-
公共事件与通知
-
窗口管理
-
媒体
-
安全
-
网络与链接
-
电话服务
-
数据管理
-
后台任务(Background Task)管理
-
设备管理
-
设备使用信息统计
-
DFX
-
国际化开发
-
折叠屏系列
-
......
