LV01-01-AliOSThings-09-源码与编译-02-kconfig基础
本文主要是源码与编译——kconfig基础知识的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows版本 | windows11 |
Ubuntu版本 | Ubuntu22.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | 阿里云 | 阿里云官网主页 |
阿里生活物联平台 | 生活物联网平台(飞燕平台)主页 | |
AliGenie | 天猫精灵开放平台AliGenie主页 | |
阿里物联网平台 | 阿里物联网平台主页 | |
Bluetooth 技术网站 | 蓝牙协议规范什么的可以来这里找 | |
Telink | Telink | Chips for a Smarter IoT (telink-semi.com) Telink中文官网 | |
开发手册 | AliOS Things开发指南 | AliOS Things开发指南,这里是最新版本,可以直接从官网找到 |
AliOS Things开发指南 | AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档 | |
AliOS Things开发指南(3.0) | AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档 | |
生活物联网平台开发文档 | 生活物联网平台(飞燕平台)开发文档 《设备端开发指南》 | |
Wi-Fi IoT品类定义与功能开发 | 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发 | |
硬件平台 | mk3080 WiFi开发板 | WiFi开发板使用指南-阿里云开发者社区 |
esp8266开发板 | 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com) | |
TLSR8258 Datasheet | Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258 | |
参考资料 | AliOS Things 3.0 应用开发指南 | 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考 |
IP知识百科 - 华为 (huawei.com) | IP的一些相关知识点 |
点击查看相关文件下载
分类 | 网址 | 说明 |
蓝牙规范相关文档 | Core Specification 5.2 | 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。 《Core_v5.2.pdf》 |
Mesh Model(v1.1) | 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。 本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。 《MshMDL_v1.1.pdf》 | |
Mesh Profile(v1.0.1) | 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。 《MshPRFv1.0.1.pdf》 | |
Mesh Device Properties | 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。 但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》 | |
GATT Specification Supplement | GATT Specification Supplement | Bluetooth® Technology Website。 好像可以在线看:《GATT Specification Supplement》 | |
Assigned Numbers | GATT的一些类型定义可以在这里找。 | |
AliOS Things | alios-things/AliOS-Things | Gitee上的AliOSThings SDK源码仓库 |
alibaba/AliOS-Things | GitHub上的AliOSThings SDK源码仓库 | |
天猫精灵蓝牙Mesh协议栈 | alibaba-archive/genie-bt-mesh-stack | GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。 之前是在alibaba/genie-bt-mesh-stack这个仓库。 写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a |
蓝牙Mesh设备开发指南 | 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容 |
这个其实在前面学习linux的时候就学习过,这里再简单介绍一下吧。
一、menuconfig
1. 打开图形配置界面
自AliOS Things 2.1开始,引入了基于Menuconfig的图形配置系统,组件配置文件(Config.in)是配置系统工作的基础。
1.1 SDK源码目录
我们在AliOS-Things源码目录敲aos make menuconfig
文件就可以打开图形配置界面啦:
1.2 工程目录
其实我们在工程目录下敲也可以打开一个图形配置界面,我们可以在 helloworld_mk3080 目录下打开图形配置文件看一下:
可以看到这里的配置选项会比源码目录中少很多。
2. 配置操作
2.1 预定义配置
其实前面我们知道,我们在图形配置界面进行配置的时候,其实他原本是有一个默认的配置文件的,这个配置就是预定义配置。预定义配置是由系统预设、或者用户创建的配置内容,可以在工程中复用并作为工程配置的起点。系统使用统一的SDK目录 AOS_SDK_PATH
下build/configs
目录存放预定义配置文件。用户可以加载已有配置,也可以将自定义配置保存至该目录,当我们自己创建配置文件的时候需要遵循以下规则:
默认的配置文件名以
_defconfig
结尾,例如profile-linkkit-mk3060_defconfig
。文件名里面不可以包含
@
,若是需要表达app@Board
这样的含义,可以使用其他字符代替,例如app-board_defconfig
。
2.2 加载预定义配置
1 | SDK源码目录下 ~/AliOS-Things-SDK |
我们现在来加载一个默认配置文件,我们先看一下图形配置界面中的BSP配置项:
接下来我们来加载一个profile-linkkitapp_esp8266_defconfig
配置文件,然后再来看一下:
1 | hk@vm:~/AliOS-Things-SDK$ aos make profile-linkkitapp_esp8266_defconfig |
然后我们再打打开配置界面看一下:
可以看到这里已经变成了ESP8266,他还有一些其他的配置项会改变,这里就不再细说了。
2.2 保存预定义配置
我们平时使用图形配置界面配置好后,我们可以将配置文件保存为默认配置文件到对应的目录,这样后边我们更换开发板或者修改配置文件后就很容易切换回原来的配置啦:
1 | 情形一:保存所有配置选项,包括未配置选项 |
显然可以看到.config文件配置项很多,而.defconfig文件配置项就很少,但是一般还是建议保存全部配置文件,毕竟更安全一些。
3. 图形界面修改配置
这里我们要看meunconfig图形界面配置后影响了哪些文件,所以这里我们可以先将源码目录进行git管理,注意可以使用下面的.gitignore文件:
点击查看 .gitignore文件
1 | trace_test |
3.1 修改保存配置项
这个很简单,这里就不写了。当我们修改保存后,会将这些配置文件写入一个.config文件:
这个.config配置文件的路径我们是可以自定义的,默认的话是在Alios-Things源码目录下。那个我们选择OK的时候,构建系统就会自动把.config文件配置信息同步到aos_config.h中。为什么有这么个文件?我们知道.config文件是给图形配置界面用的,我们在图形配置界面进行的配置最终肯定是要影响代码的,那怎么通过这些配置项来影响代码?我们打开这个.h文件一看就会看到这里面全是宏,这下我们很容易就明白了:
要注意的是这个头文件分为两个部分:用户自定义宏和组件的配置所对应的宏。初始情况下,用户自定义的宏区域不包含任何宏,由用户自行添加,这里我们添加自己的宏定义的话,不会被覆盖掉。组件配置对应的宏是和.config里面的配置一一对应的,两者是由编译系统自动实现同步。
3.2 影响了哪些文件?
那我们进行图形界面配置后,影响了哪些文件?我们修改一个配置项看一下,我们修改一下应用版本,我们修改为下面的版本(原来为app-1.0.0-20200214.140831
):
然后我们退出并保存配置项,然后敲一下git status
命令:
会看到由有上面3个文件被修改了,我们只需要关注.config和aos_config.h文件即可,那个带有.config.old的文件应该是个备份文件之类的吧,我们不需要关注,我么看一下都产生了哪些变化,我们敲一下git diff
命令:
可以看到这两个文件中都有版本号的配置发生了改变。
4. 相关配置文件
这一部分我们在自己创建的工程目录中操作,其实上面在SDK源码目录中的文件情况对工程目录也是一样的,另外还会有一些文件我们接下来一工程目录分析一下这些文件。我们用相同的方式看一下会有哪些文件发生变化(我这里直接创建工程,没有编译,直接提交所有文件到版本库,然后修改一个配置项就会有如下文件发生改变):
会发现修改的文件更多了,但是实际我们需要关注的只有下面几个:
- 配置参数文件
1 | 配置参数文件 |
.config 和 aos_config.h两个文件是同步的,不管更改任何一个,只要我们敲下aos命令,这两个文件都会同步更新,由于menuconfig菜单界面使用的是.config文件,所以menuconfig菜单界面也会同时改变,这三者无论修改哪一个,另外两个都会进行更新。注意,SDK源码目录和工程源码目录下都会有.config和aos_config.h文件,我们在工程源码中编译的话,就主要看工程源码的就可以,要是配置SDK源码的话,就关注SDK里面的文件就可以了。
- 配置后参与编译的文件
1 | 配置后参与编译的文件 |
这两个文件中的内容都是配置选项, auto.conf 是给Makefile文件用的,用于实际编译使用,autoconf.h是我们工程源码使用的,这两个文件是实际参与编译的文件,为什么这么麻烦?当然也可以是直接使用编译配置文件,但是AliOS-Things为了开发者的便利,才这样的来设计。
二、Kconfig语法
Kconfig是有语法的,它在SDK中有一个文档:
1 | AliOS-Things-SDK/build/kconfig/Linux64/kconfig-language.txt |
这个文档就是Kconfig文件的所有语法。
1. 菜单选项
大多数的选项都定义了一个配置选项,其它选项则有助于对它们进行组织。一个配置选项定义可以是下面的形式:
1 |
|
每行都是以config关键字开始,并可以接多个参数。”config” 为定义了一新的配置选项。下面的几行定义了该配置选项的属性。属性可以是该配置选项的类型、输入提示(input prompt)、依赖关系、帮助信息和默认值。配置选项可以用相同的名字定义多次,但每个定义只能有一个输入提示并且类型还不能冲突。
2. 菜单属性
1 | 菜单选项可以有多个属性。并不要求这些属性可以用在任何地方(见语法)。 |
3. 菜单依赖关系
1 | 依赖关系决定了菜单选项是否可见,也可以减少tristate的输入范围。tristate逻辑比boolean逻辑在表达式中用更多的状态(state)来表示模块的状态。依赖关系表达式的语法如下: |
4. 菜单结构
1 | 菜单在树中的位置可由两种方法决定。第一种可以是这样: |
5. kconfig关键字
1 | 配置文件描述了菜单选项,每行都是以一关键字开头(除了帮助信息)。下面的关键字: |
5.1 config
1 | "config" <symbol> |
5.2 menuconfig
1 | "menuconfig" <symbol> |
5.3 choices
1 | "choice" |
5.4 comment
1 | "comment" <prompt> |
在界面中如下所示:
5.5 menu
1 | "menu" <prompt> |
5.6 if
1 | "if" <expr> |
5.7 source
1 | source条目用于读取另一个Config.in文件,如: |