请选择 进入手机版 | 继续访问电脑版
查看: 3407|回复: 6

清风徐来——Zephyr实战篇(4)之Kconfig

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
    发表于 2021-10-11 11:10:02 | 显示全部楼层 |阅读模式
    这次小编为大家带来的是ZephyrOS系列文章的第五篇,将为大家介绍Kconfig。

    这次小编紧接着上篇给大家带来ZephyrOS中对于Kconfig的介绍。


    简单的来说,Kconfig就是Zephyr的配置系统,Zephyr内核可以在构建阶段,根据不同的配置,包含特定的应用和平台。而这个配置过程正是通过Kconfig实现的,其也与Linux内核配置所使用的Kconfig完全一致。设计目标就是让我们无需修改源代码就可以完成Zephyr的配置工作,包括内核,硬件,子系统等。
    通常配置项(也被称作symbol)是在Kconfig文件中定义的。当然不同的配置项之间也是可以存在依赖关系的,比如定义一个符号A,它依赖于B,那么只有当B被使能之后,A才是有效的。同时,所有的符号可以被合并到一个叫做menu/sub-menu的组里面,便于图形化管理。
    在正式开篇之前,小编先给大家推荐一个小工具,叫做menuconfig,他是一个可选的图形化工具,可以用来查看和修改Kconfig设置:
    13.png
    当然默认是不会打开的,即默认使用west构建工程是不支持menuconfig的,需要传入-t menuconfig参数:


    west build –t menuconfig –b mimxrt1060_evksamples\hello_world


    最终,所有配置项会被生成到一个叫做autoconf.h的文件中,没有用到的代码就不会再被编译系统所编译,以节省代码空间。

    下面,介绍Kconfig中的一个比较重要的概念,visible和invisible符号。


    首先说visible符号,也就是那些可以在menuconfig窗口中见到的,这些符号,通常都有一个prompt属性,即一个字符串来进行描述,例如:


    config FPU
      bool “Support floating point operations”
      depends on HAS_FPU
    然后,我们就可以在menuconfig界面中找到他:


    [ ] Support floating pointoperations


    Invisible符号则与之相对,一般没有prompt属性,即字符串来说明,例如:
    config CPU_HAS_FPU
      bool
      help
          This symbol is y if the CPU has a hardwarefloating point unit.


    他的特殊性在于,这些符号对于用户是不可见的,即不能通过menuconfig提供的图形化工具来配置,只能通过其他手段来修改其的值。


    例如,通过Kconfig.defconfig文件设置下面这个符号的值为32:


    config FOO_WIDTH
      int


    我们就可以在Kconfig.defconfig文件中定义:


    config FOO_WIDTH
      default 32
    endif


    这样一来,我们就修改了FOO_WIDTH的默认值为32。


    要注意的是,Kconfig.defconfig中所定义的默认值会覆盖掉起始值,且优先级比较高。

    我们再举一个choice的例子,比起上面我们定义的config形式的变量,choice类似于一种单选框,当有多个配置存在时,只能一个配置项有效,这样一来,达到一个互斥的效果。要如何操作呢?假定有一个choice叫做FOO,他有两个配置项A和B,初始默认值是B:


    choice FOO
      bool “Foo choice”
      default B
    config A
      bool “A”
    config B
      bool “B”
    endchoice


    下面我们把他的默认值修改为A,完成这个操作,除了在Kconfig.defconfig中修改外,我们还可以在prj.conf中添加:


    choice FOO
      default A
    endchoice


    当然,这里要注意,如果我们定义了一个invisible的choice变量FOO的话,就只能通过Kconfig.defconfig来修改了。

    那么在Zephyr工程中,都有哪些修改默认配置的地方呢?如果只考虑板级(即Zephyr所支持的开发板)+ 应用这一层,大致分为三类:


    板子相关的配置文件,一般名为:boards/<ARCH>/<BOARD>/<BOARD>_defconfig


    任意的CMake cache文件,以CONFIG_开头


    应用配置:
    a)     默认prj.conf
    b)     通过-DCONF_FILE=<conf_file>指定,进行重载
    c)     通过-DOVERLAY_CONFIG=<conf_file>指定,进行扩展
    d)     通过prj_<BOARD>.conf进行重载
    e)     通过boards/<BOARD>.conf进行扩展


    那么小编就不再扩展Kconfig的其他语法了,大家可以参考这里来了解更多。

    至此,Zephyr所使用的两大配置系统就大致讲完了,那么有朋友可能会问了,我们什么时候要用DeviceTree什么时候要用Kconfig呢?小编在这里简单总结一下:


    使用设备树来描述硬件和启动配置,例如板载外设和设置启动时系统时钟频率等


    使用Kconfig来配置哪些源代码将要被放到最终的镜像中,例如是否添加网络的支持,哪个驱动是需要的。


    通俗点讲,DeviceTree负责管理那些硬件资源,Kconfig负责管理软件资源。


    举个例子,有个设备同时拥有2.4GHz,multi-protocol radio; 蓝牙和802.15.4,那么设备树就用来描述:


    ·是否有radio硬件存在
    ·兼容性驱动
    ·启动阶段配置,比如TX power in dBm


    Kconfig文件决定哪个软件包需要被构建,是选择BLE还是选择802.15.4协议栈。

    聊到这里,结合上一篇关于DeviceTree的文章,小编就将DeviceTree和Kconfig的一


    些知识点分享给大家了,不过,限于篇幅,都只是一些比较简单的介绍,大家可以自行深入探索。

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 14:29
  • 签到天数: 931 天

    [LV.10]以坛为家III

    0

    主题

    2496

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    4788
    最后登录
    2024-3-29
    发表于 2021-11-1 20:04:43 | 显示全部楼层
    学习了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 19:45
  • 签到天数: 2012 天

    [LV.Master]伴坛终老

    17

    主题

    4789

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    9808
    最后登录
    2024-3-28
    发表于 2021-11-1 21:42:12 | 显示全部楼层
    DeviceTree负责管理那些硬件资源,Kconfig负责管理软件资源。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 23:06
  • 签到天数: 1467 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92135
    最后登录
    2024-3-28
    发表于 2021-11-1 21:46:06 | 显示全部楼层
    学习一下~~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    16 小时前
  • 签到天数: 1268 天

    [LV.10]以坛为家III

    7

    主题

    5767

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    9898
    最后登录
    2024-3-29
    发表于 2021-11-1 22:47:47 | 显示全部楼层
    学习学习
    回复

    使用道具 举报

    该用户从未签到

    12

    主题

    789

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2637
    最后登录
    2024-1-11
    发表于 2021-11-2 08:37:33 | 显示全部楼层
    前来学习
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 10:05
  • 签到天数: 827 天

    [LV.10]以坛为家III

    1

    主题

    2058

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4253
    最后登录
    2024-3-27
    发表于 2021-11-2 09:22:13 | 显示全部楼层
    学习了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 16:53 , Processed in 0.138161 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表