当前位置:网站首页>Kconfig Kbuild
Kconfig Kbuild
2022-07-06 09:17:00 【csdndulala】
代码工程中常常会见到一些名为Kconfig Kbuild的文件
这种文件的作用是:面向编译脚本,屏蔽硬件的差异。Kconfig 并不是一种特殊的脚本,而是一种解决问题的方法,他可以用任何方法实现:python、shell+makfefile(linux kernal、Busybox)。
引子
对于嵌入式或者OS而言,面对的是成百上千的硬件类型,举个例子。
假如有两个I2C硬件需要适配,常见的做法:方法1 (不建议滥用这种方法,1 新增单板时会修改同一文件,有误修改风险 2 不利于阅读)
一个.c中通过宏区分 然后编译脚本/编译宏来区分
#ifdef I2C_A_HARDWARE
void i2c_write()
#endif#ifdef I2C_B_HARDWARE
void i2c_write()
#endif方法2
通过文件区分 i2c_ahardware.c i2cb_hardware.c 最后也是通过编译脚本区分
对于第二种方法,当添加一种硬件后,构建的脚本需要修改:
if I2C_A_芯片
i2c_ahardware.c 参与构建
else if I2C_B_芯片
i2cbhardware.c 参与构建
else if I2C_X_芯片
i2cx_hardware.c 参与构建
…
else if 芯片xxx
…
…
…
endif
可以想象当有成百上千个芯片时,makefile会成为什么样子,更别说还有if else嵌套的场景、文件路径修改、文件名修改、代码整合,所引发的编译脚本的修改,实在。。。。
想一想
linux kernal如何一套代码适配了成千上万的板子
U-boot如何支持了上千种单板Kconfig的工作方式
Kconfig的工作步骤
1)读取当前目录下的.config文件(没有的话则按照Kconfig文件默认配置)
2)根据.config的内容,显示相应的界面
3)程序员通过界面选中本单板将要参与构建的组件
4)退出Kconfig界面,会保存两个文件:.config、autoconf.hKconfig文件:

Kconfig文件运行后界面:使用者来选择(*代表选择)
生成的.config文件(该文件既可以用来初始化Kconfig界面,也可以保存为不同硬件的配置文件。通过不同的配置文件来替代复杂的if else)
Kbuild文件:将选择的文件进行包含和排除

当选择I2C_A, 最终的obj-y = i2c_a_hardware.o 这个就是编译脚本的输入。autoconf.h (根据Kconfig的选择结果生成,可以作为方法1的宏定义文件)

Kconfig的python实现代码可以参考:
github 项目ulfalizer/Kconfiglib
该库的使用:
https://blog.csdn.net/u010018991/article/details/81867316总结
- Kconfig相当于将编译脚本的功能进行分层,屏蔽掉了各种单板、芯片的差异
- 原先的if else分支仍然"存在",只是被多个硬件单板分支的.config配置文件替代
- Kconfig也可应用于纯软件场景,可以支持纯软件的裁剪和定制
有两种方法在自己的工程中使用Kconfig
Linux Kernel使用了一堆脚本,在scripts目录下,属于GPL协议。
Kconfiglib是另一个选择,它使用Python脚本来实现Kconfig,这个库的License对商业软件更友好。
边栏推荐
- IOT system framework learning
- STM32型号与Contex m对应关系
- Matlab learning and actual combat notes
- 【ESP32学习-1】Arduino ESP32开发环境搭建
- Kaggle竞赛-Two Sigma Connect: Rental Listing Inquiries(XGBoost)
- [NPUCTF2020]ReadlezPHP
- [Flink] Flink learning
- Basic knowledge of lithium battery
- Pytorch-温度预测
- Cannot change version of project facet Dynamic Web Module to 2.3.
猜你喜欢

Implementation scheme of distributed transaction

Mall project -- day09 -- order module

I2C bus timing explanation

MySQL主从复制的原理以及实现

STM32 如何定位导致发生 hard fault 的代码段

Vert. x: A simple login access demo (simple use of router)

FTP文件上传文件实现,定时扫描文件夹上传指定格式文件文件到服务器,C语言实现FTP文件上传详解及代码案例实现
![Detailed explanation of Union [C language]](/img/d2/99f288b1705a3d072387cd2dde827c.jpg)
Detailed explanation of Union [C language]

Priority inversion and deadlock

机器学习--线性回归(sklearn)
随机推荐
Comparaison des solutions pour la plate - forme mobile Qualcomm & MTK & Kirin USB 3.0
程序员老鸟都会搞错的问题 C语言基础 指针和数组
Analysis of charging architecture of glory magic 3pro
[yarn] CDP cluster yarn configuration capacity scheduler batch allocation
列表的使用
[Flink] Flink learning
Keyword inline (inline function) usage analysis [C language]
[CDH] cdh5.16 configuring the setting of yarn task centralized allocation does not take effect
4. Install and deploy spark (spark on Yan mode)
Redis interview questions
嵌入式启动流程
Common regular expression collation
5G工作原理详解(解释&图解)
Linux Yum install MySQL
I2C bus timing explanation
Apprentissage automatique - - régression linéaire (sklearn)
Internet protocol details
E-commerce data analysis -- User Behavior Analysis
树莓派 轻触开关 按键使用
C语言,log打印文件名、函数名、行号、日期时间