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

Creative Commons
本作品采用知识共享署名

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

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

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

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

添加应用Kconfig

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

1
2
3
4
5
6
7
8
9
10
app
├── CMakeLists.txt
├── boards
├── drivers
├── dts
├── Kconfig
├── prj.conf
├── scripts
├── src
└── west.yml

Kconfig最基本的内容如下

1
2
3
mainmenu "Zephyr Sample Kconfig"

source "Kconfig.zephyr"

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

示例

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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中配置

1
2
CONFIG_APP_NAME="Test App"
CONFIG_LOGGING_SAMPLE=n

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

在代码中使用配置项

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

1
2
3
4
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中以宏的形式出现

1
2
#define CONFIG_APP_NAME "Halfcoder Sample"
#define CONFIG_LOGGING_SAMPLE 1

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

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

在CMake中使用配置项

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

1
target_sources_ifdef(CONFIG_LOGGING_SAMPLE app PRIVATE  src/logging_sample.c)

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