我是靠谱客的博主 朴实帅哥,最近开发中收集的这篇文章主要介绍Kconfig [@rt-thread],觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果想要得到自己想要的定制效果, 很难找到现成的方法, 这个时候我们需要对项目进行定制化修改.

经过刚才的介绍, 我们知道了 rt-thread 官方提供了 kconfig 工具来帮助我们管理 宏定义, 那么这些宏定义是在怎么来的呢, 我们来看看.

# 定义一个, MODVERSIONS
config MODVERSIONS

    # bool: 表示类型, 一共有 bool(y/n), tristate(y/n/m), string, hex, int 五种类型.
    # "Set version information on all module symbols": 这个是显示的提示
    bool "Set version information on all module symbols"

    # 通过 default 默认值,  下面语句表示, 如果 BAR 被选中, 那么 默认值就为 y. 
    default y if BAR
    
    # depends on: 表示依赖于, 如果依赖的选项没有被选中, 那么该配置不会显示
    # BAR && m: BAR 和 m 分别为两个依赖的选项, 多个依赖的选项可以进行简单的逻辑运算.
    depends on BAR && m

    # 通过 select 关联其他选项, 如果本选项为真, 那么就将 HAVE_GENERIC_IOMAP 也选中.
    select HAVE_GENERIC_IOMAP

    # 帮助文档
    help
        Usually, modules have to be recompiled whenever you switch to a new
        kernel.  ...

其实

    bool "Set version information on all module symbols"

    bool
    prompt "Set version information on all module symbols"

是等价的.

prompt 格式的完整样式是 “prompt” <prompt> [“if” <expr>], 可以加入 <expr> 表达式 , 注意, 只能有一个prompt.

default定义默认值, 可以有0个或则多个, 样式为 “default” <expr> [“if” <expr>], 如果default多个同时条件满足,那么只有第一个满足条件的值有效.

select可以确定其他选项的情况, 样式为: “select” <symbol> [“if” <expr>], 这种选项的关联特别强, 配置选项被选中, 那么目标选项一定被选中.

官方提供了一个 imply 的属性. 样式为 “imply” <symbol> [“if” <expr>], 影响目标选项的默认值, 让目标选项的默认值不高于该选项的最大选项. 看下面例子.

config FOO
    tristate "foo"
    imply BAZ

config BAZ
    tristate "baz"
    depends on BAR
FOOBARBAZ’s defaultchoice for BAZ
yyyY/m/n
ymnM/n
ynN
mymM/y/n
mmmM/n
nynN/m/y
nmnN/m

定义该选项是否进行显示, 我们可以使用visible if来完成. 样式为 “visible if” <expr>

定义数字类型的取值范围, 我们可以使用 range 完成, 样式为 “range” <symbol> <symbol> [“if” <expr>],

其他选项, 我们可以通过 option 来自定义, 样式为 “option” <symbol>[=<value>]

还有就是上面提到的表达式, 其实可以进行一些简单的逻辑运算:

<expr> ::= <symbol>                           (1)
         <symbol> '=' <symbol>                (2)
         <symbol> '!=' <symbol>               (3)
         <symbol1> '<' <symbol2>              (4)
         <symbol1> '>' <symbol2>              (4)
         <symbol1> '<=' <symbol2>             (4)
         <symbol1> '>=' <symbol2>             (4)
         '(' <expr> ')'                       (5)
         '!' <expr>                           (6)
         <expr> '&&' <expr>                   (7)
         <expr> '||' <expr>                   (8)
  1. 在表达式计算的时候, bool和tristate可以对应的转化为对应的值, 其他的类型转化为 ‘n’
  2. 如果两则相同, 那么就 返回 y. 否则 返回 n
  3. 如果两者不同, 那么就 返回 n. 否则 返回 y
  4. 如果 symbol1 比 symbol2 小, 大, 小于等于, 大于等于. 那么就返回 y. 否则返回 n
  5. 优先返回表达式的值
  6. 返回 2-expr 的值
  7. 返回两者之间的最小值
  8. 返回两者之间的最大值

如果将所有配置都放在一页上面, 就算是作者本人, 可能也不记得几百上千的配置顺序. 对配置进行分类管理, 无疑是非常好的决定.
kconfig 里面用菜单的方式进行分类, 这里有两种写法.

  1. 在 menu 和 endmenu 之间直接书写:

    menu "Network device support"
        depends on NET
    
    config NETDEVICES
        ...
    
    endmenu
    
  2. 使用配置是否可见的方式来实现

    config MODULES
        bool "Enable loadable module support"
    
    # 如果 MODVERSIONS 依赖于 MODULES 的'选中', 那么只有'选中'了, MODVERSIONS才显示出来
    config MODVERSIONS
        bool "Set version information on all module symbols"
        depends on MODULES
    
    # 如果 MODVERSIONS 依赖于 MODULES 的'不选中', 那么只有'不选中'了, MODVERSIONS才显示出来
    comment "module support disabled"
        depends on !MODULES
    

下面系统的介绍下 kconfig 的模块:

  1. config

    "config" <symbol>
    <config options>
    
  2. menuconfig

    和 config 比较类似, 不过该选项是管理一个列表.

    "menuconfig" <symbol>
    <config options>
    
    (1):
    # 如果 M 被 配置, 那么 C1 和 C2 就会被显示, 否则不被显示.
    menuconfig M
    if M
        config C1
        config C2
    endif
    
    (2):
    menuconfig M
    config C1
        depends on M
    config C2
        depends on M
    

    下面的 C0 不会依赖于 M的配置, 所以一直会被显示出来. C1, C2 会根据 M的配置做显示.

    (3):
    menuconfig M
        config C0
    if M
        config C1
        config C2
    endif
    
    (4):
    menuconfig M
    config C0
    config C1
        depends on M
    config C2
        depends on M
    
  3. choice/endchoice
    choice 只能是 bool 或者 tristate 类型

    "choice" [symbol]
    <choice options>
    <choice block>
    "endchoice"
    
  4. comment
    注释

    "comment" <prompt>
    <comment options>
    
  5. menu/endmenu
    菜单模块

    "menu" <prompt>
    <menu options>
    <menu block>
    "endmenu"
    
  6. if/endif
    条件模块

    "if" <expr>
    <if block>
    "endif"
    
  7. source
    应用其他文件内容

    "source" <prompt>
    
  8. mainmenu
    菜单头

    "mainmenu" <prompt>
    

参考

  • kconfig-language

最后

以上就是朴实帅哥为你收集整理的Kconfig [@rt-thread]的全部内容,希望文章能够帮你解决Kconfig [@rt-thread]所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部