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

news2024/9/23 1:29:21

前言

(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.coloradmin.cn/o/1013279.html

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

相关文章

1-FPGA硬件加速-YUV_YCbCr

这是对《基于Matlab与FPGA的图像处理教程》的学习笔记&#xff0c;代码和内容摘取自书中。 心得&#xff1a; 使用FPGA进行硬件加速的重点是消除或者减少浮点数运算&#xff0c;转换为定点运算&#xff0c;然后通过pipeline流水设计转为并行实现加速。 原理和方法 RGB与&…

微信小程序——常用组件的属性介绍

常用的组件内容标签 text 文本组件类似于HTML中的span标签&#xff0c;是一个行内元素rich-text 富文本标签支持把HTML字符串渲染为WXML结构 text标签的基本使用 通过text组件的selectable属性&#xff0c;实现长按选中文本内容的效果。只有text标签支持长按选中效果&#x…

爬虫代理在数据采集中的应用详解

随着互联网技术的不断发展&#xff0c;数据采集已经成为了各个行业中必不可少的一项工作。在数据采集的过程中&#xff0c;爬虫代理的应用越来越受到了重视。本文将详细介绍爬虫代理在数据采集中的应用。 什么是爬虫代理&#xff1f; 爬虫代理是指利用代理服务器来隐藏真实的IP…

string的使用和模拟实现

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

Pytest系列-使用自定义标记mark(6)

简介 pytest 可以支持自定义标记&#xff0c;自定义标记可以把一个 web 项目划分为多个模块&#xff0c;然后指定模块名称执行 Pytest 里面自定义标记 用法&#xff1a;将pytest.mark.标记名称 放到测试函数或者类上面 使用&#xff1a; 执行时加上 -m 标记名 进行用例筛选…

[交互]交互的实战问题1

[交互]交互的实战问题1 状态码 431 Request Header Fields Too LargeReferrer Policy: no-referrer-when-downgrade路径参数高并发问题使用场景使用的方法异常情况 状态码 431 Request Header Fields Too Large 最近做项目&#xff0c;遇到一个问题&#xff0c;后台导出表格时…

牛客: BM4 合并两个排序的链表

牛客: BM4 合并两个排序的链表 文章目录 牛客: BM4 合并两个排序的链表题目描述题解思路题解代码 题目描述 题解思路 以链表一为主链表,遍历两条链表 若当前链表二的节点val小于当前链表一的下一个节点val,则将链表链表二的该节点连到链表一的节点的下一个,链表一的当前节点往…

sql存储引擎

-- 查询建表语句 --可以查看引擎 show create table account; -- 可以看到默认引擎 InnoDB ENGINEInnoDB -- 查看当前数据库支持得存储引擎 show engines ; # InnoDB 默认 存储引擎 # MyISAM sql早期默认 存储引擎 # MEMORY 存储在内存中 用来做临时表和缓存 存储引擎 …

Adobe Acrobat Reader 中的漏洞

另一个流行漏洞 Adobe Acrobat 和 Acrobat Reader - 流行的便携式文档格式 (PDF) 工具 - 存在风险。该漏洞 CVE-2023-26369影响 Windows 和 macOS 安装。 攻击者创建的恶意 PDF 文档打开后&#xff0c;会利用与在缓冲区外写入有关的 CVE-2023-26369漏洞。因此&#xff0c;攻击…

数据中心液冷服务器详情说明

目录 前言 何为液冷服务器&#xff1f; 为什么需要液冷&#xff1f; 1.数据中心降低PUE的需求 2.政策导向 3.芯片热功率已经达到风冷散热极限 4.液冷比热远大于空气 液冷VS风冷&#xff0c;区别在哪&#xff1f; 1.液冷服务器跟风冷服务器的区别 2.液冷数据中心跟风冷…

linux安装常见的中间件和数据库

文章目录 一、数据库二、redis三、tomcat四、nginx五、mq六、es七、nacos八、neo4j&#xff08;图数据库&#xff09;九、fastdfs其他 一、数据库 linux环境上使用压缩包安装mysql【数据库】Mysql 创建用户与授权 二、redis redis是没有账号的&#xff0c;只能设置密码Linux…

对IP协议概念以及IP地址的概念进行简单整理

网络层重要协议 参考模型和协议栈IP协议IPv4数据报IP数据报格式IPv4地址特殊IP地址私有IP地址和公有IP地址子网划分 参考模型和协议栈 IP协议 IP协议定义了网络层数据传送的基本单元&#xff0c;也制定了一系列关于网络层的规则。 IPv4数据报 网络层的协议数据单元PDU 叫做分…

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

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

分布式事务解决方案之TCC

分布式事务解决方案之TCC 什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写&#xff0c;TCC要求每个分支事务实现三个操作&#xff1a;预处理Try、确认 Confirm、撤销Cancel。Try操作做业务检查及资源预留&#xff0c;Confirm做业务确认操作&#xff0c;Cancel实现一个…

Golang代码漏洞扫描工具介绍——govulncheck

Golang Golang作为一款近年来最火热的服务端语言之一&#xff0c;深受广大程序员的喜爱&#xff0c;笔者最近也在用&#xff0c;特别是高并发的场景下&#xff0c;golang易用性的优势十分明显&#xff0c;但笔者这次想要介绍的并不是golang本身&#xff0c;而且golang代码的漏洞…

微信小程序+echart实现点亮旅游地图

背景 最近看抖音有个很火的特效就是点亮地图&#xff0c;去过哪些地方&#xff0c;于是乎自己也想做一个&#xff0c;结合自己之前做的以家庭为单位的小程序&#xff0c;可以考虑做一个家庭一起点亮地图的功能。 效果图 过程 1&#xff0c;首先就是得去下微信小程序适配的ec…

react 实现拖动元素

demo使用create-react-app脚手架创建 删除一些文件&#xff0c;创建一些文件后 结构目录如下截图com/index import Movable from ./move import { useMove } from ./move.hook import * as Operations from ./move.opMovable.useMove useMove Movable.Operations Operationse…

ABB 1TGE120010R... Rev控制模块

ABB 1TGE120010R... Rev 控制器模块是一种高性能控制器&#xff0c;可用于工业自动化和过程控制应用。它具有以下主要特点&#xff1a; 多功能性&#xff1a;该控制器模块可用于多种应用&#xff0c;包括机器控制、过程控制和自动化系统等。 高性能&#xff1a;该控制器模块具…

竞赛选题 基于机器视觉的火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖&#xff0c;适合作为竞赛…

408强化(番外)文件管理

有点看不下去书&#xff0c;408&#xff0c;哎好久没看了&#xff0c;死磕数学时完全不想看其他科目&#xff0c;数学分数也尚未质变。 突然想到一个好点子&#xff0c;只看大纲尝试回忆一下这章的内容。 文件就是为了方便用户使用&#xff0c;按名访问而提出的&#xff0c;从…