3.自定义工程目录配置CMakeLists

问题背景

        熟悉stm32keil开发的都知道,我们在编写不同的外设时,通常都会单独编写一个app文件夹或者是user文件夹之类的来存放不同外设功能的源文件和头文件。

        在前面一节2.构建第一个工程并烧录到ESP32开发板-CSDN博客中,我们是使用了一个乐鑫的官方所提供的一个hello world工程模板,这个工程里面我们表面上是用到了GPIO功能和USART功能,其他的一些功能我们暂时还没有用到,或者说暂时还没有包含其他功能模块。

        那么如果我一开始使用了模板是generic_gpio这个模板工程,在项目设计的前期实现我只需要gpio功能就够了,所以我就直接使用的是generic_gpio模板,后来我有需要使用到定时器功能,可能generic_gpio模板里面并没有包含这个功能,我们难道再去打开一个timer外设的模板工程吗,显然是比较麻烦的。

        虽然第二节我提到了我们一般会使用官方模板而不是自己新建一个空工程,但是那只是初期新建工程的时候是用官方模板,当我们新建工程完毕以后,我们需要对官方提供的模板进行修改,添加自己的文件目录以存放之后所使用的其他外设文件。因为官方的外设模板工程里面只有main文件夹下一个主函数的文件,我们总不可能把所有的外设实现函数统统写到这个主函数文件里面。

解决方案

        事实上官方已经提前想到了这个问题,乐鑫官方对 components 路径的介绍:“可选的 “components” 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。有关详细信息,请参阅 重命名 main 组件。如果项目中源文件较多,建议将其归于组件中,而不是全部放在 “main” 中。

        我们从官方的说明中可以获得两个方法来构建自己的工程文件

  • 1 在顶层目录下的 components 路径下添加组件。
  • 2 在顶层目录下的 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。

两种方法的实现原理:

我们观察顶层CMakeLists文件可以发现里面已有三行语句,其中第二行语句为include($ENV{IDF_PATH}/tools/cmake/project.cmake)

而配置项目、检索组件等任务都是 $ENV{IDF_PATH}/tools/cmake/project.cmake 决定的。

组件默认的搜索目录为 IDF_PATH/components、 PROJECT_DIR/components、和 EXTRA_COMPONENT_DIRS。

  • ESP-IDF内部组件 IDF_PATH/components
  • 扩展组件 EXTRA_COMPONENT_DIRS
  • 项目组件 PROJECT_DIR/components

IDF_PATH/components 用于系统组件。我们一般不会将文件放在这里面。

PROJECT_DIR/components、和 EXTRA_COMPONENT_DIRS 对应上面两种添加组件的方法。

在 PROJECT_DIR/components 中添加组件

步骤:

  1. 首先新建 PROJECT_DIR/components 路径。
  2. 在PROJECT_DIR/components 中添加我们自定义的组件,比如我添加了 led_key
  3. 将组件相关的头文件和源文件放到 led_key中,并新建 CMakeLists.txt 文件。
  4. 在 CMakeLists.txt 中添加源文件与头文件的路径。格式为:
idf_component_register(SRCS "led_key.c"INCLUDE_DIRS "."REQUIRES driver)

        相信前两个SRC和INCLUDE_DIRS都很好理解,分别是包含源文件和头文件的路径,那么后一个QEQUIRES到底是干什么的,为啥要后面跟上driver?

        这里我先解释第一个问题,QEQUIRES可以理解为添加依赖。在说第二个问题之前我们先来看看现在的文件目录是个什么情况:

然后看下源文件和头文件里面的内容:

led_key.c

#include "led_key.h"void LED_Init(void)
{gpio_config_t io_config;io_config.intr_type = GPIO_INTR_DISABLE;io_config.mode = GPIO_MODE_OUTPUT;io_config.pin_bit_mask = 1<<2;io_config.pull_down_en = GPIO_PULLDOWN_DISABLE;io_config.pull_up_en = GPIO_PULLUP_DISABLE;gpio_config(&io_config);//	esp_rom_gpio_pad_select_gpio (GPIO_NUM_2);//	gpio_set_direction(GPIO_NUM_2,GPIO_MODE_OUTPUT);
}void KEY_Init(void)
{gpio_config_t io_config;io_config.intr_type = GPIO_INTR_POSEDGE;io_config.mode = GPIO_MODE_INPUT;io_config.pin_bit_mask = 1<<0;io_config.pull_down_en = GPIO_PULLDOWN_DISABLE;io_config.pull_up_en = GPIO_PULLUP_DISABLE;gpio_config(&io_config);
}void led_blink( void * pvParameters )
{while(1){gpio_set_level(GPIO_NUM_2,0);vTaskDelay(1000 / portTICK_PERIOD_MS);//FreeRTOS延时函数--毫秒级gpio_set_level(GPIO_NUM_2,1);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}void gpio_isr_handler(void* arg)
{static int flag = 0;flag ^= 1;gpio_set_level(GPIO_NUM_2,flag);
}

led_key.h

#ifndef __LED_KEY__
#define __LED_KEY__#include "driver/gpio.h"#define ESP_INTR_FLAG_DEFAULT 0void LED_Init(void);
void KEY_Init(void);
void led_blink( void * pvParameters );
void gpio_isr_handler(void* arg);#endif

        看完文件结构和文件内容之后,我们大体可以明白为什么要添加一个driver依赖了,因为我们在led_key.h里面包含了driver/gpio.h,而如果我们不去进行依赖的包含,在编译的时候就会报出这样的错误:

fatal error: driver/gpio.h: No such file or directory

这就是由于依赖问题没有解决导致,我们编写的led_key.h文件没有指定依赖,那么编译器将不知道去哪里找这个driver/gpio.h文件。

在自定义的 EXTRA_COMPONENT_DIRS 中添加组件

        有时候我们不想用官方所提供的存放组件集的组件目录components,我们仍然希望创建单独的组件目录,这时候就需要在最顶层CMakeLists文件里面添加一语句用于设置外部组件的路径

# The following lines of boilerplate have to be in your project's CMakeLists
# in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)include($ENV{IDF_PATH}/tools/cmake/project.cmake)
set(EXTRA_COMPONENT_DIRS "./src")
project(myProject)

        比方说我们创建了一个叫做src的外部组件,就需要在最顶层CMakeLists文件添加set(EXTRA_COMPONENT_DIRS "./src"),

        创建自己存放组件集的组件目录,之后在组件目录下创建组件,不能直接创建组件目录,什么意思呢,就是我们要创建一个led的程序,需要在src下面再创建一个led的文件夹作为组件目录,再在led组件目录里面新建led.c源文件。src是一个组件集的目录。

        接下来的操作就和在PROJECT_DIR/components 中添加组件的操作一样了。其实这样做无非是吧官方提供的组件集文件名字替换为了自己起的组件集名字,然后由于顶层CMakeLists默认包含components组件集所以不需要我们添加,而我们自己创建的非components组件集属于外部组件,那么就需要在顶层说明一下外部组件集的路径了。

        

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

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

相关文章

elementui el-table表格自动循环滚动【超详细图解】

效果如图 1. 当表格内容超出时&#xff0c;自动滚动&#xff0c;滚动到最后一条之后在从头滚动。 2. 鼠标移入表格中&#xff0c;停止滚动&#xff1b;移出后&#xff0c;继续滚动。 直接贴代码 <template><div><div class"app-container"><e…

AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常…

JavaScript:查找两个正序数组的中位数

中位数&#xff1a;统计学中的专有名词&#xff0c;代表一个样本、种群或概率分布中的一个数值&#xff0c;其可将数值集合划分为相等的上下两部分。对于有限的数集&#xff0c;可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个&#xff0c;通常…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的输电线路设备检测系统(深度学习+UI界面+Python代码+训练数据集)

摘要&#xff1a;本篇博客详细介绍了如何运用深度学习构建一个先进的输电线路设备检测系统&#xff0c;并附上了完整的实现代码。该系统利用了最新的YOLOv8算法作为其核心&#xff0c;同时也对之前版本的YOLOv7、YOLOv6、YOLOv5进行了性能比较&#xff0c;包括但不限于mAP&…

Pytorch搭建AlexNet 预测实现

1.导包 import torch import matplotlib.pyplot as plt import json from model import AlexNet from PIL import Image from torchvision import transforms 2.数据预处理 data_transform transforms.Compose([transforms.Resize((224, 224)), # 将图片重新裁剪transform…

<线性回归算法(Linear regression)>——《机器学习算法初识》

目录 一、线性回归简介 1 线性回归应用场景 2 什么是线性回归 2.1 定义与公式 2.2 线性回归的特征与目标的关系分析 3 小结 二、线性回归的损失和优化 1 损失函数 2 优化算法 2.1 正规方程 2.1.1 什么是正规方程 2.1.2 正规方程求解举例 2.1.3 正规方程的推导 2.…

学习python笔记:3,条件判断,while循环,for循环,嵌套循环

注意&#xff1a; condition后面有冒号&#xff1a; 换行之后的代码要对齐。 条件判断 if 在Python中&#xff0c;if 语句用于基于某个条件&#xff08;或一系列条件&#xff09;来执行代码块。如果条件为真&#xff08;True&#xff09;&#xff0c;则执行 if 语句下的代码…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

摘要&#xff1a;开发用于田间杂草识别的系统对提高农业运营效率和提升作物产出至关重要。本篇文章详尽阐述了如何应用深度学习技术开发一个用于田间杂草识别的系统&#xff0c;并附上了完备的代码实现。该系统基于先进的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5…

AXI CANFD MicroBlaze 测试笔记

文章目录 前言测试用的硬件连接Vivado 配置Vitis MicroBlaze CANFD 代码测试代码测试截图Github Link 前言 官网: CAN with Flexible Data Rate (CAN FD) (xilinx.com) 特征: 支持8Mb/s的CANFD多达 3 个数据位发送器延迟补偿(TDC, transmitter delay compensation)32-deep T…

在Linux/Ubuntu/Debian中设置字体

下载字体。 下载你喜欢的字体&#xff0c;双击并安装。 之后更新字体缓存&#xff1a; fc-cache -f -v安装 GNOME 调整。 GNOME Tweaks 是一个工具&#xff0c;允许你自定义 GNOME 桌面环境的各个方面&#xff0c;包括字体。 如果你还没有安装 GNOME Tweaks&#xff1a; …

PLC实验—西门子S7 1200读取旋转编码器数据并计算电机转速

PLC实验—西门子S7 1200读取旋转编码器数据并计算电机转速 注意PTO控制步进电机实验博途软件需要V14版本&#xff0c;不然没有PTO功能块 软件的下载请点击下方百度网盘的链接 链接&#xff1a;https://pan.baidu.com/s/11mQFVnaQxrUy4W9nGIk8Jw 提取码&#xff1a;6lva 详细的…

ubuntu20.04上获取Livox Avia雷达点云数据

若拿到手的Livox Avia激光雷达不知道它的ip信息&#xff0c;可以在官网上LiDAR Sensors - Livox下载上位机软件Livox Viewer&#xff0c;查看IP&#xff0c;下载window版本就可以。雷达通过网线连上电脑后&#xff0c;该软件就可以自动识别出来。按照下图步骤&#xff0c;就可以…

高性能 数据库连接池 HikariCP | HikariCP 配置详解

👀 上节回顾:上一节对 HikariCP 数据源进行了构造。 👉 本节目标:了解构造 HikariCP 数据源的配置的含义,便于更好、更合理的配置 HikariCP。 HikariCP 对配置进行了思考,为开发人员们提供了一些明智的默认配置,所以大多数情况下,我们是不需要调整配置的。除了基本配…

【功能大全】手机短信验证码一键注册登录流程

目录 发送验证码 注册登录 用户表设计 ​编辑申请腾讯云短信与密钥 找到云短信服务 开通腾讯云短信服务 ​编辑​​​​​创建短信签名 ​编辑​编辑创建短信正文模版​编辑​编辑 等待审核 测试短信​编辑 SDK密钥创建 SpringBoot集成腾讯云短信 pom中导入腾讯云短…

二分查找的梳理——边界初始值、循环条件、边界更新

文章目录 1 来源2 思考2.1 区间的选择——由区间决定写法2.2 重点&#xff1a;右边界初始值、循环条件、边界更新2.3 两种写法详解2.3.1 左闭右闭的写法2.3.2 左闭右开的写法 1 来源 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查…

学习笔记-华为IPD转型2020:1,IPD的重要意义

华为产品开发转型&#xff1a;IPD计划 大多数公司发现&#xff0c;当公司大幅增长时&#xff0c;在较小规模上有效的管理实践不再有效。产品开发过程也是如此。随着华为的发展&#xff0c;该公司遇到了产品故障率更高、开发周期更长和研发成本增加等问题。然后&#xff0c;它转…

LeetCode 2885.重命名列

DataFrame students ------------------- | Column Name | Type | ------------------- | id | int | | first | object | | last | object | | age | int | ------------------- 编写一个解决方案&#xff0c;按以下方式重命名列&#xff1a; id 重命名为 student_id first 重…

Tomcat数据源笔记

Tomcat数据源笔记 连接池的概念 连接池是一种由容器提供的机制&#xff0c;用于管理数据库连接对象的集合。连接池的主要作用是在应用程序需要与数据库进行交互时&#xff0c;提供可复用的连接对象&#xff0c;从而减少每次建立数据库连接的开销。 连接池的工作原理 连接池的…

软件工程---原型评价

在原型被构建后&#xff0c;由开发人员组织实施测试&#xff0c;测试是原型评价的一个重要组成部分。 但是测试用例一般不能发现所有的缺陷&#xff0c;所以说测试也不是万能的。 Dam和Siang提出了几个获取原型反馈的最佳实践技巧&#xff1a; 1. 在要求原型反馈时提供框架素…

小米汽车SU7定档发布,雷军携智能科技赴三年之约

大家好&#xff01; 我是老洪。 刚刚浏览到一则关于小米汽车的新闻&#xff0c;内容颇为引人关注。 小米SU7&#xff0c;这款备受期待的新能源汽车&#xff0c;已经正式定档在3月28日发布。 雷军&#xff0c;小米的掌舵人&#xff0c;已经明确表示&#xff0c;他们对即将到来的…