《鸿蒙智能互联设备开发(微课版)》 课件 第6章 HDF驱动框架_第1页
《鸿蒙智能互联设备开发(微课版)》 课件 第6章 HDF驱动框架_第2页
《鸿蒙智能互联设备开发(微课版)》 课件 第6章 HDF驱动框架_第3页
《鸿蒙智能互联设备开发(微课版)》 课件 第6章 HDF驱动框架_第4页
《鸿蒙智能互联设备开发(微课版)》 课件 第6章 HDF驱动框架_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.1.1

HDF驱动框架介绍通过本节学习,您可以:了解HDF驱动框架HDF驱动框架介绍HDF驱动框架介绍:HDF驱动架构采用C语言面向对象编程模型构建,通过平台解耦、内核解耦,来达到兼容不同内核,统一平台底座的目的,从而帮助开发者实现驱动一次开发,多系统部署的效果。HDF驱动框架介绍HDF驱动框架架构组成:OSAL:操作系统抽象层(OperatingSystemAbstractionLayer),提供统一封装的内核操作相关接口,屏蔽不同系统操作差异,包含内存、锁、线程、信号量等接口。HDF驱动框架介绍HDF驱动框架架构组成:1.HDF驱动基础框架:提供统一的硬件资源管理,驱动加载管理以及设备节点管理等功能。驱动框架采用的是主从模式设计,由DeviceManager和DeviceHost组成。HDF驱动框架介绍HDF驱动框架架构组成:2.驱动程序:实现驱动具体的功能,每个驱动由一个或者多个驱动程序组成,每个驱动程序都对应着一个DriverEntry。HDF驱动框架介绍HDF驱动框架架构组成:3.驱动配置文件.hcs:主要由设备信息(DeviceInformation)和设备资源(DeviceResource)组成。HDF驱动框架介绍HDF驱动框架架构组成:4.驱动接口:HDI(HardwareDriverinterface,硬件设备接口)提供标准化的接口定义和实现,驱动框架提供IOService和IODispatcher机制,使得不同部署形态下驱动接口趋于形式一致。谢谢6.1.2HDF驱动模型介绍通过本节学习,您可以:了解HDF驱动模型HDF驱动模型介绍HDF设备驱动模型的组成:Host(设备容器)、Device(设备)、DeviceNode(设备节点)、Driver(驱动程序)。HDF框架将一类设备驱动放在同一个Host里面,用于管理一组设备的启动加载等过程。Device对应一个真实的物理设备。DeviceNode是设备的一个部件,Device至少有一个DeviceNode。每个DeviceNode可以发布一个设备服务。每个DevicdNode唯一对应一个驱动,实现和硬件的功能交互。HDF驱动模型介绍在划分Host时,驱动程序是部署在一个Host还是部署在不同的Host,主要考虑驱动程序之间是否存在耦合性,如果两个驱动程序之间存在依赖,可以考虑将这部分驱动程序部署在一个Host里面。Host有两种属性:hostName,priority属性取值描述hostName字符串设备集合的名称。Priority整数,0-200设备集合的优先级。数值越大,优先级越低;如果优先级相同,则不能保证加载顺序。HDF驱动模型介绍HDF驱动框架给DeviceNode设备节点定义的属性:属性取值描述moduleName字符串每个设备节点所对应的驱动程序被称为一个module,每一个module都有一个moduleName。preload整数驱动被HDF加载的方式Priority整数,0-200驱动的优先级。数值越大,优先级越低;如果优先级相同,则不能保证加载顺序。serviceNamen字符串驱动对外发布的服务的名称,必须唯一。policy整数驱动对外发布服务的策略。permission整数设备节点的读写权限,一般采用以0为前缀的8进制整数,类似于linux的文件权限的概念。deviceMatchAttr字符串用于匹配设备节点的自定义属性。HDF驱动模型介绍驱动的加载方式如下:

typedef

enum{

DEVICE_PRELOAD_ENABLE=0,

DEVICE_PRELOAD_ENABLE_STEP2,

DEVICE_PRELOAD_DISABLE,

DEVICE_PRELOAD_INVALID

}DevicePreload;preload字段配置为0(DEVICE_PRELOAD_ENABLE),则系统启动过程中默认加载。preload字段配置为1(DEVICE_PRELOAD_ENABLE_STEP2),当系统支持快速启动的时候,则在系统完成之后再加载这一类驱动。preload字段配置为2(DEVICE_PRELOAD_DISABLE),则系统启动过程中默认不加载。谢谢6.1.3HDF驱动开发步骤通过本节学习,您可以:了解HDF驱动开发步骤HDF驱动开发步骤HDF框架的驱动开发的组成部分:驱动实现、驱动编译脚本编写和驱动配置。1.驱动实现:驱动实现包含驱动业务代码实现和驱动入口注册,具体写法如下:(1)驱动业务代码模板

#include"hdf_device_desc.h"//HDF框架对驱动开发相关能力接口的头文件

#include"hdf_log.h"//HDF框架提供的日志接口头文件

#defineHDF_LOG_TAGtest_driver//打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签。

//将驱动对外提供的服务能力接口绑定到HDF框架。

int32_tHdfTestDriverBind(structHdfDeviceObject*deviceObject){

HDF_LOGD("Testdriverbindsuccess");

returnHDF_SUCCESS;

}

//驱动自身业务初始化的接口

int32_tHdfTestDriverInit(structHdfDeviceObject*deviceObject){

HDF_LOGD("TestdriverInitsuccess");

returnHDF_SUCCESS;

}

//驱动资源释放的接口

voidHdfTestDriverRelease(structHdfDeviceObject*deviceObject){

HDF_LOGD("Testdriverreleasesuccess");

return;

}HDF驱动开发步骤(2)驱动入口注册到HDF框架

structHdfDriverEntryg_testDriverEntry={

.moduleVersion=1,

.moduleName="test_driver",

.Bind=HdfTestDriverBind,

.Init=HdfTestDriverInit,

.Release=HdfTestDriverRelease,

};

//调用HDF_INIT将驱动入口注册到HDF框架中。在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动;当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。

HDF_INIT(g_testDriverEntry);驱动注册,就是实例化驱动入口,驱动入口必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量,且moduleName要和device_info.hcs中保持一致。HDF框架会将所有加载的驱动的HdfDriverEntry对象首地址汇总,形成一个类似数组的段地址空间,方便上层调用。HDF驱动开发步骤2.驱动编译脚本编写添加模块BUILD.gn把新增模块的BUILD.gn所在的目录添加到上一级BUILD.gn文件中

import("//drivers/adapter/khdf/liteos/hdf.gni")

hdf_driver("hdf_led"){

sources=[

"led.c",#此处为点灯实验,根据实验进行修改

]

include_dirs=[

"//device/st/drivers/module_driver/Module_Common/inc/",

]}

group("drivers"){

deps=[

"led",#新增模块BUILD.gn的名称,根据实验进行修改

]

}HDF驱动开发步骤3.驱动配置驱动配置包含两部分:HDF框架定义的驱动设备描述和驱动的私有配置信息。(1)驱动设备描述HDF框架加载驱动所需要的信息来源于HDF框架定义的驱动设备描述,因此基于HDF框架开发的驱动必须要在HDF框架定义的device_info.hcs配置文件中添加对应的设备描述。

root{

device_info{

match_attr="hdf_manager";HDF驱动开发步骤

templatehost{//host模板,继承该模板的节点(如下test_host)如果使用模板中的默认值,则节点字段可以缺省。

hostName="";

priority=100;

templatedevice{

templatedeviceNode{

policy=0;

priority=100;

preload=0;

permission=0664;

moduleName="";

serviceName="";

deviceMatchAttr="";

}

}

}HDF驱动开发步骤

platform::host{

hostName="platform_host";//host名称,host节点是用来存放某一类驱动的容器。

priority=50;//host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序。

device_led::device{//led设备节点

device0::deviceNode{//led驱动的DeviceNode节点

policy=2;//policy字段是驱动服务发布的策略

priority=200;//驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序

preload=0;//驱动按需加载字段

permission=0777;//驱动创建设备节点权限

moduleName="HDF_LED";//驱动名称,该字段的值必须和驱动入口结构的moduleName值一致

serviceName="hdf_led";//驱动对外发布服务的名称,必须唯一

deviceMatchAttr="st_stm32mp157_led";//驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等

}

}

}

}}HDF驱动开发步骤(2)驱动私有配置信息如果驱动有私有配置,则可以添加一个驱动的配置文件,用来填写一些驱动的默认配置信息。HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject中的property里面,通过Bind和Init传递给驱动。驱动的配置信息示例如下:配置信息定义之后,需要将该配置文件添加到板级配置入口文件hdf.hcs,示例如下:

root{

LedDriverConfig{

led_gpio_num=13;

match_attr="st_stm32mp157_led";//该字段的值必须和device_info.hcs中的deviceMatchAttr值一致

}

}

#include"device_info/device_info.hcs"

#include"led/led_config.hcs"

谢谢6.2.1驱动服务介绍通过本节学习,您可以:了解驱动服务介绍驱动服务介绍当驱动需要以接口的形式对外提供能力时,可以使用HDF框架的驱动服务管理能力。驱动服务是HDF驱动设备对外提供能力的对象,由HDF框架统一管理。驱动服务管理主要包含驱动服务的发布和获取。1.驱动服务的发布:HDF框架定义了驱动对外发布服务的策略,由配置文件中的policy字段来控制,policy字段的取值范围以及含义如下:

typedef

enum{

SERVICE_POLICY_NONE=0,//驱动不提供服务

SERVICE_POLICY_PUBLIC=1,//驱动对内核态发布服务

SERVICE_POLICY_CAPACITY=2,//驱动对内核态和用户态都发布服务

SERVICE_POLICY_FRIENDLY=3,//驱动服务不对外发布服务,但可以被订阅

SERVICE_POLICY_PRIVATE=4,//驱动私有服务不对外发布服务,也不能被订阅

SERVICE_POLICY_INVALID//错误的服务策略

}ServicePolicy;驱动服务介绍2.驱动服务的获取:驱动服务的获取有两种方式:通过HDF接口直接获取:当明确驱动已经加载完成时,获取该驱动的服务可以通过HDF框架提供的能力接口直接获取。通过HDF提供的订阅机制获取:当内核态对驱动(同一个host)加载的时机不感知时,可以通过HDF框架提供的阅机

制来订阅该驱动,当该驱动加载完成时,HDF框架会将被订阅的驱动服务发布给订阅者。谢谢6.2.2驱动服务管理开发通过本节学习,您可以:了解驱动服务管理开发驱动服务管理开发1.驱动服务管理接口针对驱动服务管理功能,HDF框架开放了部分接口给开发者调用。方法描述int32_t(*Bind)(structHdfDeviceObject*deviceObject);需要驱动开发者实现Bind函数,将自己的服务接口绑定到HDF框架中conststructHdfObject*DevSvcManagerClntGetService(constchar*svcName);获取驱动的服务intHdfDeviceSubscribeService(structHdfDeviceObject*deviceObject,constchar*serviceName,structSubscriberCallbackcallback);订阅驱动的服务驱动服务管理开发2.驱动服务管理开发步骤(1)驱动服务的编写驱动服务管理开发的第一步是定义驱动的服务接口。

//驱动服务结构的定义

structITestDriverService{

structIDeviceIoServiceioService;//服务结构的首个成员必须是IDeviceIoService类型的成员

int32_t(*ServiceA)(void);//驱动的第一个服务接口

int32_t(*ServiceB)(uint32_tinputCode);//驱动的第二个服务接口,有多个可以依次往下累加

};

驱动服务接口的实现

int32_tTestDriverServiceA(void)

{

//驱动开发者实现业务逻辑

returnHDF_SUCCESS;

}

int32_tTestDriverServiceB(uint32_tinputCode)

{

//驱动开发者实现业务逻辑

returnHDF_SUCCESS;

}驱动服务管理开发(2)驱动服务绑定驱动服务绑定到HDF框架中,实现HdfDriverEntry中的Bind指针函数。

int32_tTestDriverBind(structHdfDeviceObject*deviceObject)

{

//deviceObject为HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口

if(deviceObject==NULL){

HDF_LOGE("Testdeviceobjectisnull!");

returnHDF_FAILURE;

}

static

structITestDriverServicetestDriverA={

.ServiceA=TestDriverServiceA,

.ServiceB=TestDriverServiceB,

};

deviceObject->service=&testDriverA.ioService;

returnHDF_SUCCESS;

}驱动服务管理开发(3)驱动服务获取通过HDF接口直接获取:

const

structITestDriverService*testService=

(const

structITestDriverService*)DevSvcManagerClntGetService("test_driver");

if(testService==NULL){

returnHDF_FAILURE;

}

testService->ServiceA();testService->ServiceB(5);驱动服务管理开发

//object为订阅者的私有数据,service为被订阅的服务对象

int32_tTestDriverSubCallBack(structHdfDeviceObject*deviceObject,const

structHdfObject*service)

{

const

structITestDriverService*testService=

(const

structITestDriverService*)service;

if(testService==NULL){

returnHDF_FAILURE;

}

testService->ServiceA();

testService->ServiceB(5);

}通过HDF提供的订阅机制获取:需要编写订阅回调函数,当被订阅的驱动加载完成后,HDF框架会将被订阅驱动的服务发布给订阅者,通过这个回调函数给订阅者使用。驱动服务管理开发

//订阅过程的实现

int32_tTestDriverInit(structHdfDeviceObject*deviceObject)

{

if(deviceObject==NULL){

HDF_LOGE("Testdriverinitfailed,deviceObjectisnull!");

returnHDF_FAILURE;

}

structSubscriberCallbackcallBack;

callBack.deviceObject=deviceObject;

callBack.OnServiceConnected=TestDriverSubCallBack;

int32_tret=HdfDeviceSubscribeService(deviceObject,"test_driver",callBack);

if(ret!=HDF_SUCCESS){

HDF_LOGE("Testdriversubscribetestdriverfailed!");

}

returnret;}谢谢6.3.1驱动消息机制管理通过本节学习,您可以:了解驱动消息机制管理驱动消息机制管理鸿蒙系统的的HDF框架提供了统一的驱动消息机制。当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。用户态:指应用程序运行的环境,应用程序在用户态下运行,可以访问系统资源,如文件、网络等。用户态下的应用程序运行在受限的环境中,不能直接访问系统硬件资源,必须通过系统调用来请求内核提供服务。内核态:指操作系统内核运行的环境,在操作系统启动时,内核被加载到内存中,并开始执行。消息机制的功能有以下两种:用户态应用发送消息到驱动。用户态应用接收驱动主动上报事件。驱动消息机制管理消息机制的接口:接口描述structHdfIoService*HdfIoServiceBind(constchar*serviceName)用户态获取驱动的服务,获取该服务之后通过服务中的Dispatch方法向驱动发送消息voidHdfIoServiceRecycle(structHdfIoService*service);获取驱动的服务intHdfDeviceRegisterEventListener(structHdfIoService*target,structHdfDevEventlistener*listener);用户态程序注册接收驱动上报事件的操作方法intHdfDeviceSendEvent(structHdfDeviceObject*deviceObject,uint32_tid,structHdfSBuf*data);驱动主动上报事件接口谢谢6.3.2驱动消息机制开发通过本节学习,您可以:了解驱动消息机制开发驱动消息机制开发驱动消息机制的开发步骤:1.修改服务策略policy字段将驱动配置信息中服务策略policy字段设置为2。

device_test::Device{

policy=2;

...

}2.配置驱动信息中的服务设备节点权限配置驱动信息中的服务设备节点权限(permission字段)是框架给驱动创建设备节点的权限,默认是0666,驱动开发者根据驱动的实际使用场景配置驱动设备节点的权限。驱动消息机制开发3.实现Dispatch方法在服务实现过程中,实现服务基类成员IDeviceIoService中的Dispatch方法。

//Dispatch是用来处理用户态发下来的消息

int32_tTestDriverDispatch(structHdfDeviceIoClient*device,intcmdCode,structHdfSBuf*data,structHdfSBuf*reply){

HDF_LOGE("testdriverliteAdispatch");

returnHDF_SUCCESS;

}

int32_tTestDriverBind(structHdfDeviceObject*device){

HDF_LOGE("testforliteostestdriverAOpen!");

if(device==NULL){

HDF_LOGE("testforliteostestdriverAOpenfailed!");

returnHDF_FAILURE;

}

static

structITestDriverServicetestDriverA={

.ioService.Dispatch=TestDriverDispatch,

.ServiceA=TestDriverServiceA,

.ServiceB=TestDriverServiceB,

};

device->service=(structIDeviceIoService*)(&testDriverA);

returnHDF_SUCCESS;}驱动消息机制开发4.定义cmd类型驱动定义消息处理函数中的cmd类型。5.获取服务接口并发送消息用户态获取服务接口并发送消息到驱动。#defineTEST_WRITE_READ1//读写操作码1

intSendMsg(const

char*testMsg)

{

if(testMsg==NULL){

HDF_LOGE("testmsgisnull");

returnHDF_FAILURE;

}

structHdfIoService*serv=HdfIoServiceBind("test_driver");

if(serv==NULL){

HDF_LOGE("failtogetservice");

returnHDF_FAILURE;}驱动消息机制开发

structHdfSBuf*data=HdfSBufObtainDefaultSize();

if(data==NULL){HDF_LOGE("failtoobtainsbufdata");

returnHDF_FAILURE;

}

structHdfSBuf*reply=HdfSBufObtainDefaultSize();

if(reply==NULL){HDF_LOGE("failtoobtainsbufreply");

ret=HDF_DEV_ERR_NO_MEMORY;

gotoout;

}

if(!HdfSbufWriteString(data,testMsg)){HDF_LOGE("failtowritesbuf");

ret=HDF_FAILURE;

gotoout;

}

intret=serv->dispatcher->Dispatch(&serv->object,TEST_WRITE_READ,data,reply);

if(ret!=HDF_SUCCESS){HDF_LOGE("failtosendservicecall");

gotoout;

}

out:

HdfSBufRecycle(data);

HdfSBufRecycle(reply);

HdfIoServiceRecycle(serv);

returnret;}驱动消息机制开发6.用户态接收驱动上报的消息用户态编写驱动上报消息的处理函数。

static

intOnDevEventReceived(void*priv,uint32_tid,structHdfSBuf*data)

{

OsalTimespectime;

OsalGetTime(&time);

HDF_LOGE("%sreceivedeventat%llu.%llu",(char*)priv,time.sec,time.usec);

const

char*string=HdfSbufReadString(data);

if(string==NULL){

HDF_LOGE("failtoreadstringineventdata");

returnHDF_FAILURE;

}

HDF_LOGE("%s:deveventreceived:%d%s",(char*)priv,id,string);

returnHDF_SUCCESS;}驱动消息机制开发用户态注册接收驱动上报消息的操作方法。

intRegisterListen()

{

structHdfIoService*serv=HdfIoServiceBind("test_driver");

if(serv==NULL){

HDF_LOGE("failtogetservice");

returnHDF_FAILURE;

}

static

structHdfDevEventlistenerlistener={

.callBack=OnDevEventReceived,

.priv="Service0"

};

if(HdfDeviceRegisterEventListener(serv,&listener)!=0){

HDF_LOGE("failtoregistereventlistener");

returnHDF_FAILURE;

}

......

HdfDeviceUnregisterEventListener(serv,&listener);

HdfIoServiceRecycle(serv);

returnHDF_SUCCESS;

}驱动消息机制开发驱动上报事件。

int32_tTestDriverDispatch(structHdfDeviceObject*device,intcmdCode,structHdfSBuf*data,structHdfSBuf*reply)

{

...//processapicallhere

returnHdfDeviceSendEvent(deviceObject,cmdCode,data);}谢谢6.4.1HCS介绍通过本节学习,您可以:了解HDF驱动框架的配置描述源码HCSHCS介绍HCS(HDFConfigurationSource)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。HCS配置管理以树状结构来组织配置项,开发者可以根据需要定义不同的配置项,并将其组织成一个层次化的结构。每个配置项都有一个唯一的标识符,开发者可以通过标识符来访问和修改配置项的值。通过HCS配置管理,开发者可以实现动态配置的功能。在运行时,开发者可以根据需要修改特定的配

置项的值,而无需重新编译和部署应用程序。HCS配置管理支持多种配置项类型,包括整数、浮点数、字符串等。开发者可以根据具体需求选择适合的配置项类型。HCS介绍HC-GEN(HDFConfigurationGenerator)是HCS配置转换工具,可以将HDF配置文件转换为软件可读取的文件格式,环境不同,转换的文件格式也不同。在弱性能环境中,转换为配置树源码或配置树宏定义,驱动可直接调用C代码或宏式APIs获取配置。在高性能环境中,转换为HCB(HDFConfigurationBinary)二进制文件,驱动可使用HDF框架提供

的配置解析接口获取配置。HCS介绍使用HCS模式的典型应用场景如图所示。HCS经过HC-GEN编译生成HCB二进制文件,HDF驱动框架中的HCSParser模块会从HCB文件中重建配置树,HDF驱动模块使用HCSParser提供的配置读取接口获取配置内容。HCB二进制文件重建配置树谢谢6.4.2HCS配置语法通过本节学习,您可以:了解HCS配置语法HCS配置语法1.关键字HCS配置语法的部分关键字,如表所示。关键字用途说明root配置根节点-include引用其他HCS配置文件-delete删除节点或属性只能用于操作include导入的配置树template定义模板节点-match_attr用于标记节点的匹配查找属性解析配置时可以使用该属性的值查找到对应节点HCS配置语法2.基本组成结构HCS配置文件主要由属性(Attribute)和节点(Node)两部分组成。(1)属性属性是最小的配置单元,是一个独立的配置项。语法如下:attribute_name=value;attribute_name是字母、数字、下划线的组合且必须以字母或下划线开头,字母区分大小写。value的可用格式如下:数字常量,支持二进制、八进制、十进制、十六进制数。字符串,内容使用双引号(“”)引用。节点引用。attribute必须以分号(;)结束且必须属于一个node。HCS配置语法(2)节点节点是一组属性的集合,语法如下:

node_name{

module="test";

...}node_name是字母、数字、下划线的组合且必须以字母或下划线开头,字母区分大小写。大括号后无需添加结束符分号“;”。root为保留关键字,用于声明配置表的根节点。每个配置表必须以root节点开始。root节点中必须包含module属性,其值应该为一个字符串,用于表征该配置所属模块。节点中可以增加match_attr属性,其值为一个全局唯一的字符串。当驱动程序在解析配置时可以以该属性的值为参数调用查找接口查找到包含该属性的节点。HCS配置语法3.数据类型在属性定义中使用自动数据类型,不显式指定类型,属性支持的数据类型有整型、字符串、数组、布尔类型。整型:整型长度自动推断,根据实际数据长度给与最小空间占用的类型。二进制,0b前缀,示例:0b1010。八进制,0前缀,示例:0664。十进制,无前缀,且支持有符号与无符号,示例:1024,+1024均合法。驱动程序在读取负值时注意使用有符号数读取接口。十六进制,0x前缀,示例:0xff00、0xFF。HCS配置语法字符串:字符串使用双引号(“”)表示。布尔类型:布尔类型中true表示真,false表示假。数组:数组元素支持整型、字符串,不支持混合类型。整型数组中uint32_t、uint64_t混用会向上转型为uint64_t数组。整型数组与字符串数组示例如下:

attr_foo=[0x01,0x02,0x03,0x04];

attr_bar=["hello","world"];4.预处理include用于导入其他HCS文件。语法示例如下:其中,文件名必须使用双引号(“”),不在同一目录下需要使用相对路径引用。被include文件也必须是合法的HCS文件。若是多个include,如果存在相同的节点,后者覆盖前者,其余的节点依次展开。#include"foo.hcs"

#include"../bar.hcs"HCS配置语法5.注释注释支持两种风格:单行注释和多行注释。

//comment单行注释

/*

comment多行注释

*/6.引用修改引用修改可以实现修改另外任意一个节点的内容,语法为:node:&source_nodeHCS配置语法上述语句表示node中的内容是对source_node节点内容的修改。示例如下:

root{

module="test";

foo{

foo_:&root.bar{

attr="foo";

}

foo1:&foo2{

attr=0x2;

}

foo2{

attr=0x1;

}

}

bar{

attr="bar";

}}

root{

module="test";

foo{

foo2{

attr=0x2;

}

}

bar{

attr="foo";

}}最终生成配置树为:可以看到foo.foo_节点通过引用将bar.attr属性的值修改为了"foo",foo.foo1节点通过引用将foo.foo2.attr属性的值修改为了0x2。foo.foo_以及foo.foo1节点表示对目标节点内容的修改,其自身并不会存在最终生成的配置树中。HCS配置语法7.节点复制节点复制可以实现在节点定义时从另一个节点先复制内容,用于定义内容相似的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论