RT-Thread中KConfig
RT-Thread的构建与配置系统
- Kconfig:kernel config配置文件(提供系统的配置裁剪功能)
- SCons:构建工具
- env工具:主要提供构建系统所需的各种环境变量以及软件包的管理。
Kconfig在RT-Thread中的工作机制
C语言项目的裁剪配置本质上是通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig这套机制更方便地实现了这一功能。
当前以Windows下Env工具中的使用为例,简述Kconfig在RT-Thread的工作机制。
Kconfig机制包括Kconfig文件和配置UI界面(如menuconfig,pyconfig等)。Kconfig机制有如下特点:
- Kconfig文件中的配置项会映射至rtconfig.h中。
- Kconfig文件可以随源码分散至各级子目录,便于灵活修改。
.config片段
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
CONFIG_RT_TIMER_THREAD_STACK_SIZE=512
CONFIG_RT_DEBUG=y
//相对应的rtconfig.h片段
#define RT_UISNG_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 512
#define RT_DEBUG
Kconfig文件在源码中呈现树形结构,需要在工程根目录下存放一份顶层Kconfig文件,顶层Kconfig文件在文件中通过source语句显示调用各子目录下的Kconfig文件。
Env在根目录下执行menuconfig命令后会递归解析各级Kconfig文件,然后提供如下配置界面,完成相应的配置后并保存,根目录下存放一份.config文件保存当前的配置项,并将.config文件转为RT-Thread的配置系统文件rtconfig.h。
Kconfig语法及示例
Kconfig源于Linux内核的配置构建系统,当前只介绍RT-Thread中的常用语法。
注释
Kconfig采用#作为注释标记符,例如:
# This is a comment
config语句
config定义了一组新的配置选项
以下为RT-Thread系统中config语句的示例
config BSP_USING_GPIO
bool "Enable GPIO"
select RT_USING_PIN
default y
help
config gpio
config表示一个配置选项的开始,紧跟着的BSP_USING_GPIO是配置选项的名称,config下面几行定义了该配置选项的属性。
bool表示配置选项的类型,每个config菜单项都要有类型定义,变量有5种类型:
- bool布尔类型
- tristate三态类型
- string字符串
- hex十六进制
- int整型
select是反向依赖关系的意思,即当前配置选项被选中,则RT_USING_PIN就会被选中。
default表示配置选项的默认值,bool类型的默认值可以是y/n。
help帮助信息。
通过env选中以上配置界面的选项后,最终可在rtconfig.h文件中生成如下两个宏:
#define RT_USING_PIN
#define BSP_USING_GPIO
menu/endmenu语句
menu语句用于生成菜单
menu "Hardware Drivers Config"
config BSP_USING_COM2
bool "Enable COM2(uart2 pin conflict with Ethernet and PWM)"
select BSP_USING_UART
select BSP_USING_UART2
default n
config BSP_USING_COM3
bool "Enable COM3(uart3 pin confilict with Ethernet)"
select BSP_USING_UART3
default n
endmenu
menu之后的字符串是菜单名。
menu和endmenu间有很多config语句,以上代码对应的配置界面如下所示:
if/endif语句
menu "Hardware Drivers Config"
menuconfig BSP_USING_CAN
bool "Enable CAN"
default n
select RT_USING_CAN
if BSP_USING_CAN
config BSP_USING_CAN1
bool "Enable CAN1"
default n
endif
endmenu
当没有选中“Enable CAN”选项时,通过if判断的Enable CAN1选项并不会显示出来,如图所示:
menuconfig语句
带菜单的配置项
menu "Hardware Drivers Config"
menuconfig BSP_USING_UART
bool "Enable UART"
default y
select RT_USING_SERIAL
if BSP_USING_UART
config BSP_USING_UART1
bool "Enable UART1"
default y
config BSP_UART1_RX_USING_DMA
bool "Enable UART1 RX DMA"
depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
default n
endif
endmenu
menuconfig这个语句和config语句很相似,但它在config的基础上要求所有的子选项作为独立的行显示。
depens on表示依赖某个配置选项,depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA表示只有当两个配置选项同时被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项。
choice/endchoice语句
choice语句将多个类似的配置选项组合在一起,供用户选择一组配置项。
menu "Hardware Drivers Config"
menuconfig BSP_USING_ONCHIP_RTC
bool "Enable RTC"
select RT_USING_RTC
select RT_USING_LIBC
default n
if BSP_USING_ONCHIP_RTC
choice
promt "Select Clock Source"
default BSP_RTC_USING_LSE
config BSP_RTC_USING_LSE
bool "RTC USING LSE"
config BSP_RTC_USING_LSI
bool "RTC USING LSI"
endchoice
endif
endmenu
choice/endchoice给出选择项,中间可以定义多个配置项供选择,但是在配置界面只能选择一个配置项。
promt给出提示信息,光标选中后回车进入就可以看到多个config条目定义的配置选项,所以下面的两个例子是等价的。
comment语句
comment语句出现在界面的第一行,用于定义一项提示信息。
comment代码示例如下:
menu "Hardware Drivers Config"
comment "uart2 pin conflict with Ethernet and PWM"
config BSP_USING_COM2
bool "Enbale COM2"
select BSP_USING_UART
select BSP_USING_UART2
default n
endmenu
source语句
source语句用于读取另一个文件中的Kconfig文件,如
source "../libraris/HAL_Drivers/Kconfig"
原文地址:https://blog.csdn.net/Caramel_biscuit/article/details/143672121
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!