1.2.7 节点复制
节点复制可以实现在节点定义时从另一个节点先复制内容,用于定义内容相似的节点。语法如下,表示在定义"node"节点时将另一个节点"source_node"的属性复制过来。
node : source_node
示例如下,编译后bar节点既包含attr_0属性也包含attr_1属性,在bar中对attr_0的修改不会影响到foo。在foo和bar在同级node中可不指定foo的路径,否则需要使用绝对路径引用。
root {module = "sample";foo {attr_0 = 0x0;}bar:foo {attr_1 = 0x1;}
}
上述代码的最终生成配置树为,可以通过编译为hcb,然后反编译确认效果。
root {module = "sample";foo {attr_0 = 0x0;}bar {attr_1 = 0x1;attr_0 = 0x0;}
}
1.2.8 属性引用
为了在解析配置时快速定位到关联的节点,可以把节点作为属性的右值,通过读取属性查找到对应节点。语法如下,表示attribute的值是一个节点node的引用,在解析时可以用这个attribute快速定位到node,便于关联和查询其他node。
attribute = &node;
示例如下:
root {module = "sample";node1 {attribute1 = "value1";}node2 {attr_1 = &node1;}
}
注意:不知道为什么,该示例编译报错,已提交 reference invalid node issue 跟踪。
ref_update.hcs:7 reference invalid node 'node1'
1.2.9 删除
要对include导入的base配置树中不需要的节点或属性进行删除,可以使用delete关键字。下面的举例中sample1.hcs通过include导入了sample2.hcs中的配置内容,并使用delete删除了sample2.hcs中的attribute2属性和foo_2节点,示例如下:
// sample2.hcs
root {module = "sample2";attr_1 = 0x1;attr_2 = 0x2;foo_2 {t = 0x1;}
}// sample1.hcs
#include "sample2.hcs"
root {module = "sample1";attr_2 = delete;foo_2 : delete {}
}
编译sample1.hcs文件,在生成过程中将会删除root.foo_2节点与attr_2,最终生成配置树效果为:
/** HDF decompile hcs file*/root {attr_1 = 0x1;module = "sample1";
}
1.2.10 模板
模板的用途在于生成严格一致的node结构,以便对同类型node进行遍历和管理。使用template关键字定义模板node,子node通过双冒号“::”声明继承关系。子节点可以改写但不能新增和删除template中的属性,子节点中没有定义的属性将使用template中的定义作为默认值。示例如下:
root {module = "sample";template foo {attr_1 = 0x1;attr_2 = 0x2;}bar :: foo {}bar_1 :: foo {attr_1 = 0x2;}
}
生成配置树效果如下:
root {module = "sample";bar {attr_1 = 0x1;attr_2 = 0x2;}bar_1 {attr_1 = 0x2;attr_2 = 0x2;}
}
2、hc-gen配置生成
从上文可知,hc-gen是配置生成的工具,可以对HCS配置语法进行检查并把HCS源文件转化成HCB二进制文件。hc-gen的源代码目录在drivers\framework\tools\hc-gen,
以./out/v200zr/xts_demo/obj/drivers/framework/tools/hc-gen/hc-gen为例,执行下可以输出使用帮助信息:
zhushangyuan@OHOS:~/openharmony$ ./out/v200zr/xts_demo/obj/drivers/framework/tools/hc-gen/hc-gen
Usage: hc-gen [Options] [File]
options:-a hcb align with four bytes-b output binary output, default enable-t output config in C language source file style-m output config in macro file style-i output binary hex dump in C language source file style-p <prefix> prefix of generated symbol name-d decompile hcb to hcs-V show verbose info-v show version-h show this help message
注意,还有个-o选项,可以指定输出文件的名字。
2.1 生成.c/.h文件
生成.c/.h文件的命令如下,其中$SourceHcsFileName为HCS文件路径。
hc-gen -t $SourceHcsFileName
实际例子,可以使用openharmony/device/soc/bestechnic/bes2600/liteos_m/components/hdf_config/device_info.hcs文件,执行命令如下。执行后,可以在目录~/openharmony/device/soc/bestechnic/bes2600/liteos_m/components/hdf_config下看到生成的device_info.h和device_info.c文件。
cd ~/openharmony/device/soc/bestechnic/bes2600/liteos_m/components/hdf_config
~/openharmony/out/v200zr/xts_demo/obj/drivers/framework/tools/hc-gen/hc-gen -t device_info.hcs
2.2 生成HCB文件
生成HCB二进制文件的命令如下,其中$SourceHcsFileName为HCS文件路径。
hc-gen -b $SourceHcsFileName
2.3 生成宏定义文件
生成宏定义文件的命令如下,其中$SourceHcsFileName为HCS文件路径。使用这个命令只生成.h文件。
hc-gen -m $SourceHcsFileName
2.4 反编译HCB文件为HCS文件
反编译HCB文件为HCS的命令如下,其中$SourceHcbFileName为HCB文件路径。
hc-gen -d $SourceHcbFileName
小结
本文介绍了HDF驱动框架配置管理的概念,介绍了HCS及其语法,并介绍了HCB及其用法,后续会介绍更多的HDF驱动框架知识。
如果大家想更加深入的学习 OpenHarmony(鸿蒙南向) 开发的全栈内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:
OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy
《OpenHarmony源码解析》:https://qr18.cn/CgxrRy
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
系统架构分析:https://qr18.cn/CgxrRy
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……
OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy
OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy
写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:
https://qr21.cn/FV7h05