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


http://www.niftyadmin.cn/n/5306501.html

相关文章

怎么让视频进行加速处理并保存

要加速处理视频并保存,可以使用专业的视频编辑软件或者一些在线工具。以下是一种常见的方法,使用FFmpeg这个开源工具。请确保你已经安装了FFmpeg。 打开命令行界面: 打开终端或命令提示符窗口。 使用以下命令进行视频加速处理: f…

maven pom.xml 加载本地.jar库文件方法

一般我们使用的jar包,都是从maven仓库中加载的, 那如果是从本地该如何加载呢? 本文介绍maven加载本地jar的方法 在 pom.xml 的 dependencies 节点内增加以下配置即可 <dependency> <groupId>cn.tekin</groupId> <artifactId>mylib</artifactI…

AI视频何时才能跑出一个“Midjourney ”?

文&#xff5c;郝 鑫 编&#xff5c;刘雨琦 AI视频一跃成为“明日之星”&#xff0c;大厂和创业公司们打得热火朝天。 去年12月&#xff0c;Pika的出现仿佛点燃了AI视频赛道的引线&#xff0c;一个月之内冒出了近十家公司&#xff0c;谷歌、阿里、字节、腾讯竞相下场&…

【数据采集与预处理】流数据采集工具Flume

一、Flume简介 数据流 &#xff1a;数据流通常被视为一个随时间延续而无限增长的动态数据集合&#xff0c;是一组顺序、大量、快速、连续到达的数据序列。通过对流数据处理&#xff0c;可以进行卫星云图监测、股市走向分析、网络攻击判断、传感器实时信号分析。 &#xff08;…

英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述(CMU,CCM,TBU,MON)

英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述(CMU,CCM,TBU,MON) 1 时钟管理单元(CMU)2 集群配置模块(CCM)3 时基单元(TBU)4 监控单元(MON)5 总结由前文的各篇内容,开发者已经知道如何使用GTM的大部分功能,在这些功能中,都需要一个信息就是fGTM 的数据,我们在前…

【金猿人物展】龙船科技CEO杜忠平:交通运输数据要素市场化及其时空大数据应用思考...

‍ 杜忠平 本文由龙船科技CEO杜忠平撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度趋势人物榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 麦肯锡的研究报告早在 2014 年数据流动直接创造的价值就高达2.3万亿美元&#xff0c;高于国际人口…

【网络技术】【Kali Linux】Wireshark嗅探(七)超文本传送协议(HTTP)

一、实验目的 本次实验使用Wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解超文本传送协议&#xff08;HTTP&#xff09;的工作原理。 二、HTTP协议概述 超文本传送协议&#xff08; H yper T ext T ransfer P rotocol, HTTP&#xff09;是互联网应用层的一个重要协…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…