移植案例与原理 - HDF驱动框架-驱动配置(1)

HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。应该,类似Linux DTS(Device Tree Source)设备树。

HC-GEN(HDF Configuration Generator)是HCS配置转换工具,可以将HDF配置文件转换为软件可读取的文件格式。类似的,在Linux下,可以将DTS转换为DTB(Device Tree Blob,设备树数据二进制编码),使用的工具是DTC。

对于HC-GEN,对不同性能的环境,采用不同的策略,如下。现在还不清楚,高弱性能环境是如何定义的。

  • 在弱性能环境中,转换为配置树源码,驱动可直接调用C代码获取配置。
  • 在高性能环境中,转换为HCB(HDF Configuration Binary)二进制文件,驱动可使用HDF框架提供的配置解析接口获取配置。

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

1、HCS 配置语法

1.1 HCS使用的关键字

关键字描述备注
root配置根节点
include引用其他HCS配置文件
delete删除节点和属性只能删除include引入的节点或属性
template定义模板节点
match_attr用于标记节点的匹配查找属性解析配置时可以使用该属性的值查找到对应节点

关键字include、delete、template可以在文件drivers\framework\tools\leagecy\hc-gen\src\hcs_compiler.l中找到:

"root"              { LEXER_DEBUG("root\n"); return ROOT; }
"true"              { HcsCompilerlval.i = 1; return NUMBER; }
"false"             { HcsCompilerlval.i = 0; return NUMBER; }
"#include"          { LEXER_DEBUG("INCLUDE\n"); return INCLUDE; }
"delete"            { return DELETE; }
"template"          { return TEMPLATE; }

关键字match_attr应该是定义在文件drivers\framework\utils\include\hcs_tree_if.h中。

#define HCS_MATCH_ATTR "match_attr"

1.2 基本组成结构

HCS配置文件主要由属性attribute和节点node两部分组成。

1.2.1 属性

属性即最小的配置单元,是一个独立的配置项。语法如下,类似键值对,attribute 必须以分号(;)结束且必须属于一个node。

  attribute_name = value;

其中:

  • 属性名称attribute_name:

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

  • 属性值value:

    可用格式为:数字常量,支持二进制、八进制、十进制、十六进制数,具体参考数据类型部分;字符串,内容使用双引号(“”)引用;节点引用。

1.2.2 节点

节点是一组属性的集合,语法如下,大括号后无需添加结束符“;”。其中,node_name 是字母、数字、下划线的组合且必须以字母或下划线开头,字母区分大小写。

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

每个配置表必须以root节点开始,用于声明配置表的根节点。root节点中必须包含module属性,其值应该为一个字符串,用于表征该配置所属模块。节点中还可以增加match_attr属性,其值为一个全局唯一的字符串。在解析配置时,通过该属性值,调用查找节点可以查找到包含该属性的节点。

1.2.3 数据类型

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

1.2.3.1 整型

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

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

  • 八进制,0前缀,示例:0664。

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

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

1.2.3.2 字符串

字符串使用双引号(“”)表示。

1.2.3.3 数组

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

attr_foo = [0x01, 0x02, 0x03, 0x04];
attr_bar = ["hello", "world"];
1.2.3.4 bool类型

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

1.2.4 include预处理

用于导入其他HCS文件。语法示例如下,文件名必须使用双引号(“”),不在同一目录使用相对路径引用。被include文件也必须是合法的HCS文件。
多个include,如果存在相同的节点,后者覆盖前者,其余的节点依次展开。

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

可以参考示例文件device\board\fnlink\hcs\v200zr.hcs,等于板端hcs文件复用soc芯片部分的文件。

#include "../../../soc/bestechnic/bes2600/liteos_m/components/hdf_config/device_info.hcs"

1.2.5 注释

支持单行和多行两种注释风格。多行注释不支持嵌套,注释示例如下:

// comment 单行注释

/*
comment 多行注释
comment 多行注释
*/

1.2.6 引用修改

引用修改可以实现修改另外任意一个节点的内容,引用修改节点不产生新的节点,只修改另外一个节点。语法如下,表示node中的内容是对source_node节点内容的修改。注意 “:&”是整体,前后各有一个空格。

 node :& source_node

引用修改有如下注意事项:

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

示例如下:
``

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

    bar {
        attr = "bar";
    }
}

假如下述示例保存在文件ref_update.hcs中,可以先生成二进制hcb文件,然后再反编译生成hcs文件,查看效果。其他示例均可采用编译、反编译的方式来查看HCS配置文件的实现效果。

hc-gen -b ref_update.hcs
hc-gen -d ref_update.hcb

生成反编译的文件ref_update.d.hcs,内容为:

/*
 * HDF decompile hcs file
 */
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节点表示对目标节点内容的修改,其自身并不会存在最终生成的配置树中。

如果大家想更加深入的学习 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/724655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

质检迈入新时代,天润融通推出基于大模型的质检3.0解决方案

近18个月以来,受益于生成式AI浪潮,千行百业迎来了前所未有的突破与变革。 今天我们荣幸地站在时代交汇点上,宣布天润融通正式推出基于大语言模型的质检3.0产品,文末扫码申请试用。 在揭示质检3.0的里程碑之前,让我们…

网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w

01 中国电信股份有限公司浙江分公司 🔷招聘岗位:系统架构师 🔷岗位职责: 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护,做好相关产数项目的支撑。 2、根据信息安全管理要求,负责客户…

MPLS静态配置实验(初学版)

实验拓扑 配置接口地址 配置OSPF协议 测试网络连通性 配置静态MPLS AR1: [R1]mpls lsr-id 1.1.1.1 [R1]mpls [R1-GigabitEthernet0/0/0]mpls [R1]static-lsp ingress wps destination 4.4.4.4 32 nexthop 10.1.12.2 outgoing-interface g0/0/0 out-label 100AR2 [R2…

韩顺平0基础学java——第26天

p523-547 HashSet扩容时,只要节点到达了阈值就会扩,而不是数组长度到了才扩。 比如长16的数组,索引1放了8个,索引3放了4个,我再加一个他就会扩容。 另外谁能告诉我老师的debug界面是怎么设置的吗忘光了 HashSet存放…

shell脚本之数组及冒泡排序

1.数组定义:在集合当中指定多个元素,元素的类型可以是整数、字符串及浮点。 2.数组作用:一次性的定义多个元素,可以为变量赋值提供便利。 3.数组的定义方法: 数组名(a b c d) 数组名不能重复…

Qt6视频播放器项目框架代码

视频播放的关键代码如下: 使用Qt6的QMediaPlayer,QVideoWidget实现 void FunnyWidget::initVideo() {player = new QMediaPlayer(this);videoWidget = new QVideoWidget(this);playButton = new QPushButton("Play", this);pauseButton = new QPushButton("…

【Ruby基础01】windows和termux中搭建Ruby开发环境

windows下环境搭建 railsinstaller官方git地址 按照文档安装git、nodejs、yarn,安装教程百度一下。railsinstall可以从release页面下载最新版本4.1.0。 安装完成如下 安装RubyMine 下载RubyMine RubyMine下载地址 安装激活 下载文件,按照里面的流程…

《算法设计与分析》第五六章:回溯法与分支限界法

文章目录 回溯法分支限界法一、本章作业1.活动安排问题2.旅行商问题3.单源最短路径4.任务分配问题 二、算法积累1.回溯法求解01背包问题2.回溯法求解最大团问题3.回溯法求解n皇后问题4.回溯法求解地图着色5.回溯法求解哈密尔顿图6.回溯法求活动安排7.分支限界法求01背包问题8.分…

手写MyBatis 重要基本原理框架

1. 手写MyBatis 重要基本原理框架 文章目录 1. 手写MyBatis 重要基本原理框架1.1 第一步:IDEA中创建模块1.2 第二步:资源工具类,方便获取指向配置文件的输入流1.3 第三步:定义SqlSessionFactoryBuilder类1.4 第四步:分…

再进一步!deepin V23成功适配SpacemiT MUSE™ Box

内容来源:deepin(深度)社区 deepin作为国内领先的Linux操作系统发行版,一直致力于为用户提供更广泛的硬件支持,并积极投身于蓬勃发展的RISC-V生态建设。自deepin-ports SIG(特别兴趣小组)成立以…

WSL2 无法将磁盘”C:\Program Files\WSL\system.vhd“ 附加到WSL2 系统找不到指定的文件

WSL2 无法将磁盘”C:\Program Files\WSL\system.vhd“ 附加到WSL2 系统找不到指定的文件 开局就是雷蹦开局就是雷蹦 早上上班,一开机直接崩溃了,这啥问题,这个文件我哪里敢删除不是。肯定不是我的问题,我不看。心里默默告诉自己,一切都是状态机。确定了一下,首先确实存在…

类注释规范

类注释规范 1.1.1 模板配置 模板路径:File–>settings–>Editor–>File and Code Templates–>Includes–>File Header  N A M E :设置类名,与下面的 {NAME}:设置类名,与下面的 NAME:设…

gitee添加别人的仓库后,在该仓库里添加文件夹/文件

一、在指定分支里添加文件夹(如果库主没有创建分支,自己还要先创建分支) eg:以在一个项目里添加视图文件为例,用Echarts分支在usr/views目录下添加Echarts文件夹,usr/views/Echarts目录下添加index.vue 1.切换为本地仓…

C++之STL(二三)

1、vector源码刨析 1.1、数据结构以及动态扩充算法 其实vector内部有三个指针,分别是数据的第一个元素Myfirst、数据的最后一个元素的下一个位置Mylast,最后一个空间的下一个位置Myend;当你插入数据的时候,先判断当前容量够不够&…

浅谈RC4

一、什么叫RC4?优点和缺点 RC4是对称密码(加密解密使用同一个密钥)算法中的流密码(一个字节一个字节的进行加密)加密算法。 优点:简单、灵活、作用范围广,速度快 缺点:安全性能较差&…

昇思大模型学习·第一天

mindspore快速入门回顾 导入mindspore包 处理数据集 下载mnist数据集进行数据集预处理 MnistDataset()方法train_dataset.get_col_names() 打印列名信息使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问 网络构建 mindspore.nn: 构建所有网络的基类用…

LoRA用于高效微调的基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) 大型语言模型的低秩适配(LoRA)用于解决微调大型语言模型(LLMs)的挑战。GPT和Llama等拥有数十亿参数的模型,特定任务或领域的微…

chrome 录制器及性能分析工具的使用

需求背景: 对比不同VPN方案网络延迟的差异。 验证工具: chrome浏览器自带的录制器、性能插件可以完美的解决这个问题。 注意:录制的操作都在当前页面,不存在新开标签页的场景 解决方案: 使用chrome录制器&#xf…

day14-226.翻转二叉树+101. 对称二叉树+104.二叉树的最大深度

一、226.翻转二叉树 题目链接:https://leetcode.cn/problems/invert-binary-tree/ 文章讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 视频讲解&#xff1…