对openharmony HDF驱动框架的C/S设计模式和单例类的说明

news2025/2/19 14:42:26

在分析openharmony的HDF驱动框架时我们会发现用了很多面向对象的思想,例如类继承、接口、单例类等,本来应该是好事情,**但使用时对象之间的关系交错复杂,不太符合linux内核分层分模块的思路,导致整体理解起来比较困难,**再加上"C/S设计模式”和“观察者设计模式"更导致系统理解起来比较麻烦,本文便针对C/S设计模式和单例类这个问题做梳理。

C/S设计模式和单例类

通过对HDF框架的梳理我们可以得到下图的关系,我们可以看到几个关键的代码块(Block),例如设备管理者服务(DevmgrService)、设备服务管理者(DevSvcManager)以及设备宿主服务(DevHostService)都有客户端、接口、实例主体这三个角色相关联。本文的目的是介绍此种方法的"道"而非"术"(在总结一篇术的文章,但是篇幅巨大,没法看,只能一点一点的先拆成一部分一部分的),所以只会单拎出一个代码块来进行说明,让大家了解这种应用方法。
在这里插入图片描述✒️上图中设备宿主服务并没有使用单例模式,业务上此对象时需要建立多个的,放在此处主要为了说明C/S这种模式。

下面单独针对设备管理者服务(DevmgrService)进行说明

通过对代码的梳理可得代码流程如下图所示,由此可知此函数DevmgrServiceGetInstance的作用为创建DevMgr单实例对象,并为此对象设置好了具体的实现方法

在这里插入图片描述

为了更好的观察DevMgr实例的具体方法我们可以参看IDevmgrService对象的类图,由图中标号①与标号②中我们可以发现实际创建的对象为单实例的DevmgrService类型(采用的static类型的对象),而接收的对象(即返回值,标号②处)为IDevmgrService类型,由下面类图中的结构可知返回IDevmgrService类型相当于返回的单实例对象DevmgrService的super成员,可直接使用对应的接口函数
在这里插入图片描述
**在驱动框架需要使用DevmgrService提供对应的服务时,可通过DevmgrServiceClntGetInstance函数获取设备服务管理客户端(DevmgrServiceClnt)的实例,该实例包含一个指向IDevmgrService对象的指针,通过该指针可以使用DevmgrService提供的服务,即设备管理接口。**客户端可以调用设备管理服务提供的功能,即C/S设计模式。

在分析时可能有码友会有一个困惑,当客户端的成员变量只有一个接口对象时,获取的对象又为单实例,此次返回的实际就是设备管理者服务(DevmgrService)实例本身,两者获取的函数几乎相同(如下图),那**为何不直接调用服务本身呢?**例如直接舍弃DevmgrServiceClnt,直接使用DevmgrService。
在这里插入图片描述

关于这个问题我们相信如果直接使用DevmgrService本身应该也是可以实现的,但是职责不够清晰,扩展性差。通过下图(左边客户端,服务本身)来看他们分别提供的方法
在这里插入图片描述

DevmgrServiceClnt提供的方法如下:

  1. DevmgrServiceClntAttachDevice:将设备(通过IHdfDeviceToken接口表示)附加到设备管理服务中。这通常意味着在系统中注册设备,使其可被管理和使用。
  2. DevmgrServiceClntDetachDevice:从设备管理服务中分离(注销)指定设备ID的设备。
  3. DevmgrServiceClntAttachDeviceHost:将一个设备主机(通过IDevHostService接口表示)和主机ID附加到设备管理服务中。设备主机可能是一个硬件或软件组件,负责一组设备的通信和管理。

而DevmgrService提供的方法如下:

  1. DevmgrServiceStartService:启动设备管理服务,使其开始监听和处理设备相关的请求。
  2. DevmgrServiceConstruct:构造(初始化)设备管理服务实例。这个函数会分配必要的资源、初始化接口等。
  3. DevmgrServiceCreate:创建一个设备管理服务的实例。这个函数会返回一个HdfObject类型的对象,这是一个通用的对象框架,用于HDF(Hardware Driver Foundation)系统中的对象管理。
  4. DevmgrServiceRelease:释放设备管理服务实例,进行资源清理。
  5. DevmgrServiceGetInstance:获取设备管理服务的实例。
  6. DevmgrServiceLoadLeftDriver:加载驱动程序。

由上可得出客户端主要是为了实现Manager域与Host域(设备)之间的有效通信和管理,而服务主体主要是实现对服务本身的管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue学习10

1.GPT和Copilot Copilot Tab接受 删除键,不接受 ctrlenter更多方案 更适合的是修改方向 const submitForm async () > {//等待校验结果await formRef.value.validate()//提交修改await userUpdateInfoService(form.value)//通知user模块,进行数据更…

如何正确安装Stable Diffusion Web UI以及对应的xFormers

本文是我总结的步骤,验证了几次保证是对的。因为正确的安装 Stable Diffusion Web UI 以及对应的 xFormers 实在是太麻烦了,官方和网上的步骤都是残缺和分散的,加上国内网络速度不理想,所以需要一些额外步骤,之前研究出…

DeepSeek正重构具身大模型和人形机器人赛道!

中国人工智能公司DeepSeek(深度求索)以“低成本、高效率、强开放”的研发范式横空出世,火遍并震撼全球科技圈;DeepSeek展现出来的核心竞争力,除了低成本及推理能力,更重要的是开源模型能力追赶上了最新的闭…

Linux库制作与原理:【静态库】【动态库】【目标文件】【ELF文件】【ELF从形成到假造轮廓】【理解链接和加载】

目录 一.什么是库 二.静态库 2.1创建静态库 我们在之前的路径下新建lib使用我们自己的库 2.2 使用makefile生成静态库 三.动态库 3.1动态库生成 3.2动态库使用 3.3库运行搜索路径 四.目标文件 五.ELF文件 六.ELF从形成到加载轮廓 6.1ELF形成可执行 6.2 ELF可执行文…

【ubuntu24.04】 强制重启导致大模型的磁盘挂载出错

挂载NTFS文件系统出错 各种模型放在了这个机械硬盘上,虽然速度慢,但是好在容量大。大模型在工作,但是程序看起来有问题,导致系统卡死了,然后我重启了,然后报错:wrong fs type bad option &…

Spring Boot(8)深入理解 @Autowired 注解:使用场景与实战示例

搞个引言 在 Spring 框架的开发中,依赖注入(Dependency Injection,简称 DI)是它的一个核心特性,它能够让代码更加模块化、可测试,并且易于维护。而 Autowired 注解作为 Spring 实现依赖注入的关键工具&…

【linux】在 Linux 服务器上部署 DeepSeek-r1:70b 并通过 Windows 远程可视化使用

【linux】在 Linux 服务器上部署 DeepSeek-r1:70b 并通过 Windows 远程可视化使用 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 服务器上部署 DeepSeek-r1:70b 并通过 Windows 远程可视化使用个人配置详情一、安装ollama二、下载deepseek版本…

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库

文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…

Unity 命令行设置运行在指定的显卡上

设置运行在指定的显卡上 -force-device-index

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释

问题:在默认的Visual Studio中,选择单行代码后,按下Ctrl /键会将代码注释掉,但再次按下Ctrl /键时,会进行双重注释,这不是我们想要的。 实现效果:当按下Ctrl /键会将代码注释掉,…

教程:使用 Vue 3 和 arco 实现表格合并

1. 功能概述 本教程将介绍如何使用 Vue 3 和 arco 组件库实现表格合并功能。具体来说,我们会根据表格数据中的某个字段(如 type)对表格的某一列(如入库类型列)进行合并,同时将质检说明列合并为一列。 2. …

uniapp - iconfont下载本地并且运用至项目上

1、项目中创建一个文件夹放置iconfont相关文件,例如src/assets/iconfont(名称自己定义) 2、在iconfont下载项目至本地 3、解压后把文件复制进1的文件夹中 4、修改src/assets/iconfont - iconfont.css里的font-face的src地址,修…

【前端】自己从头实现一个gpt聊天页面

预览 最小化功能点 主界面:侧边栏会话历史、聊天窗口发送和断开。侧边栏:展示会话列表,每个会话包含多条聊天记录, 通过localstorage本地储存和恢复,会话需要重命名和删除。聊天框:区分一下发送者和回答者…

数据结构——二叉树(2025.2.12)

目录 一、树 1.定义 (1)树的构成 (2)度 2.二叉树 (1)定义 (2)二叉树的遍历 (3)遍历特性 二、练习 1.二叉树 (1)创建二叉树…

Vulhub靶机 ActiveMQ任意 文件写入(CVE-2016-3088)(渗透测试详解)

一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 漏洞版本:ActiveMQ在5.14.0之前的版本(不包括5.14.0) 二、访问靶机IP 8161端口 默认账户密码都是admin 1、利用bp抓包,修改为PUT方法并在fileserver…

跟着李沐老师学习深度学习(十一)

经典的卷积神经网络 在本次笔记中主要介绍一些经典的卷积神经网络模型,主要包含以下: LeNet:最早发布的卷积神经网络之一,目的是识别图像中的手写数字;AlexNet: 是第一个在大规模视觉竞赛中击败传统计算机…

【微软- Entra ID】Microsoft Entra ID

Microsoft Entra ID是微软提供的基于云的身份和访问管理服务。Microsoft Entra ID是一个全面的解决方案,用于管理身份、执行访问策略以及在云和本地保护您的应用程序和数据。 目录 一、查看 Microsoft Entra ID 微软Entra租户 微软Entra模式 二、比较Microsoft Entra ID与…

Halcon相机标定

1,前言。 相机的成像过程实质上是坐标系的转换。首先空间中的点由“世界坐标系”转换到“相机坐标系”,然后再将其投影到成像平面(图像物理坐标系),最后再将成像的平面上的数据转换为图像像素坐标系。但是由于透镜的制…

Linux 配置 MySQL 定时自动备份到另一台服务器

Linux 配置 MySQL 定时自动备份到另一台服务器 前言1、配置服务器通信1.1:配置过程 2、编写自动备份sh脚本文件3:设置定时自动执行 前言 此方案可使一台服务器上的 MySQL 中的所有数据库每天 0 点自动转储为 .sql 文件,然后将文件同步到另一…

《安富莱嵌入式周报》第350期:Google开源Pebble智能手表,开源模块化机器人平台,开源万用表,支持10GHz HRTIM的单片机,开源CNC控制器

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1YPKEeyEeM/ 《安富莱嵌入式周报》第350期:Google开…