Lichee (五) sysconfig1.fex 配置系统
sysconfig配置系统,作为一个通用的软件平台,还希望通过它,可以适应用户不同的方案。通过给出一个对应的配置,用户的方案就可以自动运行,而不需要修改系统里面的代码,或者重新给出参数。
配置脚本的本意是给系统传递参数。作为一个稳定的系统,本身应该和方案无关, 不管不同方案的差别有多大,系统都不应该重新编译才能运行。这里所说的系统,不单单指操作系统,也包括其中的驱动,模块,等等。
例如:
端配置数据的生成
配置脚本本质上是端的一个文本文件,通过一个固定的格式形成可以被我们使用的文件,里面保存了大量的配置信息。在图一中,可以看到,端的一个数据文件如何变成了小机端可以用到的文件。
图一 小机端配置文件生成
图一中可以看出,当用户生成一个配置文件之后,不需要做额外的操作,只要按照正常的打包,烧写过程,配置文件的数据就自动被嵌入到相关的数据中了。
在小机端,系统启动之后存在数据传递的过程,这个过程主要是数据从中读出,然后存放到操作系统指定的位置。然后操作系统可以自己搬移这块数据,或者直接使用这块和配置有关的数据。相关的处理过程可以参见图二。
图二配置系统在系统中的流程
从图二中可以看出,阶段把数据从中读出,然后传递给了操作系统。操作系统拿到数据之后,做一次初始化动作,然后就一直等待用户进行操作。当系统关机的时候,操作系统需要调用一次配置管理的退出函数,然后,整个配置系统的运行就结束。
用户调用配置系统的数据传递
当用户调用配置系统的时候,里面存在数据传递。图三表示了用户的数据如何传递到系统,以及系统如何做出相应的。
图三配置系统使用中数据传递流程
通过图三,用户可以看出,当调用配置相关的函数的时候,系统中以及配置管理模块如何管理用户传入的数据。
在系统中,提供了如下的几个函数,提供给用户在系统中读取配置信息的数据。
char *sub_name, int value[], int count);
参数:主键名称,即配置脚本中的主键名称,字符串形式
子键名称,配置脚本中的子键名称,字符串形式
数据指针,用于存放用户获取的数据
用户传进的数据空间的最大个数
返回值:成功返回失败返回-1
这个函数的功能很强大,可以获取配置脚本中任意一项的值。
比如,用户需要获取配置脚本中,主键下的子键的值,可以写成
int ret;
ret = Script_parser_fetch(“target”, “boot_clock”, &value, 1);
if(ret < 0)
printf(“fetch script data fail\n”);
printf(“fetch script data ok, value = %d\n”, value);
return ret;
在这个函数中,获取到的值存放在整型变量中,正常情况下,函数调用的结果是 value
= 406
如果要获取一个配置的信息,比如的可以使用如下的形式
int ret;
ret = Script_parser_fetch(“twi_para”, “twi_scl”, gpio_info, sizeof(user_gpio_set_t)/sizeof(int));
if(ret < 0)
printf(“fetch script gpio infomation fail\n”);
printf(“fetch script gpio infomation ok \n”);
return ret;
这个函数将把获取到的信息存放到结构体中。用户可以使用这个结果,来调用管理模块提供的函数。
用户也可以使用脚本函数来获取一个字符串。
比如,存在如下的一个主键和子键项目
现在,可以用这个函数来获取出主键的子键的值。正常情况下,调用如下的函数之后,中保存的值将是“”没有引号。
int ret;
memset(string_info, 0, 128);
ret = Script_parser_fetch(“string_test”, “string_demo”, string_info, 128/sizeof(int));
if(ret < 0)
printf(“fetch script string infomation fail\n”);
printf(“fetch script string infomation ok \n”);
return ret;
参数:主键名称,即配置脚本中的主键名称,字符串形式
返回值:成功返回 主键下的子键个数
失败返回 -1
这个函数返回的是一个主键下所有的子键的个数,通常用户不会关心它。这个函数更大的用途还在于做检查。
sub_key_count = Script_parser_subkey_count (“target”);
if(sub_key_count < 0)
printf(“fetch script sub key count fail\n”);
printf(“fetch script sub key count ok , sub_key_count = %d\n”, sub_key_count);
return sub_key_count;
调用如上的函数,将获取到主键下的所有子键的个数,即得到数值。
获取主键个数
参数:无
返回值:成功返回 配置脚本中主键的总的个数
失败返回 -1
这个函数将获取所有主键的个数,和一样,主要用途还是做检查使用。
main_key_count = Script_parser_mainkey_count();
if(main_key_count < 0)
printf(“fetch script sub key count fail\n”);
printf(“fetch script main key count ok , main_key_count = %d\n”, main_key_count);
return main_key_count;
调用如上的函数,将获取到配置脚本中主键的个数。
*main_name);
参数:配置脚本中主键的名称,字符串形式
返回值:成功返回 配置脚本中主键下的,数据类型的子键个数
失败返回 -1
这个函数的调用将得到主键下的子键中,值属于类型的子键个数。
比如,当获取下的子键中的类型时,将获取到数值。
gpio_key_count = Script_parser_mainkey_get_gpio_count (“twi_para”);
if(gpio_key_count < 0)
printf(“fetch script sub key count fail\n”);
printf(“fetch script gpio key count ok , gpio_key_count = %d\n”, gpio_key_count);
return gpio_key_count;
如果把上面函数的参数替换成,则得到的将是。如果把上面函数的参数替换成,则得到的将是。
*main_name, void *gpio_cfg, int gpio_count);
参数:主键名称,即配置脚本中的主键名称,字符串形式
用于存放信息的地址,应该是属于的数据结构
用户传进的结构体的个数
返回值:成功返回失败返回-1
调用这个函数,将把配置脚本中匹配主键名称的,属于类型的子键的个数。
int ret;
ret = Script_parser_mainkey_get_gpio_cfg(“twi_para”,gpio_info, 2);
if(ret < 0)
printf(“fetch script gpio infomation fail\n”);
printf(“fetch script gpio infomation ok \n”);
return ret;
调用这个函数,将获取配置脚本里,twi_para的子键中,属于GPIO类型的描述信息。
本文大致地将sysconfig1.fex简单介绍一下,主要是为了后面分析驱动的过程做准备,大部分SUN4I平台的驱动都是采用这种方式来管理配置的,我们不妨也用这种方式.
Lichee (五) sysconfig1.fex 配置系统的更多相关文章
- Lichee (五岁以下儿童) sysconfig1.fex 配置系统
sysconfig配置系统,作为一个通用的软件平台,还希望通过它.能够适应用户不同的方案.通过给出一个相应的配置.用户的方案就能够自己主动执行,而不须要改动系统里面的代码,或者又一次给出參数. 一. ...
- 重新整理 .net core 实践篇————配置系统之盟约[五]
前言 在asp .net core 中我们会看到一个appsettings.json 文件,它就是我们在服务中的各种配置,是至关重要的一部门. 不管是官方自带的服务,还是我们自己编写的服务都是用它来实 ...
- .NET Core采用的全新配置系统[2]: 配置模型设计详解
在<.NET Core采用的全新配置系统[1]: 读取配置数据>中,我们通过实例的方式演示了几种典型的配置读取方式,其主要目的在于使读者朋友们从编程的角度对.NET Core的这个全新的配 ...
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- SuperSocket源码解析之配置系统
一 继承Net配置系统 Net应用程序配置机制跟程序集引用大致类似,均具有继承性,如iis几乎每个应用程序都会有一个Web.config,比如我们使用vs2012以上版本创建一个web应用程序会自带一 ...
- Android源码浅析(五)——关于定制系统,如何给你的Android应用系统签名
Android源码浅析(五)--关于定制系统,如何给你的Android应用系统签名 今天来点简单的我相信很多定制系统的同学都会有一些特定功能的需求,比如 修改系统时间 静默安装 执行某shell命令 ...
- kafka原理和实践(五)spring-kafka配置详解
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- 转:NGNIX模块开发——nginx的配置系统
From:http://tengine.taobao.org/book/chapter_02.html nginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置 ...
随机推荐
- Windows-caffe配置
我在博客园的第一篇博客开始了,好紧张,好激动,好淫荡...哈哈O(∩_∩)O哈! 下面开始进入正题.配置环境为windows7+cuda7.5+vs2013+matlab2014a 之前用的happy ...
- 这套完美的Java环境安装教程,完整,详细,清晰可观,让你一目了然,简单易懂。⊙﹏⊙
JDK下载与安装教程 2017年06月18日 22:53:16 Danishlyy1995 阅读数:349980 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- Revit二次开发示例:CancelSave
在Revit程序中注册文件操作事件,保存新建或打开文件的信息.当保存时,如果当前文件内容和之前的一致时,则弹出对话框提示并取消保存.对话框中有一个功能链接,点击可打开插件所在目录. #region N ...
- 简单介绍下python中函数的基础语法
python 函数 定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 特性 减少代码重复 使程序变得可扩展 使程序变得易于维护 函数的创建 pyt ...
- 【DFS好题】BZOJ1999- [Noip2007]Core树网的核(数据加强版)
NOIP的数据好水,一开始有好几个错结果NOIP数据就水过了?? [题目大意] 求无根树的直径上一段不超过S长的链,使得偏心距最小.具体概念见原题. [思路] 首先明确几个性质: (1)对于树中的任意 ...
- PHP中CGI,FastCGI,PHP-CGI与PHP-FPM对比
CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...
- Codeforces Round #356 (Div. 2) B. Bear and Finding Criminal 水题
B. Bear and Finding Criminals 题目连接: http://www.codeforces.com/contest/680/problem/B Description Ther ...
- 自动打怪 c#
其中思路很简单,单线程的一个乱七八糟的游戏 预计会更新背包,背包这个估计会用一个vector来存 图形的话,我得催催我的美工大人,她会帮我弄吧,哇哈哈 界面: namespace auttompk { ...
- vue过滤器在v2.0版本用法
vue 1.x 的写法在 vue 2.x版本已经废除 vue 1.x 写法 <body> <div id="app"> {{message | capit ...
- Spring源码解析 – @Configuration配置类及注解Bean的解析
在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化rea ...