ESP32 芯片是一款 2.4 GHz Wi-Fi 和蓝牙双模芯片,内置 1 或 2 个 32 位处理器,运算能力最高可达 600 DMIPS。

ESP-IDF 即乐鑫物联网开发框架,可为在 Windows、Linux 和 macOS 系统平台上开发 ESP32 应用程序提供工具链、API、组件和工作流的支持。

概述:

一个 ESP-IDF 项目可以看作是多个不同组件的集合,ESP-IDF 可以显式地指定和配置每个组件。在构建项目的时候,构建系统会前往 ESP-IDF 目录、项目目录和用户自定义目录(可选)中查找所有组件,允许用户通过文本菜单系统配置 ESP-IDF 项目中用到的每个组件。在所有组件配置结束后,构建系统开始编译整个项目。

概念:

项目:  特指一个目录,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如分区表、数据/文件系统分区和引导程序。
项目配置:保存在项目根目录下名为 sdkconfig 的文件中,可以通过 idf.py menuconfig 进行修改,且一个项目只能包含一个项目配置。
应用程序:是由 ESP-IDF 构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(可执行的主文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序)。
组件:  是模块化且独立的代码,会被编译成静态库(.a 文件)并链接到应用程序。部分组件由 ESP-IDF 官方提供,其他组件则来源于其它开源项目。
目标:  特指运行构建后应用程序的硬件设备。ESP-IDF 当前仅支持 ESP32 这一个硬件目标。

使用构建系统:

idf.py 命令行工具提供了一个前端,可以帮助您轻松管理项目的构建过程,它管理了以下工具:

  • CMake,配置待构建的系统
  • 命令行构建工具(Ninja 或 GNU Make)
  • esptool.py,烧录 ESP32

idf.py常用命令:

  • idf.py --help                                           查看命令列表
  • idf.py build                                             构建项目
  • idf.py clean                                            清除构建的文件,不会删除 CMake 配置输出及其他文件。
  • idf.py fullclean                                       构建文件全部删除
  • idf.py -p com1 -b 115200 flash              通过串口1使用115200的比特率烧录代码
  • idf.py -p com1 monitor                          显示串口1输出
  • idf.py -p com1 clean flash monitor        依次清理-构建-烧录-监视串口
  • idf.py size                                              打印应用程序相关的大小信息
  • idf.py set-target esp32                           设置目标芯片
  • idf.py menuconfig                                  配置

示例项目

 1 - myProject/
2 - CMakeLists.txt //设置全局CMake变量
3 - sdkconfig //项目配置文件
4 - components/ //可选自定义组件
5 - component1/
6 - CMakeLists.txt //设置自定义组件的CMake变量和项目集成
7 - Kconfig //组件配置
8 - src1.c
9 - component2/
10 - CMakeLists.txt
11 - Kconfig
12 - src1.c
13 - include/ - component2.h
14 - main/ //特殊组件,main是默认名称
15 - src1.c
16 - src2.c
17 - build/ //构建输出目录

main是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。

项目CMakeLists文件

1 cmake_minimum_required(VERSION 3.5)               //设置CMake版本
2 include($ENV{IDF_PATH}/tools/cmake/project.cmake) //导入CMake其余功能来配置项目、检索组件
3 project(myProject) //创建项目并指定名称

使用 cmake 中的 set 命令 来设置的变量,即 set(VARIABLE "VALUE")。请注意,set() 命令需放在 include(...) 之前,cmake_minimum(...) 之后。

  • COMPONENT_DIRS:组件的搜索目录,默认为 ${IDF_PATH}/components、${PROJECT_PATH}/components 和 EXTRA_COMPONENT_DIRS。
  • EXTRA_COMPONENT_DIRS:用于搜索组件的其它可选目录列表。
  • COMPONENTS:要构建进项目中的组件名称列表,默认为 COMPONENT_DIRS 目录下检索到的所有组件。
  • COMPONENT_REQUIRES: 指定了它依赖的另一个组件,会自动将其添加到 COMPONENTS 中
  • COMPONENT_REQUIRES_COMMON:每个组件都需要的通用组件列表,这些通用组件会自动添加到每个组件的 COMPONENT_PRIV_REQUIRES 列表中以及项目的 COMPONENTS 列表中。

组件CMakeLists文件

1 set(COMPONENT_SRCS "foo.c")               //用空格分隔的源文件列表,会编译进组件库
2 set(COMPONENT_ADD_INCLUDEDIRS "include") //目录列表
3 register_component() //将组件添加到构建系统中,构建生成与组件同名的库,并最终被链接到应用程序中。

组件是 COMPONENT_DIRS 列表中包含 CMakeLists.txt 文件的任何目录。

同名组件:ESP-IDF 在搜索所有待构建的组件时,会按照 COMPONENT_DIRS 指定的顺序依次进行,这意味着在默认情况下,首先搜索 ESP-IDF 内部组件,然后是项目组件,最后是 EXTRA_COMPONENT_DIRS 中的组件。如果这些目录中的两个或者多个包含具有相同名字的组件,则使用搜索到的最后一个位置的组件。这就允许将组件复制到项目目录中再修改以覆盖 ESP-IDF 组件。

如果没有设置 COMPONENT_SRCDIRS 或 COMPONENT_SRCS,组件不会被编译成库文件,但仍可以被添加到 include 路径中,以便在编译其他组件时使用。

  • PROJECT_VER:项目版本号,如果 ${PROJECT_PATH}/version.txt 文件存在,其内容会用作 PROJECT_VER 的值。
  • COMPONENT_ADD_INCLUDEDIRS:相对于组件目录的相对路径,为被添加到所有需要该组件的其他组件的全局 include 搜索路径中。
  • COMPONENT_PRIV_INCLUDEDIRS:include目录仅仅在编译当前组件时需要,PRIV同private。
  • COMPONENT_REQUIRES: 是一个用空格分隔的组件列表,列出了当前组件依赖的其他组件。
  • COMPONENT_PRIV_REQUIRES:以空格分隔的组件列表,用于编译或链接当前组件的源文件。这些组件的头文件路径不会传递给其余需要它的组件,仅用于编译当前组件的源代码。
  • COMPONENT_SRCS:要编译进当前组件的源文件的路径,推荐使用此方法向构建系统中添加源文件。
  • COMPONENT_SRCDIRS:相对于组件目录的源文件目录路径,用于搜索源文件(*.cpp,*.c,*.S)。匹配成功的源文件会替代 COMPONENT_SRCS 中指定的源文件,进而被编译进组件。即设置 COMPONENT_SRCDIRS 会导致 COMPONENT_SRCS 会被忽略。此方法可以很容易地将源文件整体导入到组件中,但并不推荐使用。
  • COMPONENT_SRCEXCLUDE:需要从组件中剔除的源文件路径。

举例:

set(COMPONENT_SRCS "test.c")              //编译的源文件路径
set(COMPONENT_ADD_INCLUDEDIRS "include") //所有组件包含的目录
set(COMPONENT_PRIV_INCLUDEDIRS freertos ) //当前组件包含的目录
set(COMPONENT_REQUIRES freertos ) //该组件依赖的其他组件
set(COMPONENT_PRIV_REQUIRES freertos ) //该组件依赖的其他组件,不会传递给其他组件
register_component() //组件添加到构建系统中

组件配置

每个组件都可以包含一个 Kconfig 文件,和 CMakeLists.txt 放在同一目录下。Kconfig 文件中包含要添加到该组件配置菜单中的一些配置设置信息。运行 menuconfig 时,可以在 Component Settings 菜单栏下找到这些设置。

参考:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system.html

ESP32构建系统(CMake版)的更多相关文章

  1. ESP32构建系统 (传统 GNU Make)

    概述: 一个 ESP-IDF 项目可以看作是多个不同组件的集合,ESP-IDF 可以显式地指定和配置每个组件.在构建项目的时候,构建系统会前往 ESP-IDF 目录.项目目录和用户自定义目录(可选)中 ...

  2. C/C++构建系统 CMake

    Cmake实践 Cmake Practice –Cjacker cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍 生品,最终形成体系,成为一个独立的开放源代码项目 ...

  3. 团队项目·冰球模拟器——cmake 自动化构建系统的配置文件的编写

    1 前言 考虑到命令行界面下编译程序并不如在 IDE 那么直观,再考虑到各位队友对 Linux 并不熟悉,如何大幅度地减轻整个项目的开发复杂度就是一个很重要的问题. 在 Linux 下有个很古老但很有 ...

  4. 【MEF】构建一个WPF版的ERP系统

    原文:[MEF]构建一个WPF版的ERP系统 引言 MEF是微软的一个扩展性框架,遵循某种约定将各个部件组合起来.而ERP系统的一大特点是模块化,它们两者的相性很好,用MEF构建一个ERP系统是相当合 ...

  5. 不一样的go语言-构建系统与构件系统

    前言   代码的最后一步是构建成计算机可识别的二进制数据,然后才得以在计算机上运行.如果你曾经写过有点规模(至少数十个以上独立的源文件,且需要依赖第三方包)C语言项目,必定对C语言项目的构建过程印象深 ...

  6. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  7. C/C++构建系统 GNU autotool

    我们在网上经常可以看到c/c++开源的项目,其中很多都是使用GNU的构建系统进行配置和编译的,如果按照规范构造这些的步骤,有一定的门槛和复杂度,下文把关于auotools系列的工具和概要的流程简要汇总 ...

  8. C/C++构建系统 -工具汇总

    关于构建系统可以先参考百科 http://en.wikipedia.org/wiki/List_of_build_automation_software http://www.drdobbs.com/ ...

  9. Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z

    http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...

随机推荐

  1. docker仓库登录 配置insecure-registries

    1. 配置/etc/docker/daemon.json # cat /etc/docker/daemon.json { "registry-mirrors": ["ht ...

  2. 使用指定源安装python包

    对于经常需要按照那个python包的同学,外网下载比较慢的话,可以使用公司内部的镜像进行安装 eg: pip install django -i http://mirrors.***.com.cn/p ...

  3. Sqlserver语句获取本周、上一周、本月数据

    sql语句获取本周.上一周.本月数据 获取周数据 1 本周 2 select * from table1 where datediff(week,时间字段,getdate()) = 0 3 上周 4 ...

  4. TensorFlow实现超参数调整

    TensorFlow实现超参数调整 正如你目前所看到的,神经网络的性能非常依赖超参数.因此,了解这些参数如何影响网络变得至关重要. 常见的超参数是学习率.正则化器.正则化系数.隐藏层的维数.初始权重值 ...

  5. TensorFlow csv读取文件数据(代码实现)

    TensorFlow csv读取文件数据(代码实现) 大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 Tens ...

  6. TensorRT 加速性能分析

    TensorRT 加速性能分析 Out-of-the-box GPU Performance 模型推理性能是什么意思?在为用户评估潜在的候选项时,不测量数据库查询和预筛选(例如决策树或手动逻辑)的贡献 ...

  7. MapReduce——客户端提交任务源码分析

    计算向数据移动 MR程序并不会在客户端执行任何的计算操作,它是为计算工作做好准备,例如计算出切片信息,直接影响到Map任务的并行度. 在Driver中提交任务时,会写到这样的语句: boolean r ...

  8. 【NX二次开发】Block UI 选择单元

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  9. PAT甲级 1093 Count PAT‘s (25 分) 状态机解法

    题目 原题链接 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the ...

  10. echarts迁移图动态加载

    迁移图 获取迁移城市的经纬度 可以调用高德的接口,实现根据地名找寻经纬度的方法 #!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' 利用高德地图api实现 ...