ESP-IDF编译系统详解(1)

接前一篇文章:VSCode + ESP-IDF安装与配置全过程

本文内容主要参考:

《ESP32-C3物联网工程开发实战》 —— 乐鑫科技 编著

特此致谢!

前文已经详述了ESP-IDF开发环境的搭建,包括ESP-IDF的下载与安装完整流程,以及VSCode + ESP-IDF的安装与配置。本文对于ESP-IDF编译系统进行详解。

1. 编译系统基本概念

ESP-IDF工程是一个包含入口函数的主程序多个独立功能组件的集合。例如,一个控制LED开关的项目主要包含一个入口函数main和控制GPIO的driver组件。如果要实现LED远程控制功能,则还需要额外添加Wi-Fi、TCP/IP协议栈等。

编译系统通过一套构建规则可对代码进行编译、链接,并生成可执行文件(.bin)。ESP-IDF v4.0及以上版本的编译系统默认以CMake为基础搭建,编译脚本CMakeLists.txt可用于控制代码的编译行为ESP-IDF编译系统除了支持CMake基础语法外,还定义了一套默认的编译规则和CMake函数,用户使用简单的语句即可完成编译脚本的编写

2. 工程文件结构

工程(Project,也称为项目)是指一个包含入口函数main用户自定义组件,以及构建可执行应用程序所需的编译脚本、配置文件、分区表等文件的文件夹。工程可以被复制和传递,并可在安装了相同版本ESP-IDF开发环境的机器中编译生成相同的可执行文件。

笔者之前建立的VSCODE+ESP-IDF的工程结构如下所示:

  • main目录内容

  • build目录内容

由于ESP-IDF具有跨芯片平台的特性,同时支持乐鑫的多款物联网芯片,包括ESP32、ESP32-S系列、ESP32-C系列、ESP32-H系列等,因此在编译代码之前,需要确定一个目标此目标既是运行应用程序的硬件设备,也是编译系统的生成目标

工程可以指定编译目标,也可以同时兼容多种目标,在编译时由用户选择。例如,可以通过命令“idf.py set-target esp32c3”将编译目标设置为ESP-C3,期间将加载针对ESP32-C3的默认参数和编译工具链路径,经过编译后即可为ESP32-C3生成可执行程序。用户也可以再次运行set-target命令来设置其它目标,编译系统将自动清理并重新进行配置。

这里,分别给出通过ESP-IDF命令行方式和VSCode+ESP-IDF方式执行set-target命令的实际操作。

  • ESP-IDF命令行方式

实际命令及结果如下:

C:\Users\ns\esp32\helloworld>idf.py set-target esp32-c3
Adding "set-target"'s dependency "fullclean" to list of commands with default set of options.
Executing action: fullclean
Executing action: set-target
Set Target to: esp32c3, new sdkconfig will be created.
Running cmake in directory C:\Users\ns\esp32\helloworld\build
Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=C:\Espressif\python_env\idf5.2_py3.11_env\Scripts\python.exe -DESP_PLATFORM=1 -DIDF_TARGET=esp32c3 -DCCACHE_ENABLE=1 C:\Users\ns\esp32\helloworld"...
-- Existing sdkconfig 'C:/Users/ns/esp32/helloworld/sdkconfig' renamed to 'C:/Users/ns/esp32/helloworld/sdkconfig.old'.
-- Found Git: C:/Espressif/tools/idf-git/2.43.0/cmd/git.exe (found version "2.43.0.windows.1")
-- ccache will be used for faster recompilation
-- The C compiler identification is GNU 13.2.0
-- The CXX compiler identification is GNU 13.2.0
-- The ASM compiler identification is GNU
-- Found assembler: C:/Espressif/tools/riscv32-esp-elf/esp-13.2.0_20230928/riscv32-esp-elf/bin/riscv32-esp-elf-gcc.exe
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Espressif/tools/riscv32-esp-elf/esp-13.2.0_20230928/riscv32-esp-elf/bin/riscv32-esp-elf-gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Espressif/tools/riscv32-esp-elf/esp-13.2.0_20230928/riscv32-esp-elf/bin/riscv32-esp-elf-g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- git rev-parse returned 'fatal: not a git repository (or any of the parent directories): .git'
-- Could not use 'git describe' to determine PROJECT_VER.
-- Building ESP-IDF components for target esp32c3
-- Project sdkconfig file C:/Users/ns/esp32/helloworld/sdkconfig
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of time_t
-- Check size of time_t - done
-- Found Python3: C:/Espressif/python_env/idf5.2_py3.11_env/Scripts/python.exe (found version "3.11.2") found components: Interpreter-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS
-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success
-- App "hello_world" version: 1
-- Adding linker script C:/Users/ns/esp32/helloworld/build/esp-idf/esp_system/ld/memory.ld
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_system/ld/esp32c3/sections.ld.in
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_rom/esp32c3/ld/esp32c3.rom.ld
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_rom/esp32c3/ld/esp32c3.rom.api.ld
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_rom/esp32c3/ld/esp32c3.rom.libgcc.ld
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_rom/esp32c3/ld/esp32c3.rom.newlib.ld
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_rom/esp32c3/ld/esp32c3.rom.version.ld
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_rom/esp32c3/ld/esp32c3.rom.eco3.ld
-- Adding linker script C:/Espressif/frameworks/esp-idf-v5.2.1/components/soc/esp32c3/ld/esp32c3.peripherals.ld
-- Components: app_trace app_update bootloader bootloader_support bt cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_system esp_timer esp_wifi espcoredump esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table protobuf-c protocomm pthread riscv sdmmc soc spi_flash spiffs tcp_transport ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant
-- Component paths: C:/Espressif/frameworks/esp-idf-v5.2.1/components/app_trace C:/Espressif/frameworks/esp-idf-v5.2.1/components/app_update C:/Espressif/frameworks/esp-idf-v5.2.1/components/bootloader C:/Espressif/frameworks/esp-idf-v5.2.1/components/bootloader_support C:/Espressif/frameworks/esp-idf-v5.2.1/components/bt C:/Espressif/frameworks/esp-idf-v5.2.1/components/cmock C:/Espressif/frameworks/esp-idf-v5.2.1/components/console C:/Espressif/frameworks/esp-idf-v5.2.1/components/cxx C:/Espressif/frameworks/esp-idf-v5.2.1/components/driver C:/Espressif/frameworks/esp-idf-v5.2.1/components/efuse C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp-tls C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_adc C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_app_format C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_bootloader_format C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_coex C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_common C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_eth C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_event C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_gdbstub C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_hid C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_http_client C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_http_server C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_https_ota C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_https_server C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_hw_support C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_lcd C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_local_ctrl C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_mm C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_netif C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_netif_stack C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_partition C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_phy C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_pm C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_psram C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_ringbuf C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_rom C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_system C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_timer C:/Espressif/frameworks/esp-idf-v5.2.1/components/esp_wifi C:/Espressif/frameworks/esp-idf-v5.2.1/components/espcoredump C:/Espressif/frameworks/esp-idf-v5.2.1/components/esptool_py C:/Espressif/frameworks/esp-idf-v5.2.1/components/fatfs C:/Espressif/frameworks/esp-idf-v5.2.1/components/freertos C:/Espressif/frameworks/esp-idf-v5.2.1/components/hal C:/Espressif/frameworks/esp-idf-v5.2.1/components/heap C:/Espressif/frameworks/esp-idf-v5.2.1/components/http_parser C:/Espressif/frameworks/esp-idf-v5.2.1/components/idf_test C:/Espressif/frameworks/esp-idf-v5.2.1/components/ieee802154 C:/Espressif/frameworks/esp-idf-v5.2.1/components/json C:/Espressif/frameworks/esp-idf-v5.2.1/components/log C:/Espressif/frameworks/esp-idf-v5.2.1/components/lwip C:/Users/ns/esp32/helloworld/main C:/Espressif/frameworks/esp-idf-v5.2.1/components/mbedtls C:/Espressif/frameworks/esp-idf-v5.2.1/components/mqtt C:/Espressif/frameworks/esp-idf-v5.2.1/components/newlib C:/Espressif/frameworks/esp-idf-v5.2.1/components/nvs_flash C:/Espressif/frameworks/esp-idf-v5.2.1/components/nvs_sec_provider C:/Espressif/frameworks/esp-idf-v5.2.1/components/openthread C:/Espressif/frameworks/esp-idf-v5.2.1/components/partition_table C:/Espressif/frameworks/esp-idf-v5.2.1/components/protobuf-c C:/Espressif/frameworks/esp-idf-v5.2.1/components/protocomm C:/Espressif/frameworks/esp-idf-v5.2.1/components/pthread C:/Espressif/frameworks/esp-idf-v5.2.1/components/riscv C:/Espressif/frameworks/esp-idf-v5.2.1/components/sdmmc C:/Espressif/frameworks/esp-idf-v5.2.1/components/soc C:/Espressif/frameworks/esp-idf-v5.2.1/components/spi_flash C:/Espressif/frameworks/esp-idf-v5.2.1/components/spiffs C:/Espressif/frameworks/esp-idf-v5.2.1/components/tcp_transport C:/Espressif/frameworks/esp-idf-v5.2.1/components/ulp C:/Espressif/frameworks/esp-idf-v5.2.1/components/unity C:/Espressif/frameworks/esp-idf-v5.2.1/components/usb C:/Espressif/frameworks/esp-idf-v5.2.1/components/vfs C:/Espressif/frameworks/esp-idf-v5.2.1/components/wear_levelling C:/Espressif/frameworks/esp-idf-v5.2.1/components/wifi_provisioning C:/Espressif/frameworks/esp-idf-v5.2.1/components/wpa_supplicant
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/ns/esp32/helloworld/build
  • VSCode+ESP-IDF方式

实际图形配置界面及结果如下图所示:

更多内容请看下回。

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

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

相关文章

怎么排查K8S容器当中的Java程序内存泄露问题

今天早上发现生产线其中的一个服务在凌晨的时候突然重启了,内存突然从1G升到1.8G,CPU使用量从0.1升到了0.28,说明在这个时间点,内存突增达到了限额以上,服务重启了。因为这个服务布署了多节点,这次重启对业…

【springboot整合redis】异常处理

这个问题是在使用springboot整合redis时,创建好工程后,测试时所产生的 报错: org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: NOAUTH A…

共享购:融合社交分享与消费返利的创新电商模式

共享购电商模式是一种独特的商业模式,巧妙地将社交分享与消费返利结合,让消费者在购物的同时,也能通过平台资产奖励实现价值的双重增长。该平台资产体系主要由共享值和共享积分两大要素构成,共同构建了一个充满活力的电商生态系统…

巴特沃斯滤波原理及代码实现(matlab详细过程版)

目录 一、算法原理1、原理概述2、参考文献 二、代码实现三、结果展示 本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 巴特沃斯滤波器(Butterworth filt…

SQLite运行时可加载扩展(三十五)

返回:SQLite—系列文章目录 上一篇:SQLite轻量级会话扩展(三十四) 下一篇:SQLite的DBSTAT 虚拟表(三十六) 1. 概述 SQLite 能够在运行时加载扩展(包括新的应用程序定义的 SQL 函数、整理序列、虚拟表和 VFS&…

Mysql-主从复制理解

环境:mysql,主从复制,必须有2个mysql实例,也就是说可以在一台电脑上安装2个msyql,或者2台服务器,一个主服务器,一个从服务器 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的…

Tomcat安装和配置以及多实例部署(附脚本)

TOMCAT详细部署 Tomcat服务器简介核心组件Tomcat 各组件及关系工作流程 Tomcat server.xml 配置详解serverserviceConnectorEngineHostContextValve 阀门 Tomcat部署与安装部署脚本主要目录说明 Tomcat多实例部署扩展和优化 Tomcat 的 catalina.sh 文件以调整 JVM 参数 Tomcat服…

前端工程化Vue使用Node.js设置国内高速npm镜像源(踩坑记录版)

前端工程化Vue使用Node.js设置国内高速npm镜像源(踩坑记录版) 此篇仅为踩坑记录,并未成功更换高速镜像源,实际解决方法见文末跳转链接。 1.自身源镜像 自身镜像源创建Vue项目下载速度感人 2.更改镜像源 2.1 通过命令行配置 前提…

K8s容器部署maven项目

最近在整一整套devops自动化持续集成的东西,一开始就做好了踩坑的准备。 failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题,看了一圈首次搭建k8s的都是高频出现的问题…

泰坦尼克号乘客生存情况预测分析2

泰坦尼克号乘客生存情况预测分析1 泰坦尼克号乘客生存情况预测分析2 泰坦尼克号乘客生存情况预测分析3 泰坦尼克号乘客生存情况预测分析总 背景描述 Titanic数据集在数据分析领域是十分经典的数据集,非常适合刚入门的小伙伴进行学习! 泰坦尼克号轮船的…

基于LM Studio + LLaMA3 建立本地化的ChatGPT

4月19日,Facebook母公司Meta重磅推出了Llama3。即便大家现在对于大厂和巨头频繁迭代AI模型的行为已经见怪不怪,Meta的Llama3仍旧显得与众不同,因为这是迄今最强大的开源AI模型。LLaMA模型通常采用了类似于GPT(由OpenAI开发&#x…

【Qt】error LNK2001: 无法解析的外部符号

参考:Qt/VS LNK2019/LNK2001:无法解析的外部符号_qt lnk2001无法解析的外部符号-CSDN博客 微软官方报错文档-链接器工具错误 LNK2019 __declspec error LNK2001: 无法解析的外部符号 "__declspec(dllimport) 原因 以这种为前缀的基本上跟库相关…

pnpm install报错 Value of “this“ must be of type URLSearchParams

执行pnpm install的时候就报错Value of “this” must be of type URLSearchParams 由于之前执行没有出现过这个问题,最近在使用vue3所以使用了高版本的node,怀疑是node版本的问题。 解决: 检查node版本 node -v当前使用的是20.11.0的 修改…

《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录

往期 《ESP8266通信指南》6-创建TCP服务器(AT指令)-CSDN博客 《ESP8266通信指南》5-TCP通信透传模式(AT指令)-CSDN博客 《ESP8266通信指南》4-以Client进行TCP通信(AT指令)-CSDN博客 《ESP8266通信指南》3-常用AT指令详解-826…

elasticsearch 常用语法汇总

文章目录 前言elasticsearch 常用语法汇总1. 创建索引2. 检索索引信息3. 删除索引4. 文档操作4.1. 对blog_new索引指定文档ID新增4.2. 对blog_new索引不指定文档ID新增,随机文档ID:4.3. 获取文档4.4. 更新文档4.5. 删除文档 5. 查询5.1. 匹配查询5.2. 范围查询5.3. …

HackMyVM-Vulny

目录 信息收集 arp nmap nikto WEB信息收集 主页信息收集 gobuster RCE漏洞 反弹shell 提权 系统信息收集 横向渗透 flock提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC…

从NuGet获取OpenTK

OpenTK是一个开源、跨平台的游戏开发库,由MonoGame团队创建。它为C#开发者提供了一个简单易用的接口,以便使用OpenGL、OpenAL和OpenCL进行3D渲染、音频处理和并行计算。OpenTK的目标是提供一个一致且高效的框架,让开发者能够专注于构建他们的…

鸿蒙(HarmonyOS)性能优化实战-Trace使用教程

概述 OpenHarmony的DFX子系统提供了为应用框架以及系统底座核心模块的性能打点能力,每一处打点即是一个Trace,其上附带了记录执行时间、运行时格式化数据、进程或线程信息等。开发者可以使用SmartPerf-Host调试工具对Trace进行解析,在其绘制…

arcgis js 4.x加载SceneLayer并实现基于属性查询定位及高亮

一、代码 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1,maximum-scale1,user-scalableno"><title></title><link rel…

python批量删除文件

python批量删除文件 1、查询与删除2、添加模块到地址中3、批量删除多个路径中不需要导出的文件 1、查询与删除 mport osdef get_files_in_folder(folder_path):files []for file in os.listdir(folder_path):if os.path.isfile(os.path.join(folder_path, file)):files.appen…