openharmony中hdf框架的设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别

设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别

在 OpenHarmony 驱动框架 HDF 中,设备节点(HdfDeviceNode设备实例(HdfDevice 是两个重要的概念,而且非常容易混淆,它们在设备管理和驱动加载过程中扮演不同的角色。以下是它们的区别和联系:


概述

HdfDevice用于对Host大类别下的小类设备(例如I2C小类、UART小类等)进行集中管理,每一个HdfDevice类对象对应device_info.hcs配置文件中的一个device节点,每一个HdfDeviceNode类对象对应device_info.hcs配置文件中的一个deviceNode节点,配置文件信息如下

c 复制代码
root {
    device_info {
        platform :: host {
            hostName = "platform_host";
            priority = 50;
            device_uart :: device { //对应HDdevice节点
                device5 :: deviceNode { //对应HDdeviceNode节点
                    policy = 2;
                    priority = 10;
                    permission = 0660;
                    moduleName = "UART_SAMPLE";
                    serviceName = "HDF_PLATFORM_UART_5";
                    deviceMatchAttr = "sample_uart_5";
                }
                device1 :: deviceNode { //一个HDdevice可以内含多个HDdeviceNode节点
                    xxx....
                }
            }
        }
    }
}

为了更清楚的了解他们之间的关系,画了如下类图:

根据以上类图和业务代码的梳理可得出以下信息:

1. 设备节点(HdfDeviceNode

设备节点是 HDF 框架中用于描述单个设备的具体实例 (例如UART0、I2C1等)。它包含了设备的详细信息和驱动程序的绑定关系,是设备驱动加载和设备服务发布的基础

特点
  • 具体设备的描述
    • 设备节点包含了设备的元数据,如设备 ID(devId)、设备管理策略(policy)、服务名称(servName)等。
    • 它还包含了设备的驱动程序入口(driver),用于加载和初始化驱动。
  • 设备服务发布
    • 设备节点负责将设备的服务发布(PlublishService)到设备服务管理器(DevSvcManager),使得其他模块可以通过服务名称访问设备的功能。
  • 生命周期管理
    • 设备节点的生命周期从设备驱动匹配开始,到设备服务发布结束。
    • 它可以被动态添加或移除,例如通过热插拔机制。
关键属性
  • devId: 设备的唯一标识符。
  • driver: 设备的驱动程序入口(HdfDriverEntry)。
  • deviceObject: 设备对象(HdfDeviceObject),用于设备服务的发布。
  • token: 设备令牌(IHdfDeviceToken),用于在设备管理服务中标识设备。
  • servName: 设备的服务名称,用于发布服务。

2. 设备实例(HdfDevice

设备实例是 HDF 框架中用于管理一组设备节点的高层抽象。它负责协调多个设备节点的生命周期,并提供统一的设备管理接口。

特点
  • 设备集合管理
    • 设备实例可以管理多个设备节点,将它们组织在一起。
    • 它维护了一个设备节点列表(devNodes),用于跟踪所有附加到该实例的设备节点。
  • 设备生命周期协调
    • 设备实例负责协调设备节点的启动、停止和卸载。
    • 它提供统一的接口(如 HdfDeviceAttachHdfDeviceDetach),用于管理设备节点的生命周期。
  • 设备 ID 索引管理
    • 设备实例维护设备 ID 的索引,便于通过设备 ID 快速查找设备节点。
关键属性
  • devNodes: 设备节点的双向链表,用于管理所有附加的设备节点。
  • deviceCount: 当前管理的设备节点数量。
  • deviceIdIndex: 设备 ID 的索引表,用于快速查找设备节点。

3. 区别

特性 设备节点(HdfDeviceNode 设备实例(HdfDevice
作用范围 描述单个设备的具体信息和驱动绑定关系 管理一组设备节点的生命周期和集合
生命周期 从驱动匹配到服务发布 从设备实例创建到销毁
关键功能 设备驱动加载、初始化、服务发布 设备节点管理、生命周期协调、设备 ID 索引管理
核心属性 devIddriverdeviceObjecttoken devNodesdeviceCountdeviceIdIndex
是否可以动态添加 可以(例如通过热插拔) 通常作为高层管理实体,较少动态变化

4. 联系

设备节点和设备实例是紧密相关的:

  • 设备节点是设备实例的组成部分
    • 设备实例通过设备节点列表(devNodes)管理多个设备节点。
    • 设备节点的生命周期由设备实例协调。
  • 设备实例提供统一管理接口
    • 设备实例通过接口(如 HdfDeviceAttachHdfDeviceDetach)管理设备节点的附加和分离。
    • 设备实例负责为设备节点分配设备 ID,并维护设备 ID 的索引。

5. 总结

  • 设备节点(HdfDeviceNode 是 HDF 框架中描述单个设备的具体实例,负责设备驱动的加载、初始化和服务发布。
  • 设备实例(HdfDevice 是用于管理一组设备节点的高层抽象,负责协调设备节点的生命周期,并提供统一的设备管理接口。
  • 设备节点是设备实例的组成部分,设备实例通过设备节点列表管理设备节点的生命周期。

理解它们的区别和联系有助于更好地掌握 HDF 框架中设备管理和驱动加载的机制。

参考资料

《沉浸式剖析openharmony源代码》

相关推荐
睿麒2 分钟前
鸿蒙app开发中实现 底部抽屉效果动效
华为·harmonyos
南玖yy37 分钟前
C语言柔性数组深度解析:动态内存管理的艺术
c语言·开发语言·柔性数组
誓约酱1 小时前
(每日一题) 力扣 860 柠檬水找零
linux·c语言·c++·算法·leetcode·职场和发展
没有了遇见1 小时前
鸿蒙学习ArkTS之基本语法<函数>
harmonyos·arkts
坚果的博客1 小时前
uniapp版本加密货币行情应用
人工智能·华为·uni-app·harmonyos
KimLiu1 小时前
干货分享:鸿蒙开发之DevEco Studio接入DeepSeek
harmonyos·deepseek
别说我什么都不会2 小时前
鸿蒙(HarmonyOS)性能优化实战-内存分析器Allocation Profiler
性能优化·harmonyos
塞尔维亚大汉2 小时前
OpenHarmony轻量系统服务管理samgr-service赏析
操作系统·嵌入式·harmonyos
z_y_j2299704382 小时前
L1-039 古风排版
c语言·数据结构·算法
Tlog嵌入式2 小时前
[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信
c语言·stm32·单片机·嵌入式硬件·mcu·iot