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源代码》

相关推荐
_waylau9 分钟前
华为首款鸿蒙电脑正式亮相
华为·电脑·harmonyos
Tummer83632 小时前
C语言与C++的区别
c语言·c++·算法
爱分享的程序员2 小时前
微信小程序执行C语言库的详细方案
c语言·微信小程序·小程序
又熟了3 小时前
WDG看门狗(独立看门狗和窗口看门狗)
c语言·stm32·单片机·嵌入式硬件
RUZHUA3 小时前
华为首款鸿蒙电脑正式亮相,开启国产操作系统新篇章
华为·电脑·harmonyos
柒柒的代码学习日记7 小时前
数组和指针典型例题合集(一维数组、字符数组、二维数组)
c语言
yuanlaile10 小时前
HarmonyOS 鸿蒙操作物联网设备蓝牙模块、扫描蓝牙、连接蓝牙和蓝牙通信
物联网·华为·harmonyos·鸿蒙蓝牙·harmonyos 蓝牙模块
大龄Python青年11 小时前
C语言 交换算法之加减法,及溢出防范
c语言·开发语言·算法
谷雪_65813 小时前
鼠标交互初体验:点击屏幕生成彩色气泡(EGE 库基础)
c语言·开发语言·microsoft·交互
鸿蒙布道师15 小时前
鸿蒙NEXT开发动画案例2
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei