Kconfig 编写备忘录

文章更新版本时间更新说明修订人
V0.1发布于2020-05-01初始版本libo
V0.2修改于2020-05-08添加0/9/10/11/12libo
V0.3修改于2020-09-09修改8libo

0. kconfig 格式

  1. kconfig 使用缩进进行语法分析
  2. ESP-IDF 建议将 TAB 修改为 4 个连续空格
  3. 每一级之间需要保持 4 个空格的缩进
  4. 每一行结束,不能加空格
  5. 慎用反斜杠

ESP-IDF 附带了kconfig文件格式检查工具check_kconfigs.py,详见:Format checker

1. menu 嵌套

  • 设置 menu 可见性
  • 设置嵌套目录,支持多级嵌套
menu "ESP32S2-specific"
    visible if IDF_TARGET_ESP32S2 # 设置可见性
    
    menu "Cache config" #嵌套目录
    #
    #
    #
    endmenu

endmenu

2. 条件式默认值

  • 使用default 可以设置配置项的默认值
  • 使用default () if ()设置不同条件下的默认值
  • if后可以添加操作符如if !IDF_ENV_FPGA
    config ESP32S2_DEFAULT_CPU_FREQ_MHZ
        int
        default 40 if IDF_ENV_FPGA
        default 80 if ESP32S2_DEFAULT_CPU_FREQ_80
        default 160 if ESP32S2_DEFAULT_CPU_FREQ_160
        default 240 if ESP32S2_DEFAULT_CPU_FREQ_240

使用条件默认之后,一般不再要求用户自行输入,因此不在类型后面加提示符,也不使用prompt添加提示,但是并不是不可以,如以下例子:

    config ESP32S2_ULP_COPROC_RESERVE_MEM
        int
        prompt "RTC slow memory reserved for coprocessor" if ESP32S2_ULP_COPROC_ENABLED
        default 512 if ESP32S2_ULP_COPROC_ENABLED
        range 32 8192 if ESP32S2_ULP_COPROC_ENABLED
        default 0 if !ESP32S2_ULP_COPROC_ENABLED
        range 0 0 if !ESP32S2_ULP_COPROC_ENABLED
        help
            Bytes of memory to reserve for ULP coprocessor firmware & data.

            Data is reserved at the beginning of RTC slow memory.

3. 条件式范围

  • 使用 range () () if ()设置条件式范围
    config ESP32S2_ULP_COPROC_RESERVE_MEM
        int
        prompt "RTC slow memory reserved for coprocessor" if ESP32S2_ULP_COPROC_ENABLED
        default 512 if ESP32S2_ULP_COPROC_ENABLED
        range 32 8192 if ESP32S2_ULP_COPROC_ENABLED
        default 0 if !ESP32S2_ULP_COPROC_ENABLED
        range 0 0 if !ESP32S2_ULP_COPROC_ENABLED
        help
            Bytes of memory to reserve for ULP coprocessor firmware & data.

            Data is reserved at the beginning of RTC slow memory.

4. 条件式提示

  • 可以直接在类型后面添加"string",添加配置项的界面提示
  • 不添加提示,默认不再界面进行显示,不与用户直接交互
  • 也可通过prompt添加提示,相比直接在类型后面添加"string",该方式更加灵活。可以通过 prompt "string" if () 实现条件提示

例:只在 ESP32S2_ULP_COPROC_ENABLED 使能时添加界面提示,否则使用默认值

    config ESP32S2_ULP_COPROC_RESERVE_MEM
        int
        prompt "RTC slow memory reserved for coprocessor" if ESP32S2_ULP_COPROC_ENABLED
        default 512 if ESP32S2_ULP_COPROC_ENABLED
        range 32 8192 if ESP32S2_ULP_COPROC_ENABLED
        default 0 if !ESP32S2_ULP_COPROC_ENABLED
        range 0 0 if !ESP32S2_ULP_COPROC_ENABLED
        help
            Bytes of memory to reserve for ULP coprocessor firmware & data.

            Data is reserved at the beginning of RTC slow memory.

5. 多选一选项

  • 使用 choice ...endchoice 可以配置多选一选项
  • 使用default设置选择默认值
  • 使用prompt设置选择提示

选项的变量类型只能是 booltristate,为了实现其他类型的选择,可以使用以下方式:

    choice ESP32S2_DEFAULT_CPU_FREQ_MHZ
        prompt "CPU frequency"
        default ESP32S2_DEFAULT_CPU_FREQ_160 if !IDF_ENV_FPGA
        default ESP32S2_DEFAULT_CPU_FREQ_FPGA if IDF_ENV_FPGA
        help
            CPU frequency to be set on application startup.

        config ESP32S2_DEFAULT_CPU_FREQ_FPGA
            depends on IDF_ENV_FPGA
            bool "FPGA"
        config ESP32S2_DEFAULT_CPU_FREQ_80
            bool "80 MHz"
        config ESP32S2_DEFAULT_CPU_FREQ_160
            bool "160 MHz"
        config ESP32S2_DEFAULT_CPU_FREQ_240
            bool "240 MHz"
    endchoice

    config ESP32S2_DEFAULT_CPU_FREQ_MHZ
        int
        default 40 if IDF_ENV_FPGA
        default 80 if ESP32S2_DEFAULT_CPU_FREQ_80
        default 160 if ESP32S2_DEFAULT_CPU_FREQ_160
        default 240 if ESP32S2_DEFAULT_CPU_FREQ_240

6. 选项依赖关系

  • A depends on B只有 B 选中,才能对 A 进行操作
  • A select B 只要 A 选中,就会同时选中 B
  • depends on为依赖关系,select为反向依赖
  • 也可以depends on !B,只有B不选中,才能对 A 进行操作

ESP32S2_TRAX反向依赖ESP32S2_MEMMAP_TRACEMEM,当ESP32S2_TRAX使能时,ESP32S2_MEMMAP_TRACEMEM也同时被使能。


    config ESP32S2_MEMMAP_TRACEMEM
        bool
        default "n"
        
    config ESP32S2_TRAX
        bool "Use TRAX tracing feature"
        default "n"
        select ESP32S2_MEMMAP_TRACEMEM
        help
            The ESP32S2 contains a feature which allows you to trace the execution path the processor
            has taken through the program. This is stored in a chunk of 32K (16K for single-processor)
            of memory that can't be used for general purposes anymore. Disable this if you do not know
            what this is.

7. 为菜单添加注释

menu "motors config"

    comment "config gpio for motors"

    ...

endmenu

8. 引用其他 Kconfig

  • 相当于包含文档,将其在添加位置处展开
source "path/to/kconfig" #绝对路径
rsource "path/to/kconfig" #相对路径

9. kconfig 配置项类型

tristatestring是配置项的基本类型,其他类型是对其进行的包装,包括:

  1. bool:n;y (0;1)
  2. tristate:n;m;y (0;1;2)(不编译;编译成模块;编译到内核)
  3. string:例如 “esp32”
  4. hex:例如 0x1000
  5. int:例如 115200

10. 使用 sdkconfig.defaults 设置默认值

sdkconfig.defaults格式与sdkconfig完全一致,最简单的生成默认文件的方法是,将sdkconfig重命名为sdkconfig.defaults,然后将不需要默认值的选项删除。

sdkconfig.defaults的优先级大于kconfig中的选项default,只有在sdkconfig.defaults中未定义的选项,才会使用kconfig中的选项default。详见:Using sdkconfig.defaults

11. 使用 sdkconfig.defaults.TARGET 设置默认值

添加完sdkconfig.defaults中的默认设置以后,编译系统会从sdkconfig.defaults.TARGET_NAME检索与硬件相关的默认配置,其中TARGET_NAME目前可以是esp32 esp32s2

详见:Target-dependent sdkconfig defaults

12. 使用 confgen.py 实现版本过渡

在 ESP-IDF 的迭代更新中,部分配置选项被丢弃或者被重命名,IDF 提供了自动检查工具confgen.py,可以对老版本的 kconfig实现自动检查和替换。详见:Backward Compatibility of Kconfig Options

参考文档

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写 Kconfig 文件需要按照一定的语法和规则进行。下面是 Kconfig 文件的编写方式的介绍: 1. 定义选项和菜单: Kconfig 文件以菜单(menu)和选项(config)的方式组织配置。菜单用来组织选项,而选项用来定义具体的配置参数。 一个基本的选项定义如下: ``` config OPTION_NAME type prompt "Option description" default DEFAULT_VALUE depends on DEPENDENCY_EXPRESSION help Additional help text ``` 其中,`OPTION_NAME` 是选项的标识符,`type` 是选项的类型(如 bool、tristate、string 等),`prompt` 是选项的描述信息,`default` 是选项的默认值,`depends on` 是选项的依赖条件,`help` 是选项的帮助文本。 2. 组织菜单: 菜单用来组织选项,形成层次化的菜单结构。一个基本的菜单定义如下: ``` menu "Menu description" ``` 菜单之间可以嵌套,形成多级菜单结构。可以使用 `endmenu` 来表示菜单的结束。 3. 条件表达式: Kconfig 支持使用条件表达式来控制选项的可见性和可配置性。条件表达式可以包含其他选项的状态或操作系统的特定功能。 例如,可以使用 `if`、`elseif` 和 `endif` 来定义条件块: ``` if CONDITION_EXPRESSION ... elseif CONDITION_EXPRESSION ... endif ``` 条件表达式可以使用选项的标识符、逻辑运算符(如 `&&`、`||`)和关系运算符(如 `==`、`!=`)构建。 4. 依赖关系: Kconfig 支持自动解析和处理依赖关系。可以使用 `depends on` 来定义选项之间的依赖关系。 例如,可以使用 `depends on OPTION_NAME` 来表示当前选项依赖于另一个选项的状态。 以上是 Kconfig 文件的基本编写方式。在实际编写 Kconfig 文件时,需要根据具体的需求和配置选项进行定义和组织,同时注意语法和规则的正确性。可以参考 Linux 内核源码中的 Kconfig 文件来了解更多编写方式的示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值