本文结合代码演示讲解Zephyr配置系统,代码部分是基于聆思科技的CSK6011A Nano开发板配套的SDK。
主要分三个部分来讲解:
第一部分:zephyr配置系统简介
第二部分:介绍Kconfig的常用的基础语法
第三部分:通过简单的示例工程演示应用配置
zephyr配置系统简介
构建流程
来了解一下zephyr的一个配置系统,在zephyr系统中,内核、子系统、驱动程序以及用户代码等,都可以在构建时进行灵活的配置,以裁减或配置出可满足不同功能不同平台的一个程序代码,zephyr的配置系统跟Linux内核一样,都是使用kconfig进行配置,整个zephyr程序的构建过程中主要可以分为两个阶段,一个是配置阶段,一个是构建阶段。本文主要讲解配置阶段,当在利用west调用cmake生成构建系统时,配置阶段便开始工作。
从配置到宏
在配置阶段,首先通过脚本来解析设备树,然后 kconfig的脚本便开始工作,通过kconfig的配置文件prj.conf文件和${board}_defconfig文件来生成.config文件和autoconf.h文件。
.config文件主要应用于cmake文件中可以使用到的一些配置符号,autoconf.h文件主要是用于C代码源文件中可以使用到的一些宏。
如上图右边autoconf.h中就是最熟悉的C代码中的一些宏,在代码中引用这个头文件就可以使用到这些配置宏。
Kconfig简介
kconfig 与 menuconfig
kconfig是kernel configuration的缩写,Kconfig 是 linux 内核中的一种配置系统,它是一种基于文本文件的配置系统,它允许用户便捷地选择要编译到内核中的指定的功能和驱动程序。
menuconfig 是一套基于终端文本的配置工具,它可以用图像化的方式来配置kconfig。
kconfig 解析器
kconfig 可以认为是一种语法或者规则,所以需要有一个解析器来解析其语法。
Kconfiglib
是一个用 python2/3 实现的库,拥有良好的跨平台性,详细信息可以访问https://pypi.org/project/kconfiglib/ 来了解。
菜单项
menu和end manu总是成对出现,菜单块内的其他子菜单项都可以继承该菜单项的一个依赖,menu config和config有点一样,也是定义一个配置符号,同时也表示一个菜单块,它可以包含其他的菜单项。
Choice her and choice也必须成对出现的,它定义了一个配置组,该组内的只能使用布尔值或者三态值,它同时只能允许一个配置项被使能。
Comment表示注释,在many configure中会展示出来,且会输出到最终的一个文件中。
配置项config表示定义一个配置符号,后面会详细讲解
引用source表示读取指定的kconfig文件并进行解析,if、and if表示定义一个条件块。其他的那个菜单项都会依赖于该条件块的一个依赖,它也是一个成对出现的。
在kconfig的配置文件中,以config关键字开头的语法块表示这是一个配置项,紧跟在config后面的表示配置符号,在最终生成的文件中会自动在该配置符号面面前追加一个前缀config。
在每个配置项中都可以含有一个或多个属性,在每个配置箱中都必须含有一种数据类型(有且只有一种数据类型)。数据类型只能从三态字符串布尔、十六进制、整型中选取一种输入提示,用来在manu config中给予用户一个最简单的一个提示,在每个配置项中最多只能有一个提示。
默认值default在表示每个配置项中的一个默认值,常常和if进行联合使用,帮助文本用来给予用户关于该配置项的更加详细的介绍,可以为多行或者说空行数值范围range。即表示在int和X的一个数据类型中的数值范围,它只能在作用于hex或int的一个数据类型,依赖if和depends on。当所依赖的那个配置符号为Y的时候,当前的配置项才会有效。
反向依赖,只作用于布尔或者说三态的一个数据类型。当前配置上有效的被使能或者说有效的时候会自动的去选择被反向依赖的那个项,把它设为y。
弱反向依赖,弱反向依赖跟select有点相似,但作用性没有select那么强。被弱反向依赖的配置下,仍有可能在用户配置阶段,给它设置为N。
配置项中的一些基本属性并不是在同一个配置项中都必须要用到。比如说range,只能作用于heX和int类型中。
Zephyr中的Kconfig实战
基于 helloworld 进行实战:
- 增加一个定时打印的配置
- 可以通过配置来改变打印的内容和时间间隔
- 定义不同的源文件,演示cmake通过配置来编译不同的源文件
- 定义不同的配置文件,在编译的时传递
在Zephyr的项目工程中,默认会到项目目录下去寻找kconfig文件。如果没有找到,就会默认使用Zephyr根目录下kconfig文件。Zephyr根目录的kconfig文件会去读取同目录下的kconfig.Zephyr文件。在实际的项目过程中,如果在项目的目录下面自己定义kconfig,一定要记得去引用一下zephyr目录下的kconfig.zephyr文件。
增加一个定时打印的配置
先不建立kconfig文件,来看一下menuconfig是如何在zephyr项目过程中使用的。
首先build一下 Hello_world工程,确保每次构建的都是一个最新的产物(这里使用的是聆思csk6011a_nano开发板)
west build -b csk6011a_nano -p
build执行完成后输入另一条命令打开的基于终端文本的图形化的配置界面
west build -t menuconfig
上图就是zephyr支持的图形化的配置,可以相关配置选项。下面显示的是一些快捷键,例如S代表save; ?可以展示当前符号的一些详细信息; Q是退出终端配置的界面。
1、手工添加一个可以config的文件,先把print的default设置为“n”。
注意:如果项目工程中有kconfig文件,必须手动去引用一下kconfig.zephyr文件。
2、编译:west build -b csk6011a_nano -p
3、编译完后,在build/zephyr下面会出现如下配置?
在该示例中最终在C代码中所使用的配置其实是include/generated/autoconf.h里面的一些宏,这些宏就是通过kconfig文件生成的
4、再做一个实验,把print的default设置改为“y”
5、重新编译:west build -b csk6011a_nano -p
6、可以看到print项使能更改为“y”,依赖于print的选项也生成了
7、打开include/generated/autoconf.h,可以看到新生成了三个宏
8、代码示例:使用新生成的print的宏实现循环打印
9、编译/烧录,此处烧录使用的是聆思科技的CSK6011A Nano开发套件
west build -b csk6011a_nano -p
west flash && picocom -b 115200 /dev/ttyACM0
10、按下开发板复位键,可以看到开发板按定义的循环打印输出
改变打印的内容和时间间隔
1、更改打印内容:在项目工程的pro.conf文件中是可以去定义打印内容的,例如更改打印内容和间隔。
2、 更改完后再烧录进开发板:
west flash && picocom -b 115200 /dev/ttyACM0
3、可以看到打印内容更改的结果
让cmake通过配置来编译不同的源文件
在zephyr的项目中,Kconfig给的一些配置符号不仅可以在代码源文件中使用,也可以在cmake脚本中去使用。在cmake的脚本中,可以根据不同的功能需求,让指定不同的语言文件参与编译。接下来把前面实验的循环打印的代码放到新的源文件中参与编译。
1、新建print.c的一个文件,把循环打印的部分代码copy到print.c中。
2、然后在main.c中调用函数
3、修改cmake文件
4、修改prj.conf
5、编译/烧录
west build -b csk6011a_nano -p
west flash && picocom -b 115200 /dev/ttyACM0
6、按下开发板的复位键,可以看到如预期的打印输出
Zephyr已经提供了很多的cmake的一些函数来方便使用,大家有兴趣的话可以去看一下。比如说如下图的驱动中,zephyr就已经提供了一些很多的接口
知识点总结如下:
1、zephyr构建过程中的配置阶段
2、Kconfig配置阶段的输出产物
3、基本的Kconfig语法
4、默认配置文件prj.conf与kconfig
5、指定特定的配置文件(-DCONF_FILE)
6、对配置文件进行overlay(-DOVERLAY_CONFIG)
7、在cmake脚本中使用kconfig配置符号
更多学习资源
如果需要获取本教程相关的学习资源、代码,
或者了解更多与嵌入式开发、AI芯片相关的其他课程,可以点击查看目录导航。
标签:文件,教程,kconfig,Zephyr,配置,zephyr,保姆,west,config From: https://blog.51cto.com/u_15947017/6459065