首页 > 其他分享 >Zephyr配置系统保姆级上手教程

Zephyr配置系统保姆级上手教程

时间:2023-06-11 21:31:29浏览次数:46  
标签:文件 教程 kconfig Zephyr 配置 zephyr 保姆 west config

本文结合代码演示讲解Zephyr配置系统,代码部分是基于聆思科技的CSK6011A Nano开发板配套的SDK。
主要分三个部分来讲解:
第一部分:zephyr配置系统简介
第二部分:介绍Kconfig的常用的基础语法
第三部分:通过简单的示例工程演示应用配置


zephyr配置系统简介

构建流程

来了解一下zephyr的一个配置系统,在zephyr系统中,内核、子系统、驱动程序以及用户代码等,都可以在构建时进行灵活的配置,以裁减或配置出可满足不同功能不同平台的一个程序代码,zephyr的配置系统跟Linux内核一样,都是使用kconfig进行配置,整个zephyr程序的构建过程中主要可以分为两个阶段,一个是配置阶段,一个是构建阶段。本文主要讲解配置阶段,当在利用west调用cmake生成构建系统时,配置阶段便开始工作。

Zephyr配置系统保姆级上手教程_linux开发


从配置到宏

在配置阶段,首先通过脚本来解析设备树,然后 kconfig的脚本便开始工作,通过kconfig的配置文件prj.conf文件和${board}_defconfig文件来生成.config文件和autoconf.h文件。
.config文件主要应用于cmake文件中可以使用到的一些配置符号,autoconf.h文件主要是用于C代码源文件中可以使用到的一些宏。

Zephyr配置系统保姆级上手教程_Zephyr_02

如上图右边autoconf.h中就是最熟悉的C代码中的一些宏,在代码中引用这个头文件就可以使用到这些配置宏。


Kconfig简介

kconfig 与 menuconfig

kconfig是kernel configuration的缩写,Kconfig 是 linux 内核中的一种配置系统,它是一种基于文本文件的配置系统,它允许用户便捷地选择要编译到内核中的指定的功能和驱动程序。
menuconfig 是一套基于终端文本的配置工具,它可以用图像化的方式来配置kconfig。

Zephyr配置系统保姆级上手教程_Kconfig实战_03


kconfig 解析器

kconfig 可以认为是一种语法或者规则,所以需要有一个解析器来解析其语法。

Zephyr配置系统保姆级上手教程_构建流程_04

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表示定义一个条件块。其他的那个菜单项都会依赖于该条件块的一个依赖,它也是一个成对出现的。

Zephyr配置系统保姆级上手教程_构建流程_05

在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 进行实战:

  1. 增加一个定时打印的配置
  2. 可以通过配置来改变打印的内容和时间间隔
  3. 定义不同的源文件,演示cmake通过配置来编译不同的源文件
  4. 定义不同的配置文件,在编译的时传递

Zephyr配置系统保姆级上手教程_linux开发_06

在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配置系统保姆级上手教程_linux开发_07

上图就是zephyr支持的图形化的配置,可以相关配置选项。下面显示的是一些快捷键,例如S代表save; ?可以展示当前符号的一些详细信息; Q是退出终端配置的界面。

1、手工添加一个可以config的文件,先把print的default设置为“n”。
注意:如果项目工程中有kconfig文件,必须手动去引用一下kconfig.zephyr文件。

Zephyr配置系统保姆级上手教程_Kconfig实战_08

2、编译:west build -b csk6011a_nano -p
3、编译完后,在build/zephyr下面会出现如下配置?

Zephyr配置系统保姆级上手教程_Kconfig实战_09

在该示例中最终在C代码中所使用的配置其实是include/generated/autoconf.h里面的一些宏,这些宏就是通过kconfig文件生成的

4、再做一个实验,把print的default设置改为“y”

Zephyr配置系统保姆级上手教程_Kconfig实战_10

5、重新编译:west build -b csk6011a_nano -p
6、可以看到print项使能更改为“y”,依赖于print的选项也生成了

Zephyr配置系统保姆级上手教程_Zephyr_11

7、打开include/generated/autoconf.h,可以看到新生成了三个宏

Zephyr配置系统保姆级上手教程_Zephyr_12

8、代码示例:使用新生成的print的宏实现循环打印

Zephyr配置系统保姆级上手教程_构建流程_13

9、编译/烧录,此处烧录使用的是聆思科技的CSK6011A Nano开发套件

west build -b csk6011a_nano -p
west flash && picocom -b 115200 /dev/ttyACM0


10、按下开发板复位键,可以看到开发板按定义的循环打印输出

改变打印的内容和时间间隔

1、更改打印内容:在项目工程的pro.conf文件中是可以去定义打印内容的,例如更改打印内容和间隔。

Zephyr配置系统保姆级上手教程_构建流程_14

2、 更改完后再烧录进开发板:

west flash && picocom -b 115200 /dev/ttyACM0

3、可以看到打印内容更改的结果

Zephyr配置系统保姆级上手教程_linux开发_15

让cmake通过配置来编译不同的源文件

在zephyr的项目中,Kconfig给的一些配置符号不仅可以在代码源文件中使用,也可以在cmake脚本中去使用。在cmake的脚本中,可以根据不同的功能需求,让指定不同的语言文件参与编译。接下来把前面实验的循环打印的代码放到新的源文件中参与编译。

1、新建print.c的一个文件,把循环打印的部分代码copy到print.c中。

Zephyr配置系统保姆级上手教程_Kconfig实战_16

2、然后在main.c中调用函数

Zephyr配置系统保姆级上手教程_Zephyr_17

3、修改cmake文件

Zephyr配置系统保姆级上手教程_linux开发_18

4、修改prj.conf

Zephyr配置系统保姆级上手教程_构建流程_19

5、编译/烧录

west build -b csk6011a_nano -p
west flash && picocom -b 115200 /dev/ttyACM0

6、按下开发板的复位键,可以看到如预期的打印输出

Zephyr配置系统保姆级上手教程_linux开发_20

Zephyr已经提供了很多的cmake的一些函数来方便使用,大家有兴趣的话可以去看一下。比如说如下图的驱动中,zephyr就已经提供了一些很多的接口

Zephyr配置系统保姆级上手教程_构建流程_21

知识点总结如下:

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

相关文章

  • Makefile基础教程(伪目标)
    (文章目录)前言本篇文章将讲解Makefile中的伪目标,Makefile的目标在前面的文章中我们已经讲解了那么这篇文章我们就来讲讲伪目标。一、伪目标概念Makefile伪目标是一类特殊的目标,它们的目的是提供给make工具一些命令,而不是用来构建文件的。因为伪目标通常不会对应实际的文件......
  • Makefile教程(Makefile的结构)
    (文章目录)前言一、Makefile的结构Makefile通常由一系列规则组成,每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。下面是Makefile规则的基本结构:target:dependenciescommand1command2...其中,target是要生成的目标文......
  • Makefile教程(入门介绍)
    (文章目录)前言本篇文章将带大家学习Makefile,Makefile在文件的编译中起到重要作用,在Linux中我们也是经常使用到Makefile,下面我将会带大家学习什么是Makefile。一、Makefile介绍Makefile是用于自动化构建程序的一种工具,它通常被用于编译,连接以及打包程序等任务。Makefile利用了......
  • 软件测试|数据分析神器pandas教程(一)
    前言Python是非常适合用于数据分析的,除了Python代码简单以外,Python还有非常多的第三方库,对于数据分析有很大帮助,今天我们就介绍一下Python进行数据分析的神器——pandas。安装从2019年1月1号开始,新发布的pandas将只支持Python3版本,所以我们的教程也以python3.7为例进行演示。......
  • 软件测试|数据分析神器pandas教程(二)
    前言上一篇文章我们介绍了pandas的安装,并且写了一个简单的示例,本篇文章我们就开始学习pandas的数据结构。数据结构-SeriesPandasSeries类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。Series由索引(index)和列组成,函数如下:pandas.Series(data,index,dtyp......
  • 通过 docker-compose 快速部署 Azkaban 保姆级教程
    目录一、概述二、Azkaban的调度流程三、前期准备1)部署docker2)部署docker-compose四、创建网络五、Azkaban编排部署1)安装MySQL2)下载Azkaban编译3)初始化azkaban用户和表4)配置5)启动脚本bootstrap.sh6)构建镜像Dockerfile7)编排docker-compose.yaml8)开始部署六、简单测试验......
  • 软件测试|web自动化测试神器playwright教程(十五)
    前言我们在日常工作中,会经常遇到弹出警告框的问题,弹框无法绕过,必须处理才可以执行后续的测试,所以弹框处理也是我们必须掌握的一个知识。弹框通常分为3种,分别为alert,confirm,promot。alert弹框:只有信息和确定按键confirm弹框:在alert弹窗基础上增加了取消按钮prompt弹框:在confirm的基......
  • 软件测试|web自动化测试神器playwright教程(十六)
    前言在我们的日常工作中,经常会遇到文件下载的事件,如下图:我们可以看到在下载文件时会弹出一个Windows对话框,我们知道,selenium只能操作web页面,无法操作Windows对话框,使用selenium时,我们可以借助autoit等工具实现该功能。playwright则可以不借助其他工具实现文件的下载。文件下载playw......
  • MySQL Workbench的使用教程
        MySQLWorkbench是MySQLAB最近释放的可视数据库设计工具。这个工具是设计MySQL数据库的专用工具。MySQLWorkbench拥有很多的功能和特性;这篇由DjoniDarmawikarta写的文章通过一个示例展现了其中的一些。我们将针对一个订单系统建立一个物理数据模型,这里的订单......
  • .net framework生成Nuget包简单教程
    前言nuget包生成在.netframework和.netcore/.netstandard下的是不同的。.netframework中稍微复杂些,下面记录了我自己在.netframework中本地生成Nuget包的过程,只涉及主要步骤,更多细节参见微软官方文档。步骤1,到https://www.nuget.org/downloads下载nuget.exe,下载完我放在D......