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. ......

相关推荐
子兮曰5 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
一只机电自动化菜鸟6 小时前
一建机电备考笔记(33) 机电专业技术(起重技术-吊装方案)(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计
kyriewen6 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧05136 小时前
ctf show web 入门42
android·前端·android studio
kyriewen6 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u6 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby7 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6737 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇7 小时前
前端转后端:SQL 是什么
前端
张元清8 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试