鸿蒙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,细节流程如下:

复制代码
SHELL
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接口流程

复制代码
SHELL
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

复制代码
SHELL
HdfDeviceRegisterEventListener
    -> HdfDeviceRegisterEventListenerWithSchedPolicy
        -> HdfIoServiceStartListen
            -> HdfIoServiceThreadBindLocked
                -> HdfDevListenerThreadInit
                    -> HdfDevListenerThreadDoInit
                        -> OsalThreadCreate HdfDevEventListenTask
            -> HdfDevListenerThreadStart
                -> HdfAdapterStartListenIoctl  
                    -> ioctl  - HDF_LISTEN_EVENT_START
                -> OsalThreadStart HdfDevEventListenTask

调到最后,就是通过osal的接口OsalThreadCreate创建线程,OsalThreadStart开始线程,而对应的线程就是下面的HdfDevEventListenTask:

复制代码
SHELL
HdfDevEventListenTask  - poll
    -> HdfDevEventReadAndDispatch  
        -> ioctl - HDF_READ_DEV_EVENT
        -> HdfDevEventDispatchLocked
            -> listener->callBack

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

有关进阶鸿蒙开发核心技术,可以前往主页查看更多。鸿蒙技术学习路线(略缩图)分布如下:

高清完整版获取可前往主页保存,另附鸿蒙文档

相关推荐
阿里嘎多学长9 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
这个DBA有点耶10 小时前
研发规模/投入最大的国产数据库厂商是谁?拆解五个衡量维度
数据库·程序员·产品
Flutter_OH12 小时前
Flutter OHOS 三方库与插件适配相关问题
harmonyos
Flutter_OH12 小时前
Flutter OHOS ohos应用编译相关问题
harmonyos
挖掘狂人14 小时前
哈希算法:一根看不见的 "指纹",如何撑起整个互联网
算法·程序员·掘金技术征文
hoLzwEge14 小时前
AI签到「一劳永逸」
人工智能·程序员·ai编程
马剑威(威哥爱编程)15 小时前
【共创稿事节】HarmonyOS 7 Agent 开发实战 01:云端大模型 API 接入底座
华为·harmonyos
万物智能信息科技17 小时前
人体感应芯片PIR模块驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·嵌入式硬件·华为·开源·harmonyos
m0_7381858217 小时前
Flutter 鸿蒙化实战:sqflite 适配 OpenHarmony,本地 SQLite 数据库
flutter·华为·harmonyos·鸿蒙
SimonKing18 小时前
数据不出本机!本地全文检索+知识图谱,可以试试这个开源项目:KnowSeek
后端·程序员