diff --git a/development-tools/kconfig/kconfig.md b/development-tools/kconfig/kconfig.md index ba8e43d0c3ed1b55e4a945430ce86726b731ae10..e3443f9a8409dc79c15b7b4759e2e9474e62b755 100644 --- a/development-tools/kconfig/kconfig.md +++ b/development-tools/kconfig/kconfig.md @@ -2,7 +2,31 @@ ## Kconfig 简介 -RT-Thread 借助 Kconfig 文件生成的配置文件 rtconfig.h 来配置系统,Kconfig 文件是各种配置界面的源文件。当在 bsp 目录下使用 env 工具执行 menuconfig 命令时会出现 RT-Thread 系统的配置界面,所有配置工具都是通过读取当前 bsp 目录下的 Kconfig 文件来生成配置界面的,这个文件就是所有配置的总入口,它会包含其他目录的 Kconfig 文件。配置工具读取各个 Kconfig 文件,生成配置界面供开发人员配置系统,最终生成 RT-Thread 系统的配置文件 rtconfig.h。 +C语言项目的裁剪配置本质上通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig文件更方便的实现了这一功能。Kconfig 文件是各种配置界面的源文件。当在 bsp 目录下使用 env 工具执行 menuconfig 命令时会出现 RT-Thread 系统的配置界面,所有配置工具都是通过读取当前 bsp 目录下的 Kconfig 文件来生成配置界面的,这个文件就是所有配置的总入口,它会包含其他目录的 Kconfig 文件。配置工具读取各个 Kconfig 文件,生成配置界面供开发人员配置系统,最终生成 RT-Thread 系统的配置文件 rtconfig.h。 + +```mermaid +flowchart LR + menuconifg(menuconifg)-- 遍历解析各级Kconfig文件\n并保存配置-->.config[(.config)] + .config[(.config)]<-->rtconfig.h(rtconfig.h) +``` + +menuconfig 命令提供 RT-Thread 系统的配置界面,.config 文件会保存当前工程的Kconfig配置信息,最终会转换成rtconfig.h,.config和rtconfig.h可以互相转换。 + +```ini +# .config片段 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 +CONFIG_RT_DEBUG=y +``` + +```C +// rtconfig.h片段 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 +#define RT_DEBUG +``` ## Kconfig 基本语法 @@ -30,19 +54,20 @@ config BSP_USING_GPIO ![help](figures/help.png) 语句分析: + - config 表示一个配置选项的开始,紧跟着的 BSP_USING_GPIO 是配置选项的名称,config 下面几行定义了该配置选项的属性。属性可以是该配置选项的 - - 类型 - - 输入提示 - - 依赖关系 - - 默认值 - - 帮助信息 + - 类型 + - 输入提示 + - 依赖关系 + - 默认值 + - 帮助信息 - bool 表示配置选项的类型,每个 config 菜单项都要有类型定义,变量有5种类型 - - bool 布尔类型 - - tristate 三态类型 - - string 字符串 - - hex 十六进制 - - int 整型 + - bool 布尔类型 + - tristate 三态类型 + - string 字符串 + - hex 十六进制 + - int 整型 - select 是反向依赖关系的意思,即当前配置选项被选中,则 RT_USING_PIN 就会被选中。 - default 表示配置选项的默认值,bool 类型的默认值可以是 y/n。 - help 帮助信息。 @@ -59,6 +84,7 @@ config BSP_USING_GPIO #### bool 类型 布尔类型变量的取值范围是 y/n ,其使用示例如下 + ```c config BSP_USING_WDT bool "Enable Watchdog Timer" @@ -66,7 +92,6 @@ config BSP_USING_WDT default n ``` - 上述语句对应的配置界面如下所示 ![bool](figures/bool.png) @@ -119,17 +144,14 @@ config BSP_I2C1_SCL_PIN #define BSP_I2C1_SCL_PIN 116 ``` - #### hex 类型 十六进制类型变量的取值范围是一个十六进制的数,其使用方法和整型变量用法一致,整型变量生成的是十进制的数,而十六进制生成的是十六进制的数。 - #### tristate 类型 三态类型变量的取值范围是 y、n 和 m。tristate 代表在内核中有三种状态,一种是不选中,一种是选中直接编译进内核,还有一种是 m 手动添加驱动,而布尔类型变量只有两种状态,即选中和不选中。其使用方法和布尔类型变量类似。 - ### menu/endmenu 语句 menu 语句用于生成菜单。 @@ -150,6 +172,7 @@ menu "Hardware Drivers Config" endmenu ``` + menu 之后的字符串是菜单名。menu 和 endmenu 间有很多 config 语句,以上代码对应的配置界面如下所示 ![menu1](figures/menu1.png) @@ -158,7 +181,6 @@ menu 之后的字符串是菜单名。menu 和 endmenu 间有很多 config 语 ![menu](figures/menu.png) - 通过 env 选中以上配置界面的所有选项后,最终可在 rtconfig.h 文件中生成如下五个宏 ```c @@ -194,16 +216,15 @@ endmenu 当上一级菜单选中 "Enable CAN" 时 - ![if11](figures/if11.png) ![if2](figures/if2.png) - ### menuconfig 语句 menuconfig 语句表示带菜单的配置项 以下为 RT-Thread 系统 menuconfig 语句的示例 + ```c menu "Hardware Drivers Config" menuconfig BSP_USING_UART @@ -232,6 +253,7 @@ endmenu ![menuconfig2](figures/menuconfig2.png) 语句分析: + - menuconfig 这个语句和 config 语句很相似,但它在 config 的基础上要求所有的子选项作为独立的行显示。 - depends on 表示依赖某个配置选项,`depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA` 表示只有当 BSP_USING_UART1 和 RT_SERIAL_USING_DMA 配置选项同时被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项 @@ -250,6 +272,7 @@ endmenu choice 语句将多个类似的配置选项组合在一起,供用户选择一组配置项 RT-Thread Kconfig 文件中 choice 代码示例如下 + ```c menu "Hardware Drivers Config" menuconfig BSP_USING_ONCHIP_RTC @@ -271,13 +294,16 @@ menu "Hardware Drivers Config" endif endmenu ``` + 以上代码对应的配置界面为 ![choice](figures/choice.png) 语句解析: + - choice/endchoice 给出选择项,中间可以定义多个配置项供选择,但是在配置界面只能选择一个配置项; - prompt 给出提示信息,光标选中后回车进入就可以看到多个 config 条目定义的配置选项,所以下面的两个例子是等价的: + ``` Kconfig bool "Networking support" ``` @@ -287,12 +313,12 @@ endmenu prompt "Networking support" ``` - ### comment 语句 comment 语句出现在界面的第一行,用于定义一些提示信息。 comment 代码示例如下 + ```c menu "Hardware Drivers Config" comment "uart2 pin conflict with Ethernet and PWM" @@ -333,6 +359,7 @@ config BSP_USING_GPIO ``` 将上述语句中的 `bool` 后面的注释去掉。 + ```c config BSP_USING_GPIO bool