ESP32构建系统(CMake版)
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版)的更多相关文章
- ESP32构建系统 (传统 GNU Make)
概述: 一个 ESP-IDF 项目可以看作是多个不同组件的集合,ESP-IDF 可以显式地指定和配置每个组件.在构建项目的时候,构建系统会前往 ESP-IDF 目录.项目目录和用户自定义目录(可选)中 ...
- C/C++构建系统 CMake
Cmake实践 Cmake Practice –Cjacker cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍 生品,最终形成体系,成为一个独立的开放源代码项目 ...
- 团队项目·冰球模拟器——cmake 自动化构建系统的配置文件的编写
1 前言 考虑到命令行界面下编译程序并不如在 IDE 那么直观,再考虑到各位队友对 Linux 并不熟悉,如何大幅度地减轻整个项目的开发复杂度就是一个很重要的问题. 在 Linux 下有个很古老但很有 ...
- 【MEF】构建一个WPF版的ERP系统
原文:[MEF]构建一个WPF版的ERP系统 引言 MEF是微软的一个扩展性框架,遵循某种约定将各个部件组合起来.而ERP系统的一大特点是模块化,它们两者的相性很好,用MEF构建一个ERP系统是相当合 ...
- 不一样的go语言-构建系统与构件系统
前言 代码的最后一步是构建成计算机可识别的二进制数据,然后才得以在计算机上运行.如果你曾经写过有点规模(至少数十个以上独立的源文件,且需要依赖第三方包)C语言项目,必定对C语言项目的构建过程印象深 ...
- C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面
个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...
- C/C++构建系统 GNU autotool
我们在网上经常可以看到c/c++开源的项目,其中很多都是使用GNU的构建系统进行配置和编译的,如果按照规范构造这些的步骤,有一定的门槛和复杂度,下文把关于auotools系列的工具和概要的流程简要汇总 ...
- C/C++构建系统 -工具汇总
关于构建系统可以先参考百科 http://en.wikipedia.org/wiki/List_of_build_automation_software http://www.drdobbs.com/ ...
- Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z
http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...
随机推荐
- docker仓库登录 配置insecure-registries
1. 配置/etc/docker/daemon.json # cat /etc/docker/daemon.json { "registry-mirrors": ["ht ...
- 使用指定源安装python包
对于经常需要按照那个python包的同学,外网下载比较慢的话,可以使用公司内部的镜像进行安装 eg: pip install django -i http://mirrors.***.com.cn/p ...
- Sqlserver语句获取本周、上一周、本月数据
sql语句获取本周.上一周.本月数据 获取周数据 1 本周 2 select * from table1 where datediff(week,时间字段,getdate()) = 0 3 上周 4 ...
- TensorFlow实现超参数调整
TensorFlow实现超参数调整 正如你目前所看到的,神经网络的性能非常依赖超参数.因此,了解这些参数如何影响网络变得至关重要. 常见的超参数是学习率.正则化器.正则化系数.隐藏层的维数.初始权重值 ...
- TensorFlow csv读取文件数据(代码实现)
TensorFlow csv读取文件数据(代码实现) 大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 Tens ...
- TensorRT 加速性能分析
TensorRT 加速性能分析 Out-of-the-box GPU Performance 模型推理性能是什么意思?在为用户评估潜在的候选项时,不测量数据库查询和预筛选(例如决策树或手动逻辑)的贡献 ...
- MapReduce——客户端提交任务源码分析
计算向数据移动 MR程序并不会在客户端执行任何的计算操作,它是为计算工作做好准备,例如计算出切片信息,直接影响到Map任务的并行度. 在Driver中提交任务时,会写到这样的语句: boolean r ...
- 【NX二次开发】Block UI 选择单元
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- PAT甲级 1093 Count PAT‘s (25 分) 状态机解法
题目 原题链接 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the ...
- echarts迁移图动态加载
迁移图 获取迁移城市的经纬度 可以调用高德的接口,实现根据地名找寻经纬度的方法 #!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' 利用高德地图api实现 ...