ESP32-BOX的组件配置添加核心部分详细介绍

前言

(1)为了方便开发,ESP32提供了组件库方便用户进行二次开发。
github仓库;gitee仓库
(2)在学习本章之前最好有CMake或者Makefile的基础,如果没有也不要慌,有的话最好。
(3)CMake使用教程:CMake 保姆级教程(上);CMake 保姆级教程(下);

组件概念

什么是组件

(1)在学习本文之前,我们需要弄清楚一个概念,什么叫做组件。
(2)这个其实很好理解,说白了就是一个个模块。如果是从keil转过来学习ESP32的同学肯定就知道,如果我的MCU需要挂载一些外设模块或者是使用一些通讯协议,例如OLED,超声波,I2C,SPI等。通常我们都会建立一个文件夹,在这个文件夹里面写入与这个模块或协议相关的代码。如下图
(3)如果没有玩过其他系列单片机的同学也不要慌,你可以将组件理解为学习C语言的时候,我们会将一些重复的代码放在一个指定的c文件中,例如数据结构的链表,专门创建一个list.c文件存放链表相关代码。这个list.c就是一个组件。

在这里插入图片描述

(3)有了上面比较通俗的解释之后,相信大家对于组件已经有了一个粗浅的认知了。现在引用官方文档的话,组件为以下这几个部分:
<1>ESP-IDF 基础库,包括 libc、ROM bindings 等
<2>Wi-Fi 驱动
<3>TCP/IP 协议栈
<4>FreeRTOS 操作系统
<5>网页服务器
<6>湿度传感器的驱动
<7>负责将上述组件整合到一起的主程序

组件建立有什么好处呢?

(1)方便阅读源码,一个工程里面肯定会有很多代码,如果不建立模块,很容易让人看的云里雾里的。如果建立了模块,他人就很方便的知道这一大段内容是干什么的。
(2)方便移植,当你做一个项目的时候,肯定不可能将所有的代码从头到尾写一遍。重复造轮子是非常愚蠢,且毫无意义的事情。

ESP32如何添加组件?

添加组件路径

概念

(1)在你的工程目录下,有一个CMakeLists.txt,双击打开这个txt文件,里面一定会包含下面这三个元素。
<1>cmake_minimum_required():用于指定使用的 cmake 的最低版本。按照CMake的语法,这个应该是可以不写的,但是会出现报错。标准写法是需要在第一行加上这一段。
<2>include():包含了乐鑫的工程师们写了一个CMake文件,因为我们开发ESP32是需要使用到对应的依赖库的。所以,当我们在vscode中选择对应的芯片时候,这个CMake文件就会找到对应芯片的依赖库。这个不要动,必须得有!
<3>project():指定我们项目的名字,这个名字可以随便写。按照CMake语法,这个指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。

# 指定CMake最小版本
cmake_minimum_required(VERSION 3.5)
# 引入芯片相关的依赖库
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# 项目名字
project(demo)

(2)如果是官方GitHub中的Demo工程中CMakeLists.txt文件,可能会出现这一行代码。这一句作用就是用于在编译过程中启用彩色输出的编译选项,这种彩色输出通常用于提高编译过程的可读性,因为不同类型的消息可以以不同的颜色显示,使开发者更容易识别和理解编译器的输出。可以删除,不影响,但是建议加上。

# 编译时候设置彩色输出
add_compile_options(-fdiagnostics-color=always)

(3)上面介绍了这么多,其实和组件添加没有关系,但是还是简单提一下,方便各位理解。现在讲得这些才是真正和组件添加有关的信息。
<1>组件添加只需要在项目顶层目录的CMakeLists.txt文件中加入如下这一段话,即可指定组件的路径。
<2>对EXTRA_COMPONENT_DIRS设置第三方组件路径(我们自己添加的组件叫做第三方组件),编译器就会查找到这个第三方组件路径。当编译器找到这个路径,就会查找此路径下有没有CMakeLists.txt文件,如果有,说明这就是一个有效组件。
<3>但是如果编译器找到这个第三方组件路径,没有发现CMakeLists.txt文件怎么办呢?编译器就会开始寻找需要这个第三方组件路径下有没有子目录。如果有子目录,就看子目录有没有CMakeLists.txt文件,如果子目录有CMakeLists.txt文件,就说明这个第三方组件路径是一个组件集合。也是可行的。

set(EXTRA_COMPONENT_DIRS//要添加的组件路径)

实操1

(1)示例看完上面这一段描述,相信大家大概率还是懵逼的。没关系,我来举例介绍。如下为我的工程目录(因为文件太多了,我只拿除了一部分)
<1>大家看到这个目录,肯定是懵逼的,因为为什么我的文件顶层目录esp-box中怎么会没有CMakeLists.txt。这明显不符合语法啊。
<2>这个时候大家就要搞明白一个道理,工程路径不一定就是项目路径,我们所说的工程路径,其实是main文件夹所在的路径中。

- esp-box/- components/   - bsp/          - include/- src/- CMakeLists.txt- Kconfig.projbuild- light/        - include/- test/- CMakeLists.txt- light.c- applications/ - factory_demo/ - main/   - main.c- CMakeLists.txt- build/- CMakeLists.txt- image_viewer/ - main/   - main.c- CMakeLists.txt- build/- CMakeLists.txt- docs/- hardware/- README_cn.md

(5)现在已经知道了我的项目结构之后,我们在factory_demo这个工程里面开始解析。
<1>从上面的目录结构我们可以知道,组件文件夹是在工程目录的上上级目录中,所以我们需要设置EXTRA_COMPONENT_DIRS为"../../components"
<2>之后再加上我上面所说的一些元素,即可写出一个包含第三方组件的CMakeLists.txt文件。

# 指定CMake最小版本
cmake_minimum_required(VERSION 3.5)
# 引入芯片相关的依赖库
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# 配置组件路径
set(EXTRA_COMPONENT_DIRS../../components)
# 编译时候设置彩色输出
add_compile_options(-fdiagnostics-color=always)
# 项目名字
project(factory_demo)

实操2

(1)前面说了,设置的EXTRA_COMPONENT_DIRS路径中有CMakeLists.txt文件,那么这个路径才是有效的组件路径。否则就会寻找EXTRA_COMPONENT_DIRS路径中的子目录寻找CMakeLists.txt文件,如果有子目录有CMakeLists.txt文件,这个子目录就是一个有效组件。所以说,当components文件夹中有bsplight两个组件的时候,我们指定的是一个没有CMakeLists.txt文件,那么就会自动帮我们寻找到EXTRA_COMPONENT_DIRS路径下的bsplight这两个组件。
(2)那么,我们假设EXTRA_COMPONENT_DIRS路径下有一个CMakeLists.txt文件会怎么样?
注意:个人不建议跟着我做实操2的实验,因为这个实验会出现一个奇怪的bug —— Configuring incomplete, errors occurred!。 这个bug有时候有,有时候又消失了。如果硬要跟着我做,建议先把工程备份一次,目前本人还没有找到解决办法
(3)我们于是可以在EXTRA_COMPONENT_DIRS路径下创建一个CMakeLists.txt,编译会发现,无法找到组件,这是为什么呢?原因很简单,前面说了EXTRA_COMPONENT_DIRS路径中如果没有CMakeLists.txt就不是一个有效的组件目录,那么他就会去子目录寻找组件。如果EXTRA_COMPONENT_DIRS路径中如果有CMakeLists.txt那么他就会被认为是一个有效的组件目录。因为子目录的组件就无法被搜索到了。

实操3

(1)直接在指定具体的组件目录。注意,这里如果指定具体的组件目录之后,我这个工程中有两个组件,那么两个组件的路径都需要写出来。
(2)因此,我们可以看出,实操1的编写方法最合适。

# 指定CMake最小版本
cmake_minimum_required(VERSION 3.5)
# 引入芯片相关的依赖库
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# 配置组件路径
set(EXTRA_COMPONENT_DIRS../../components/bsp../../components/light)
# 编译时候设置彩色输出
add_compile_options(-fdiagnostics-color=always)
# 项目名字
project(factory_demo)

设置组件CMakeLists.txt

(1)指定好了组件路径之后,我们在组件路径中需要创建一个CMakeLists.txt文件,里面必须包含如下两个内容。
<1>SRCS : 后面包含了当前组件所用到的所有的源文件(*.c*.cpp*.cc*.S),里面所有的源文件都将会编译进组件库中。
<2>INCLUDE_DIRS : 这个就是指定组件的头文件路径,因为我们的头文件是放在了include文件夹中,所以后面是加"./include",如果头文件就是在当前目录中,那么就是"."

- esp-box/- components/   - bsp/     - include/- src/- CMakeLists.txt- Kconfig.projbuild- light/   - include/         - iot_light.h- test/- CMakeLists.txt- light.c

idf_component_register(SRCS "light.c"INCLUDE_DIRS "./include")

其他非必要部分介绍

组件部分

(1)REQUIRES指定组件之间的依赖关系。例如OLED组件依赖I2C或者SPI组件,那么我们就可以使用REQUIRES指定他们的依赖关系。

Kconfig

(1)我们介绍的组件添加部分只讲述了CMake文件的配置,其实还需要添加Kconfig配置,这样添加的组件就会出现在menuconfig中。这样后续如果我们需要对组件进行一些调整会很方便。
(2)例如,我们现在有一个LED程序,他一开始是高电平有效,那么我们就在menuconfig中配置LED是高电平有效。因为某些原因,LED程序变成低电平有效了,那么我们也可以直接在menuconfig中配置低电平有效,这样就不需要改动代码,非常方便移植和使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

def和class的区别

fed浅谈Python内 def 与 class 的区别--知识点整理&#xff08;B站 - BV11g411w73x&#xff09;_pythonclass和def的区别_奋进的小咸鱼的博客-CSDN博客def 是用于函数的封装代码如下&#xff1a;def jianfa(a,b): print(a-b) jianfa(100,9)输出结果&#xff1a;91class可用于多…

驱动开发,udev机制创建设备节点的过程分析

1.创建设备文件的机制种类 mknod命令&#xff1a;手动创建设备节点的命令 devfs:可以用于创建设备节点&#xff0c;创建设备节点的逻辑在内核空间&#xff08;内核2.4版本之前使用&#xff09; udev:自动创建设备节点的机制&#xff0c;创建设备节点的逻辑在用户空间&#xf…

虚拟机Ubuntu操作系统常用终端命令(1)(详细解释+详细演示)

虚拟机Ubuntu操作系统常用终端命令 本篇讲述了Ubuntu操作系统常用的三个功能&#xff0c;即归档&#xff0c;软链接和用户管理方面的相关知识。希望能够得到大家的支持。 文章目录 虚拟机Ubuntu操作系统常用终端命令二、使用步骤1.归档1.1创建档案包1.2还原档案包1.3归档并压缩…

【Flowable】FlowableUI使用以及在IDEA使用flowable插件(二)

前言 之前有需要使用到Flowable&#xff0c;鉴于网上的资料不是很多也不是很全也是捣鼓了半天&#xff0c;因此争取能在这里简单分享一下经验&#xff0c;帮助有需要的朋友&#xff0c;也非常欢迎大家指出不足的地方。 一、部署FlowableUI 1.准备war包 在这里提供了&#xf…

026-从零搭建微服务-文件服务(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

关于运行PR提示vcruntime140.dll无法继续执行代码的4个解决方法分享

关于运行安 PR提示vcruntime140.dll无法继续执行代码的困扰&#xff0c;小编将为您提供详细的解决方法。在此之前&#xff0c;我们需要了解一下vcruntime140.dll文件的作用。 vcruntime140.dll 是 Visual C Redistributable 的动态链接库文件&#xff0c;它包含了 C运行时库的一…

GeoSOS-FLUS未来土地利用变化情景模拟模型

软件简介 适用场景 GeoSOS-FLUS软件能较好的应用于土地利用变化模拟与未来土地利用情景 的预测和分析中&#xff0c;是进行地理空间模拟、参与空间优化、辅助决策制定的有效工 具。FLUS 模型可直接用于&#xff1a; 城市发展模拟及城市增长边界划定&#xff1b;城市内 部高分…

Zabbix监控组件及流程

Zabbix 由5大组件构成 Zabbix Web、Zabbix Server、Zabbix Proxy、Zabbix Database、Zabbix Agent Zabbix监控系统具体监控系统流程如图&#xff1a; Zabbix Web Zabbix Web是基于PHP语言编写的WEB UI界面&#xff0c;展示Zabbix整个监控平台监控数据、配置信息、方便对整个…

SQL Server 2012下载和安装配置详细教程手册

SQL Server 2012 下载和安装详细教程 目录 SQL Server 2012 下载和安装详细教程1、软件下载2、软件安装3、软件验证 1、软件下载 &#xff08;1&#xff09;官网地址 https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads &#xff08;可能不太行&#xff09; &a…

家庭安全不容小觑!青犀AI智能分析算法+摄像头助力家庭安全

你知道吗&#xff1f;高层家庭更需要人工摄像头&#xff01;虽然现在社会治安十分稳定&#xff0c;高层建筑更是安全&#xff0c;但高层盗窃、陌生人入室这些新闻还是层出不穷&#xff0c;为了解决这些安全隐患&#xff0c;给广大人民一个安心的生活环境&#xff0c;旭帆科技将…

Android MeidiaCodec之OMXPluginBase与QComOMXPlugin实现本质(四十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

机器学习技术(十)——决策树算法实操,基于运营商过往数据对用户离网情况进行预测

机器学习技术&#xff08;十&#xff09;——决策树算法实操 文章目录 机器学习技术&#xff08;十&#xff09;——决策树算法实操一、引言二、数据集介绍三、导入相关依赖库四、读取并查看数据1、读取数据2、查看数据 五、数据预处理1、选择数据2、数据转码 六、建模与参数优…

OPC是通讯协议吗安全性

目录 1 安全防护 1.1 防火墙 1.2 网闸 2 OPC是通讯协议吗 2.1 什么通讯协议 2.2 那么OPC又是什么&#xff1f; OPC官方说明文档 1 安全防护 本文阐述了控制网络以OPC接口接入信息网络应当采用的安全防护。 1.1 防火墙 防火墙是大家熟知的网络安全产品,并被用作控制网…

Jmeter —— 常用的几种断言方法(基本用法)

在使用JMeter进行性能测试或者接口自动化测试工作中&#xff0c;经常会用到的一个功能&#xff0c;就是断言&#xff0c;断言相当于检查点&#xff0c;它是用来判断系统返回的响应结果是否正确&#xff0c;以此帮我们判断测试是否通过&#xff0c;本文 主要介绍几种常用的断言&…

【服务器 | 测试】如何在centos 7上面安装jmeter

安装之前需要几个环境&#xff0c;以下是列出的几个环境 CentOS 7.7 64位JDK 1.8JMeter 5.2 1. 下载jmeter安装包 JMeter是开源的工具&#xff0c;安装 JMeter 要先安装好 JDK 的环境&#xff0c;安装JDK在前面的文章已经讲到 JMeter最新版下载地址&#xff1a;Apache JMeter…

Windows本地mysql 的安装教程(一步一步进行安装)

目录 1 下载安装包2 安装 1 下载安装包 下载网址&#xff1a; https://dev.mysql.com/downloads/ 选择这个 2 安装 编写MySQL配置文件 在解压目录下新建my.ini文件 将下面文本拷贝进my,ini文件中 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 ----------…

Xline 源码解读(三) —— CURP Server 的实现

在上一篇文章Xline 源码解读&#xff08;一&#xff09; —— 初识 CURP 协议当中&#xff0c;我们对 CURP Protocol 进行了一个初步的介绍。接下来&#xff0c;就让我们话接上回&#xff0c;来一起看看 CURP Server 的内部实现吧。 01、Curp Crate 的源码组织 现在&#xff…

RCNA 锐捷培训

第一章 网络基础入门 1.1 OSI参考模型及TCP/IP协议栈 数据是如何传输的&#xff1f; 数据在计算机网络中传输通常依赖于TCP/IP协议模型。 什么是网络&#xff1f; 网络是一种连接多个计算机、设备或系统的通信基础设施&#xff0c;其目的是实现资源共享、信息传递、接收和共享…

Python技巧---tqdm库的使用

文章目录 一、tqdm基本知识二、在pytorch中使用tqdm 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、tqdm基本知识 “tqdm” 是一个 Python 库&#xff0c;用于在命令行界面中创建进度条。 基本使用如下&#xff1a; from tqdm import tqdm impor…

创建UI账号密码登录界面

头文件 #ifndef MYWND_H #define MYWND_H#include <QPushButton> #include <QMainWindow>class MyWnd : public QMainWindow {Q_OBJECTpublic:MyWnd(QWidget *parent nullptr);~MyWnd(); }; #endif // MYWND_H 源文件 #include "mywnd.h" #include &…