代码工程中常常会见到一些名为Kconfig Kbuild的文件
这种文件的作用是:面向编译脚本,屏蔽硬件的差异。Kconfig 并不是一种特殊的脚本,而是一种解决问题的方法,他可以用任何方法实现:python、shell+makfefile(linux kernal、Busybox)。

  1. 引子

    对于嵌入式或者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_芯片
      i2c
      bhardware.c 参与构建
      else if I2C_X_芯片
      i2c
      x_hardware.c 参与构建

      else if 芯片xxx



      endif

    可以想象当有成百上千个芯片时,makefile会成为什么样子,更别说还有if else嵌套的场景、文件路径修改、文件名修改、代码整合,所引发的编译脚本的修改,实在。。。。

    想一想
    linux kernal如何一套代码适配了成千上万的板子
    U-boot如何支持了上千种单板

  2. Kconfig的工作方式

    Kconfig的工作步骤
    1)读取当前目录下的.config文件(没有的话则按照Kconfig文件默认配置)
    2)根据.config的内容,显示相应的界面
    3)程序员通过界面选中本单板将要参与构建的组件
    4)退出Kconfig界面,会保存两个文件:.config、autoconf.h

    Kconfig文件:

    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

  3. 总结

    • Kconfig相当于将编译脚本的功能进行分层,屏蔽掉了各种单板、芯片的差异
    • 原先的if else分支仍然"存在",只是被多个硬件单板分支的.config配置文件替代
    • Kconfig也可应用于纯软件场景,可以支持纯软件的裁剪和定制

    有两种方法在自己的工程中使用Kconfig
    Linux Kernel使用了一堆脚本,在scripts目录下,属于GPL协议。
    Kconfiglib是另一个选择,它使用Python脚本来实现Kconfig,这个库的License对商业软件更友好。

Kconfig Kbuild相关推荐

  1. sysadmin默认密码_Sysadmin工具,Kconfig / kbuild的秘密,11个KDE应用程序,tcpdump,Laverna,Python等

    sysadmin默认密码 今天,我们发布了LISA18演讲者系列的第一篇文章,Michael Hrivnak 介绍了Kubernetes中的Ansible运算符 . 请查看更多有关LISA18演讲者的 ...

  2. U-Boot 之四 构建过程(Kconfig 配置 + Kbuild 编译)详解

      在之前的博文 Linux 之八 完整嵌入式 Linux 环境介绍及搭建过程详解 中我们说了要一步步搭建整个嵌入式 Linux 运行环境,今天继续介绍 U-Boot 相关的内容.我所使用的硬件平台及 ...

  3. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构

    作者:蜗蜗 发布于:2014-2-21 13:23 分类:Linux内核分析 1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内 ...

  4. arch linux引导不启动_Linux 内核源代码的目录结构

    内核技术点合集 Linux 内核源代码包括三个主要部分: 1. 内核核心代码,包括第 3 章所描述的各个子系统和子模块,以及其它的支撑子系统,例 如电源管理.Linux 初始化等 2. 其它非核心代码 ...

  5. Linux内核的整体架构介绍

    1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...

  6. linux 哪个进程在使用串口_Linux内核的整体架构

    转载自蜗窝科技 Linux内核的整体架构​www.wowotech.net 作者:wowo发布于:2014-2-21 13:23 分类:Linux内核分析 0. 转载者说在前面的话 转载目的: 能够让 ...

  7. 深度:一文看懂Linux内核,Linux内核架构和工作原理详解

    简介 作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址.目前支持模块的动态装卸(裁剪).Linux内核就是基于这个策略实现的.Linux进程1.采用层次结构,每个 ...

  8. Visual Studio Code搭建linux驱动开发环境

    前言 Visual Studio Code是一个很优秀的开发软件,但我们并不能直接用来驱动开发.因为驱动开发所需要的头文件来自Linux内核,这就要求我们自己添加内核文件. 一.获取内核? 1.官网 ...

  9. linux内核源码分析笔记

    一.内核源码目录结构 1.Linux 内核源代码包括三个主要部分 1)内核核心代码:包括linux内核整体架构分析笔记描述的各子系统和子模块,以及其他支撑子系统,如:电源管理.linux初始化等. 2 ...

  10. Linux内核架构和工作原理详解

    作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址.目前支持模块的动态装卸(裁剪).Linux内核就是基于这个策略实现的.Linux进程1.采用层次结构,每个进程都 ...

最新文章

  1. 运维-nginx +php 错误状态码说明
  2. asp.net 访问 access出现 ole_connection.ServerVersion引发了System.InvalidOperationException的解决
  3. oracle测试表什么名字,Oracle_PLSQL测试题与答案(绝对经典)
  4. 汽车电子专业知识篇(六十三)-继电器的结构、工作原理、检测方法
  5. a8处理器相当于骁龙几_天玑700处理器怎么样 天玑700相当于骁龙多少_CPU_硬件教程...
  6. 谷歌公布4个0day详情,其中3个被滥用于攻击亚美尼亚
  7. iOS 推送通知详解
  8. WPF DataGrid使用 后台界面修改前台不刷新问题
  9. C# 网页自动填表自动登录 .
  10. MATLAB画图调整分辨率
  11. 服务器机房监控系统,服务器机房监控建设方案的介绍
  12. [转] PHP开发通用型标题图片功能
  13. 华硕 FX5O5GT 黑苹果efi引导文件
  14. OPENGL学习(四)GLUT三维图像绘制
  15. 思科vPC (Virtual Por Channel)
  16. 使用JAVA对象和JSON相互转换问题
  17. 百度API海王撩妹话术生成器模板
  18. hsqldb 使用简介
  19. 舵机的问与答及故障分析
  20. linux下spi flash驱动程序,SPI Flash(W25Q16DV) 驱动

热门文章

  1. 有哪些值得推荐的好的算法书?
  2. allegro17.4绘制PCB封装-R0603
  3. amap不同样式marker点_amap不同样式marker点_CAD制图软件中如何设置CAD打印样式表(CTB)?...
  4. HTML和jquery实现播放功能
  5. 健康管理平台设计与实现
  6. 开源:通用的日志分析工具(LogViewer)
  7. 天勤率辉考研数据结构2021
  8. github java 性能,JavaGuide/手把手教你定位常见Java性能问题.md at master · Github-Programer/JavaGuide · GitHub...
  9. Android webview缓存机制
  10. 初中计算机授课教案模板,初中课程教案模板