Zephyr应用的代码结构--增加应用配置项

本文说明如何为Zephyr应用增加Kconfig配置项。

本文是是«Zephyr应用的代码结构»系列的增补篇和下面三篇文章一起让你能更灵活的控制自己的zephyr应用代码。

Zephyr应用的代码结构–West提货单 Zephyr应用的代码结构–自定义开发板 Zephyr应用的代码结构–自定义驱动

Zephyr内有大量的Kconfig配置项用于配置裁剪Zephyr功能和使用的资源。当写的Zephyr应用较大时,会有需求对应用进行配置,我们同样可以通过Kconfig添加对应用的配置项。

添加应用Kconfig 链接到标题

在app下增加Kconfig文件,拓扑结构如下

app
├── CMakeLists.txt
├── boards
├── drivers
├── dts
├── Kconfig
├── prj.conf
├── scripts
├── src
└── west.yml

Kconfig最基本的内容如下

mainmenu "Zephyr Sample Kconfig"

source "Kconfig.zephyr"

对于Zephyr构建系统来说,其Kconfig的根为zephyr/,上面表示从导入zephyr最顶层的Kconfig也就是zephyr/Kconfig.zephyr 之后就可以在这个Kconfig按照kconfig语法添加你需要配置项了

示例 链接到标题

例如下面示例就是要添加一个App的配置菜单,配置菜单内含有对App中logging系统的配置

mainmenu "Zephyr Sample Kconfig"

# 添加应用配置菜单,名为"Application Configuration"
menu "Application Configuration"
    # 增加一个配置项,配置APP的名称
    config APP_NAME
        string "Application project name"
        default "Halfcoder Sample"
        help
        Set Your Application Name

    # 增加一个配置项,配置是否启用logging的示例代码
    # 默认选中该配置项,选择该配置项时也将选择Zephyr本身的CONFIG_LOG
    config LOGGING_SAMPLE
        bool "Enable logging sample code"
        select LOG
        default y

    # 如果启用了logging的示例代码,则导入对logging示例代码的LOG等级配置Kconfig
    if LOGGING_SAMPLE
        rsource "src/Kconfig.logging"
    endif
endmenu

source "Kconfig.zephyr"

通过west build -t menuconfig可以看到效果 打开Application Configuration后的效果 可以在menuconfig中配置,也可以直接在我们的app/prj.conf中配置

CONFIG_APP_NAME="Test App"
CONFIG_LOGGING_SAMPLE=n

上面我们增加了两个Kconfig配置项APP_NAMELOGGING_SAMPLE,接下来看如何使用这两个配置项

在代码中使用配置项 链接到标题

在代码中和prj.conf中一样要加上CONFIG_前缀进行引用,例如main.c的代码如下

void main(void)
{
	printk("Zephyr First App zpro name %s\n", CONFIG_APP_NAME);
}

就可以看见打印出

Zephyr First App zpro name Test App

说明:Kconfig的选项最后会被生成在build/zephyr/include/generated/autoconf.h中以宏的形式出现

#define CONFIG_APP_NAME "Halfcoder Sample"
#define CONFIG_LOGGING_SAMPLE 1

当文件编译时会用编译选项将autoconf.h引入,达到在代码中引用的目的

-imacros /mnt/g/Sample/build/zephyr/include/generated/autoconf.h

在CMake中使用配置项 链接到标题

另外我们可以在CMake中通过配置项对编译进行控制,在Zephyr应用的CMakeLists.txt中:

target_sources_ifdef(CONFIG_LOGGING_SAMPLE app PRIVATE  src/logging_sample.c)

通过CONFIG_LOGGING_SAMPLE来选择是否将src/logging_sample.c加入到app的编译中