前言
HCS(HDF Configuration Source)是 HDF 驱动框架的配置描述源码,内容以 Key-Value 为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。HC-GEN(HDF Configuration Generator)是 HCS 配置转换工具,可以将 HDF 配置文件转换为软件可读取的文件格式:
-
在弱性能环境中,转换为配置树源码,驱动可直接调用 C 代码获取配置。
-
在高性能环境中,转换为 HCB(HDF Configuration Binary)二进制文件,驱动可使用 HDF 框架提供的配置解析接口获取配置。
以下是使用 HCB 模式的典型应用场景:
HCS 经过 HC-GEN 编译生成 HCB 文件,HDF 驱动框架中的 HCS Parser 模块会从 HCB 文件中重建配置树,HDF 驱动模块使用 HCS Parser 提供的配置读取接口获取配置内容。
HCS 文本更适合人类阅读,但是并不方便程序直接存取,所以经过 HC-GEN 编译,输出二进制的 HCB 数据。HCB 在编译后打包进内核镜像的.rodata 只读分区,在启动加载时,框架定位到 HCB 数据头,再将二进制数据重新构造为树形数据结构供驱动查询和读取。下面详细分析 HC-GEN 实现。
HCS源码语法
HCS 的语法介绍如下:关键字
HCS 配置语法保留了以下关键字。
基本结构HCS 主要分为属性(Attribute)和节点(Node)两种结构。
-
属性
属性即最小的配置单元,是一个独立的配置项。语法如下:
1. node_name {
2. module = "sample";
3. ...
4. }
attribute_name 是字母、数字、下划线的组合且必须以字母或下划线开头,字母区分大小写。value 的可用格式如下:
-
数字常量,支持二进制、八进制、十进制、十六进制数,具体参考数据类型节。
-
字符串,内容使用双引号(“”)引用。
-
节点引用。
-
attribute 必须以分号(;)结束且必须属于一个 node。
-
节点
节点是一组属性的集合,语法如下:
attr_foo = [0x01, 0x02, 0x03, 0x04];
attr_bar = ["hello", "world"];
-
node_name 是字母、数字、下划线的组合且必须以字母或下划线开头,字母区分大小写。
-
大括号后无需添加结束符“;”。
-
root为保留关键字,用于声明配置表的根节点。每个配置表必须以 root 节点开始。
-
root 节点中必须包含 module 属性,其值应该为一个字符串,用于表征该配置所属模块。
-
节点中可以增加 match_attr 属性,其值为一个全局唯一的字符串。在解析配置时可以调用查找接口以该属性的值查找到包含该属性的节点。
数据类型
- 整型
整型长度自动推断,根据实际数据长度给与最小空间占用的类型。
-
二进制,0b 前缀,示例:0b1010。
-
八进制,0 前缀,示例:0664。
-
十进制 ,无前缀,且支持有符号与无符号,示例:1024,+1024 均合法。负值在读取时注意使用有符号数读取接口。
-
十六进制,0x 前缀,示例:0xff00、0xFF。
-
字符串
字符串使用双引号(“”)表示。
- 数组
数组元素支持整型、字符串,不支持混合类型。整型数组中 uint32_t uint64_t 混用会向上转型为 uint64_t 数组。整型数组与字符串数组示例如下:
attr_foo = [0x01, 0x02,