Zephyr-系统配置(Kconfig)

目录

1 摘要

2 交互式配置

2.1 menucofnig

2.2 guiconfig

3 Kconfig结构

3.1 SubKconfig

3.2 .deconfig

3.3 Initial Configuration

3.4 Kconfig预处理函数

4 总结


1 摘要

        Zephyr 内核和子系统可以在构建时进行配置,以适应特定的应用和平台需求。配置通过 Kconfig 处理,这是 Linux 内核使用的相同配置系统。目标是无需更改任何源代码下支持各种配置。

2 交互式配置

  • 支持两种交互式配置方式:menuconfig和guiconfig。
  • 和linux内核配置一样,最终配置会写入.config文件,保存至zephyr/bulid/zephyr路径下。

PS:当然,用户也可以直接通过zephyr/.config来修改配置symbol,这样会存在风险。上述两个系统提供的交互式配置方式会很好的处理各symbol之间的依赖关系。直接修改.config往往会忽视这种场景,不建议使用

2.1 menucofnig

  • 执行该命令后可使用menuconfig进行symbol配置
#-b <board>:指定硬件平台
#-t menuconfig:使用memuconfig
#<app root>:应用工程CMakeList.txt所在路径 
west build -b <board> -t menuconfig <app root>
  • 完成设置后保存退出,相关配置会保持至zephyr/build/zephyr/.config文件中

2.2 guiconfig

  • 执行该命令后可使用guiconfig进行symbol配置
#-b <board>:指定硬件平台
#-t guiconfig:使用guiconfig
#<app root>:应用工程CMakeList.txt所在路径 
west build -b <board> -t guiconfig <app root>

3 Kconfig结构

  • 顶层文件在zephyr/kconfig,直接调用Kconfig.zephyr。该文件一方面会包含各级子目录下的subkconfig文件,形成交互界面的各级菜单和symbol;另一方面包含各种.deconfig文件,具体作用下面会分析到。
  • 同时每个board会有一个初始配置Inital Configuration,它是由三个源头合并而成的。
  • Kconfig支持获取dts信息,如何使用下面会分析
  • 最后通过scripts/kconfig下的pyhton脚本生成.config和autoconf.h文件

3.1 SubKconfig

和linux内核配置系统一样,组成各级子菜单和symbol

3.2 .deconfig

官方文档说明该文件是用于修改“invisible Kconfig symbols”。按我的理解,就是不建议用户修改的特定配置。比如某个硬件板,必须特定的配置会由原厂固定写在.deconfig文件中,并且都是invisible Kconfig symbols,不会出现在交互式配置界面上。

3.3 Initial Configuration

  • boards///_defconfig。该文件是由开发人员做为板级基本配置提交到内核中,也支持用户通过menuconfig交互界面修改。
  • 应用配置pri.conf。作用于该工程,可让用户在不修改内核的情况下,添加自己项目所需的配置信息。

        PS:pri.conf对symbol的配置优先级是最高的

  • CMake中带CONFIG_ 前缀的entries

3.4 Kconfig预处理函数

  • Kconfiglib支持用Python编写的自定义Kconfig预处理器函数,主要应用是用于获取设备树信息。
  • 支持如下函数
$(dt_chosen_reg_addr_int,<property in /chosen>[,<index>,<unit>])
$(dt_chosen_reg_addr_hex,<property in /chosen>[,<index>,<unit>])
$(dt_chosen_reg_size_int,<property in /chosen>[,<index>,<unit>])
$(dt_chosen_reg_size_hex,<property in /chosen>[,<index>,<unit>])
$(dt_node_reg_addr_int,<node path>[,<index>,<unit>])
$(dt_node_reg_addr_hex,<node path>[,<index>,<unit>])
$(dt_node_reg_size_int,<node path>[,<index>,<unit>])
$(dt_node_reg_size_hex,<node path>[,<index>,<unit>])
$(dt_compat_enabled,<compatible string>)
$(dt_chosen_enabled,<property in /chosen>)
$(dt_node_has_bool_prop,<node path>,<prop>)
$(dt_node_has_prop,<node path>,<prop>)
  • 以官方例子说明如何使用
//某设备树的部分信息如下
{
     soc {
             #address-cells = <1>;
             #size-cells = <1>;

             spi0: spi@10014000 {
                     compatible = "sifive,spi0";
                     reg = <0x10014000 0x1000 0x20010000 0x3c0900>;
                     reg-names = "control", "mem";
                     ...
             };
};

//用户在kconfig如下配置,
config FLASH_BASE_ADDRESS
    //获取/soc/spi@1001400子节点,序号1(第二个)block中reg_addr,并以16进制输出
     default $(dt_node_reg_addr_hex,/soc/spi@1001400,1)
     
//经过预处理后等同于
config FLASH_BASE_ADDRESS
     default 0x20010000

3.5 .config & autoconf.h

  • .config:是在交互式配置退出时保存配置数据至该文件,路径在bulid/zephyr/下

  • autoconf.h:已经过预处理器转换为头文件,生成路径在bulid/zephyr/include/generated/下

4 总结

        整体上和linux的配置系统一致,由顶层Kconfig文件和Initial Configuration入手,找到线头再慢慢深入了解。

        对于交互式界面配置也可以从zephyr\scripts\kconfig目录下的guiconfig.py和menuconfig.py入手,获取更详细的信息。

        另外zephyr还支持用户Kconfig预处理函数,是通过scripts/kconfig/kconfigfunctions.py​来实现。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值