Kconfig [@rt-thread]

2024-08-22 11:58
文章标签 thread rt kconfig

本文主要是介绍Kconfig [@rt-thread],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果想要得到自己想要的定制效果, 很难找到现成的方法, 这个时候我们需要对项目进行定制化修改.

经过刚才的介绍, 我们知道了 rt-thread 官方提供了 kconfig 工具来帮助我们管理 宏定义, 那么这些宏定义是在怎么来的呢, 我们来看看.

# 定义一个, MODVERSIONS
config MODVERSIONS# bool: 表示类型, 一共有 bool(y/n), tristate(y/n/m), string, hex, int 五种类型.# "Set version information on all module symbols": 这个是显示的提示bool "Set version information on all module symbols"# 通过 default 默认值,  下面语句表示, 如果 BAR 被选中, 那么 默认值就为 y. default y if BAR# depends on: 表示依赖于, 如果依赖的选项没有被选中, 那么该配置不会显示# BAR && m: BAR 和 m 分别为两个依赖的选项, 多个依赖的选项可以进行简单的逻辑运算.depends on BAR && m# 通过 select 关联其他选项, 如果本选项为真, 那么就将 HAVE_GENERIC_IOMAP 也选中.select HAVE_GENERIC_IOMAP# 帮助文档helpUsually, modules have to be recompiled whenever you switch to a newkernel.  ...

其实

    bool "Set version information on all module symbols"

    boolprompt "Set version information on all module symbols"

是等价的.

prompt 格式的完整样式是 “prompt” <prompt> [“if” <expr>], 可以加入 <expr> 表达式 , 注意, 只能有一个prompt.

default定义默认值, 可以有0个或则多个, 样式为 “default” <expr> [“if” <expr>], 如果default多个同时条件满足,那么只有第一个满足条件的值有效.

select可以确定其他选项的情况, 样式为: “select” <symbol> [“if” <expr>], 这种选项的关联特别强, 配置选项被选中, 那么目标选项一定被选中.

官方提供了一个 imply 的属性. 样式为 “imply” <symbol> [“if” <expr>], 影响目标选项的默认值, 让目标选项的默认值不高于该选项的最大选项. 看下面例子.

config FOOtristate "foo"imply BAZconfig BAZtristate "baz"depends on BAR
FOOBARBAZ’s defaultchoice for BAZ
yyyY/m/n
ymnM/n
ynN
mymM/y/n
mmmM/n
nynN/m/y
nmnN/m

定义该选项是否进行显示, 我们可以使用visible if来完成. 样式为 “visible if” <expr>

定义数字类型的取值范围, 我们可以使用 range 完成, 样式为 “range” <symbol> <symbol> [“if” <expr>],

其他选项, 我们可以通过 option 来自定义, 样式为 “option” <symbol>[=<value>]

还有就是上面提到的表达式, 其实可以进行一些简单的逻辑运算:

<expr> ::= <symbol>                           (1)<symbol> '=' <symbol>                (2)<symbol> '!=' <symbol>               (3)<symbol1> '<' <symbol2>              (4)<symbol1> '>' <symbol2>              (4)<symbol1> '<=' <symbol2>             (4)<symbol1> '>=' <symbol2>             (4)'(' <expr> ')'                       (5)'!' <expr>                           (6)<expr> '&&' <expr>                   (7)<expr> '||' <expr>                   (8)
  1. 在表达式计算的时候, bool和tristate可以对应的转化为对应的值, 其他的类型转化为 ‘n’
  2. 如果两则相同, 那么就 返回 y. 否则 返回 n
  3. 如果两者不同, 那么就 返回 n. 否则 返回 y
  4. 如果 symbol1 比 symbol2 小, 大, 小于等于, 大于等于. 那么就返回 y. 否则返回 n
  5. 优先返回表达式的值
  6. 返回 2-expr 的值
  7. 返回两者之间的最小值
  8. 返回两者之间的最大值

如果将所有配置都放在一页上面, 就算是作者本人, 可能也不记得几百上千的配置顺序. 对配置进行分类管理, 无疑是非常好的决定.
kconfig 里面用菜单的方式进行分类, 这里有两种写法.

  1. 在 menu 和 endmenu 之间直接书写:

    menu "Network device support"depends on NETconfig NETDEVICES...endmenu
    
  2. 使用配置是否可见的方式来实现

    config MODULESbool "Enable loadable module support"# 如果 MODVERSIONS 依赖于 MODULES 的'选中', 那么只有'选中'了, MODVERSIONS才显示出来
    config MODVERSIONSbool "Set version information on all module symbols"depends on MODULES# 如果 MODVERSIONS 依赖于 MODULES 的'不选中', 那么只有'不选中'了, MODVERSIONS才显示出来
    comment "module support disabled"depends on !MODULES
    

下面系统的介绍下 kconfig 的模块:

  1. config

    "config" <symbol>
    <config options>
    
  2. menuconfig

    和 config 比较类似, 不过该选项是管理一个列表.

    "menuconfig" <symbol>
    <config options>
    
    (1):
    # 如果 M 被 配置, 那么 C1 和 C2 就会被显示, 否则不被显示.
    menuconfig M
    if Mconfig C1config C2
    endif(2):
    menuconfig M
    config C1depends on M
    config C2depends on M
    

    下面的 C0 不会依赖于 M的配置, 所以一直会被显示出来. C1, C2 会根据 M的配置做显示.

    (3):
    menuconfig Mconfig C0
    if Mconfig C1config C2
    endif(4):
    menuconfig M
    config C0
    config C1depends on M
    config C2depends on M
    
  3. choice/endchoice
    choice 只能是 bool 或者 tristate 类型

    "choice" [symbol]
    <choice options>
    <choice block>
    "endchoice"
    
  4. comment
    注释

    "comment" <prompt>
    <comment options>
    
  5. menu/endmenu
    菜单模块

    "menu" <prompt>
    <menu options>
    <menu block>
    "endmenu"
    
  6. if/endif
    条件模块

    "if" <expr>
    <if block>
    "endif"
    
  7. source
    应用其他文件内容

    "source" <prompt>
    
  8. mainmenu
    菜单头

    "mainmenu" <prompt>
    

参考

  • kconfig-language

这篇关于Kconfig [@rt-thread]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096209

相关文章

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

目标检测-RT-DETR

RT-DETR (Real-Time Detection Transformer) 是一种结合了 Transformer 和实时目标检测的创新模型架构。它旨在解决现有目标检测模型在速度和精度之间的权衡问题,通过引入高效的 Transformer 模块和优化的检测头,提升了模型的实时性和准确性。RT-DETR 可以直接用于端到端目标检测,省去了锚框设计,并且在推理阶段具有较高的速度。 RT-DET

GTK中创建线程函数g_thread_new和g_thread_create的区别

使用GThread函数,需要引用glib.h头文件。 这两个接口的核心区别就是  g_thread_create 是旧的接口,现在已经不使用了,而g_thread_new是新的接口,建议使用。 g_thread_create: g_thread_create has been deprecated since version 2.32 and should not be used in n

基于 rt-thread的I2C操作EEPROM(AT24C02)

一、AT24C02 The AT24C01A/02/04/08A/16A provides 1024/2048/4096/8192/16384 bits of serial electrically erasable and programmable read-only memory (EEPROM) organized as 128/256/512/1024/2048 words of 8 b

[项目][CMP][Thread Cache]详细讲解

目录 1.设计&结构2.申请内存3.释放内存4.框架 1.设计&结构 Thread Cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表 每个线程都会有一个Thread Cache对象,这样每个线程在这里获取对象和释放对象时是无锁的 TLS – Thread Local Strorage Linux gcc下TLSWindows vs下TLS

线程池工具类——Thread学习笔记

记录一下线程池工具类: /*** 线程池工具类* @author lixiang* @date 2018年10月10日 - 11:10* @history 2018年10月10日 - 11:10 lixiang create.*/public class ThreadPoolHelper {private static final Logger logger = LoggerFactory.g

模拟线程死锁——Thread学习笔记

记录一下之前写过的一段模拟死锁的代码: /*** 模拟死锁** @author lixiang* @date 2018年10月12日 - 9:51* @history 2018年10月12日 - 9:51 lixiang create.*/public class HoldLockDemo {private static Object[] lock = new Object[10];priv

C++11 Thread线程池、死锁、并发

一、线程与进程         进程:运行中的程序         线程:进程中的小进程 二、线程库的使用         包含头文件#include<thread> 2.1 thread函数         具体代码: void show(string str) {cout << "This is my word : " << str << endl;}int main() {t

Exception in thread main java.lang.NoClassDefFoundError: org/apache/juli/l

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/juli/l MyEclipse整合免安装版的Tomcat7,------> 看图吧 最后这个就可以在myeclipse里,使用你的tomcat,而不是用.bat打开!!!!