driver-hdf-manage.md 13.9 KB
Newer Older
W
wenjun 已提交
1 2
# 配置管理<a name="ZH-CN_TOPIC_0000001053493462"></a>

N
NEEN 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-   [配置概述](#section59914284576)
-   [配置语法](#section533713333580)
-   [关键字](#section1316625413586)
-   [基本结构](#section173481622115918)
-   [数据类型](#section96521601302)
-   [预处理](#section8164295515)
-   [注释](#section0338205819610)
-   [引用修改](#section179799204716)
-   [节点复制](#section382424014712)
-   [删除](#section165211112586)
-   [属性引用](#section192841514490)
-   [模板](#section520134294)
-   [配置生成](#section106152531919)
-   [hc-gen介绍](#section8260625101012)

W
wenjun 已提交
18 19 20 21
## 配置概述<a name="section59914284576"></a>

HCS\(**H**DF  **C**onfiguration  **S**ource\)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。

N
NEEN 已提交
22
HC-GEN**\(H**DF  **C**onfiguration  **G**enerator**\)**是HCS配置转换工具,可以将HDF配置文件转换为软件可读取的文件格式:
W
wenjun 已提交
23 24

-   在弱性能环境中,转换为配置树源码,驱动可直接调用C代码获取配置。
N
NEEN 已提交
25
-   在高性能环境中,转换为HCB\(**H**DF  **C**onfiguration  **B**inary\)二进制文件,驱动可使用HDF框架提供的配置解析接口获取配置。
W
wenjun 已提交
26 27 28 29 30 31

以下是使用HCB模式的典型应用场景:

**图 1**  配置使用流程图<a name="fig814111371944"></a>  


D
duangavin123 已提交
32
![](figure/zh-cn_image_0000001053405727.png)
W
wenjun 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45

HCS经过HC-GEN编译生成HCB文件,HDF驱动框架中的HCS Parser模块会从HCB文件中重建配置树,HDF驱动模块使用HCS Parser提供的配置读取接口获取配置内容。

## 配置语法<a name="section533713333580"></a>

HCS的语法介绍如下:

## 关键字<a name="section1316625413586"></a>

HCS配置语法保留了以下关键字。

**表 1**  HCS配置语法保留关键字

N
NEEN 已提交
46 47
<a name="table197619515016"></a>
<table><thead align="left"><tr id="row107621651103"><th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.1"><p id="p0745257902"><a name="p0745257902"></a><a name="p0745257902"></a>关键字</p>
W
wenjun 已提交
48
</th>
N
NEEN 已提交
49
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.2"><p id="p1974510571305"><a name="p1974510571305"></a><a name="p1974510571305"></a>用途</p>
W
wenjun 已提交
50
</th>
N
NEEN 已提交
51
<th class="cellrowborder" valign="top" width="33.33333333333333%" id="mcps1.2.4.1.3"><p id="p10745175720020"><a name="p10745175720020"></a><a name="p10745175720020"></a>说明</p>
W
wenjun 已提交
52 53 54
</th>
</tr>
</thead>
N
NEEN 已提交
55
<tbody><tr id="row77624515014"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p8745657307"><a name="p8745657307"></a><a name="p8745657307"></a>root</p>
W
wenjun 已提交
56
</td>
N
NEEN 已提交
57
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p074525719015"><a name="p074525719015"></a><a name="p074525719015"></a>配置根节点</p>
W
wenjun 已提交
58
</td>
N
NEEN 已提交
59
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p1174515575018"><a name="p1174515575018"></a><a name="p1174515575018"></a>-</p>
W
wenjun 已提交
60 61
</td>
</tr>
N
NEEN 已提交
62
<tr id="row18762175115012"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p11745175710019"><a name="p11745175710019"></a><a name="p11745175710019"></a>include</p>
W
wenjun 已提交
63
</td>
N
NEEN 已提交
64
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p167458577016"><a name="p167458577016"></a><a name="p167458577016"></a>引用其他HCS配置文件</p>
W
wenjun 已提交
65
</td>
N
NEEN 已提交
66
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p9745135718012"><a name="p9745135718012"></a><a name="p9745135718012"></a>-</p>
W
wenjun 已提交
67 68
</td>
</tr>
N
NEEN 已提交
69
<tr id="row20762251608"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p16745105712015"><a name="p16745105712015"></a><a name="p16745105712015"></a>delete</p>
W
wenjun 已提交
70
</td>
N
NEEN 已提交
71
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p774585716016"><a name="p774585716016"></a><a name="p774585716016"></a>删除节点或属性</p>
W
wenjun 已提交
72
</td>
N
NEEN 已提交
73
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p974514571102"><a name="p974514571102"></a><a name="p974514571102"></a>只能用于操作include导入的配置树</p>
W
wenjun 已提交
74 75
</td>
</tr>
N
NEEN 已提交
76
<tr id="row18762751509"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p174617571907"><a name="p174617571907"></a><a name="p174617571907"></a>template</p>
W
wenjun 已提交
77
</td>
N
NEEN 已提交
78
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p1874610571705"><a name="p1874610571705"></a><a name="p1874610571705"></a>定义模板节点</p>
W
wenjun 已提交
79
</td>
N
NEEN 已提交
80
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p774617571019"><a name="p774617571019"></a><a name="p774617571019"></a>-</p>
W
wenjun 已提交
81 82
</td>
</tr>
N
NEEN 已提交
83
<tr id="row376320511903"><td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.1 "><p id="p3746557501"><a name="p3746557501"></a><a name="p3746557501"></a>match_attr</p>
W
wenjun 已提交
84
</td>
N
NEEN 已提交
85
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.2 "><p id="p1174635712015"><a name="p1174635712015"></a><a name="p1174635712015"></a>用于标记节点的匹配查找属性</p>
W
wenjun 已提交
86
</td>
N
NEEN 已提交
87
<td class="cellrowborder" valign="top" width="33.33333333333333%" headers="mcps1.2.4.1.3 "><p id="p1774615571508"><a name="p1774615571508"></a><a name="p1774615571508"></a>解析配置时可以使用该属性的值查找到对应节点</p>
W
wenjun 已提交
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
</td>
</tr>
</tbody>
</table>

## 基本结构<a name="section173481622115918"></a>

HCS主要分为属性\(Attribute\)和节点\(Node\)两种结构。

**属性**

属性即最小的配置单元,是一个独立的配置项。语法如下:

```
  attribute_name = value;
```

-   attribute\_name 是**字母、数字、下划线**的组合且必须以字母或下划线开头,字母区分大小写。

-   value的可用格式如下:

    -   数字常量,支持二进制、八进制、十进制、十六进制数,具体参考数据类型节。

    -   字符串,内容使用双引号\(""\)引用。

    -   节点引用。


-   attribute 必须以分号\(;\)结束且必须属于一个node。


**节点**

节点是一组属性的集合,语法如下:

```
  node_name {
      module = "sample";
      ...
  }
```

-   node\_name  是**字母、数字、下划线**的组合且必须以字母或下划线开头,字母区分大小写。

-   大括号后无需添加结束符“;”。

-   root为保留关键字,用于声明配置表的根节点。每个配置表必须以root节点开始。

-   root节点中必须包含module属性,其值应该为一个字符串,用于表征该配置所属模块。

-   节点中可以增加match\_attr属性,其值为一个全局唯一的字符串。在解析配置时可以调用查找接口以该属性的值查找到包含该属性的节点。

## 数据类型<a name="section96521601302"></a>

在属性定义中使用自动数据类型,不显式指定类型,属性支持的数据类型如下:

**整型**

整型长度自动推断,根据实际数据长度给与最小空间占用的类型。

-   二进制,0b前缀,示例:0b1010。

-   八进制,0前缀,示例:0664。
-   十进制 ,无前缀,且支持有符号与无符号,示例:1024,+1024均合法。负值在读取时注意使用有符号数读取接口。

-   十六进制,0x前缀,示例:0xff00、0xFF。


**字符串**

字符串使用双引号\(""\)表示。

**数组**

数组元素支持整型、字符串,不支持混合类型。整型数组中uint32\_t uint64\_t混用会向上转型为uint64\_t 数组。整型数组与字符串数组示例如下:

```
attr_foo = [0x01, 0x02, 0x03, 0x04];
attr_bar = ["hello", "world"];
```

**bool类型**

bool类型中**true**表示真,**false**表示假。

## 预处理<a name="section8164295515"></a>

**include**

用于导入其他HCS文件。语法示例如下:

```
#include "foo.hcs"
#include "../bar.hcs"
```

-   文件名必须使用双引号\(""\),不在同一目录使用相对路径引用。被include文件也必须是合法的HCS文件。
-   多个include,如果存在相同的节点,后者覆盖前者,其余的节点依次展开。

## 注释<a name="section0338205819610"></a>

支持两种注释风格。

-   单行注释。

    ```
    // comment
    ```

-   多行注释。

    ```
    /*
    comment
    */
    ```

D
duangavin123 已提交
205
    >![](../public_sys-resources/icon-note.gif) **说明:** 
W
wenjun 已提交
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
    >多行注释不支持嵌套。


## 引用修改<a name="section179799204716"></a>

引用修改可以实现修改另外任意一个节点的内容,语法为:

```
 node :& source_node
```

上述语句表示node中的内容是对source\_node节点内容的修改。示例如下:

```
root {
    module = "sample";
    foo {
        foo_ :& root.bar{
            attr = "foo";
        }
        foo1 :& foo2 {
            attr = 0x2;
        }
        foo2 {
            attr = 0x1;
        }
    }

    bar {
        attr = "bar";
    }
}
```

最终生成配置树为:

```
root {
    module = "sample";
    foo {
        foo2 {
            attr = 0x2;
        }
    }
    bar {
        attr = "foo";
    }
}
```

在以上示例中,可以看到foo.foo\_节点通过引用将bar.attr属性的值修改为了"foo",foo.foo1节点通过引用将foo.foo2.attr属性的值修改为了0x2。foo.foo\_以及foo.foo1节点表示对目标节点内容的修改,其自身并不会存在最终生成的配置树中。

-   引用同级node,可以直接使用node名称,否则被引用的节点必须使用绝对路径,节点间使用“.”分隔,root表示根节点,格式为root开始的节点路径序列,例如root.foo.bar即为一个合法的绝对路径。
-   如果出现修改冲突(即多处修改同一个属性),编译器将提示warning,因为这种情况下只会生效某一个修改而导致最终结果不确定。

## 节点复制<a name="section382424014712"></a>

节点复制可以实现在节点定义时从另一个节点先复制内容,用于定义内容相似的节点。语法为:

```
 node : source_node
```

上述语句表示在定义"node"节点时将另一个节点"source\_node"的属性复制过来。示例如下:

```
root {
	module = "sample";
    foo {
        attr_0 = 0x0;
    }
    bar:foo {
        attr_1 = 0x1;
    }
}
```

上述代码的最终生成配置树为:

```
root {
    module = "sample";
    foo {
        attr_0 = 0x0;
    }
    bar {
        attr_1 = 0x1;
        attr_0 = 0x0;
    }
}
```

在上述示例中,编译后bar节点即包含attr\_0属性也包含attr\_1属性,在bar中对attr\_0的修改不会影响到foo。

在foo和bar在同级node中可不指定foo的路径,否则需要使用绝对路径引用,参考[引用修改](#section179799204716)

## 删除<a name="section165211112586"></a>

要对include导入的base配置树中不需要的节点或属性进行删除,可以使用delete关键字。下面的举例中sample1.hcs通过include导入了sample2.hcs中的配置内容,并使用delete删除了sample2.hcs中的attribute2属性和foo\_2节点,示例如下:

```
// sample2.hcs
root {
    attr_1 = 0x1;
    attr_2 = 0x2;
    foo_2 {
        t = 0x1;
    }
}

// sample1.hcs
#include "sample2.hcs"
root {
    attr_2 = delete;
    foo_2 : delete {
    }
}
```

上述代码在生成过程中将会删除root.foo\_2节点与attr\_2,最终生成配置树为:

```
root {
    attr_1 = 0x1;
}
```

D
duangavin123 已提交
333
>![](../public_sys-resources/icon-note.gif) **说明:** 
W
wenjun 已提交
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
>在同一个HCS文件中不允许使用delete,建议直接删除不需要的属性。

## 属性引用<a name="section192841514490"></a>

为了在解析配置时快速定位到关联的节点,可以把节点作为属性的右值,通过读取属性查找到对应节点。语法为:

```
 attribute = &node;
```

上述语句表示attribute的值是一个节点node的引用,在解析时可以用这个attribute快速定位到node,便于关联和查询其他node。示例如下:

```
node1 {
    attributes;
}

node2 {
    attr_1 = &node1;
}
```

## 模板<a name="section520134294"></a>

模板的用途在于生成严格一致的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;
    }
}
```

在上述示例中,bar和bar\_1节点继承了foo节点,生成配置树节点结构与foo保持了完全一致,只是属性的值不同。

## 配置生成<a name="section106152531919"></a>

hc-gen是配置生成的工具,可以对HCS配置语法进行检查并把HCS源文件转化成HCB二进制文件。

## hc-gen介绍<a name="section8260625101012"></a>

hc-gen参数说明:

```
Usage: hc-gen [Options] [File]
options:
  -o <file>   output file name, default same as input
  -a          hcb align with four bytes
  -b          output binary output, default enable
  -t          output config in C language source 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
```

生成.c/.h 配置文件方法:

```
hc-gen -o [OutputCFileName] -t [SourceHcsFileName]
```

生成HCB 配置文件方法:

```
hc-gen -o [OutputHcbFileName] -b [SourceHcsFileName]
```

反编译HCB文件为HCS方法:

```
hc-gen -o [OutputHcsFileName] -d [SourceHcbFileName]
```