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

2024-04-27 09:04
文章标签 详解 idf esp 编译系统

本文主要是介绍ESP-IDF编译系统详解(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接前一篇文章:ESP-IDF编译系统详解(1)

本文内容主要参考:

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

特此致谢!

2. 工程文件结构

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

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

(1)组件(components)

组件是模块化且独立的代码,在编译系统中以文件夹的形式管理(文件夹名默认为组件名)。经过组件的编译脚本,可以指定其编译参数和依赖关系。在编译时,组件会被编译成独立的静态库(.a)文件,最终在链接阶段共同组成应用程序。

ESP-IDF的关键功能(如操作系统、外设驱动、网络协议栈等)是以组件的形式提供的,这些组件保存在ESP-IDF根目录下的components目录中。

开发者无须将这些组件复制到myProject(其工程)的components目录中,只需要在CMakeLists.txt中使用REQUIRESPRIV_REQUIRES指明对它们的依赖关系即可,编译系统会自动找到该组件并对其进行编译。

因此客户工程(myProject)下components目录并不是必需的。这里仅用于包含项目的部分自定义组件,自定义组件可以是第三方库或者用户的自定义代码。除此之外,组件也可以来自非ESP-IDF或非当前工程的任意目录,如来源于在其它目录下保存的开源项目。这时只需要在根目录的CMakeLists.txt中通过设置EXTRA_COMPONNT_DIRS变量来添加该组件的查找位置即可。

(2)入口程序

main目录和其它组件(如component1)的文件结构是一样的,它是一个必须存在的特殊组件。一个工程有且仅有一个main目录,该目录包含了项目本身的源代码和用户程序的入口app_main,用户程序默认从此处开始执行。main组件的特殊之处还有,它默认依赖于所有搜索路径中的组件,因此不必再自己的CMakeLists.txt中使用REQUIRES或PRIV_REQUIRES指明依赖关系。

(3)配置文件

工程的根目录下包含了一个名为sdkconfig的配置文件,该文件包含了工程所有组件的配置参数。其内容如下(只截取开头部分):

#
# Automatically generated file. DO NOT EDIT.
# Espressif IoT Development Framework (ESP-IDF) 5.2.1 Project Configuration
#
CONFIG_SOC_ADC_SUPPORTED=y
CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y
CONFIG_SOC_UART_SUPPORTED=y
CONFIG_SOC_GDMA_SUPPORTED=y
CONFIG_SOC_AHB_GDMA_SUPPORTED=y
CONFIG_SOC_GPTIMER_SUPPORTED=y
CONFIG_SOC_TWAI_SUPPORTED=y
CONFIG_SOC_BT_SUPPORTED=y
CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y
CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y
CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y
CONFIG_SOC_XT_WDT_SUPPORTED=y
CONFIG_SOC_WIFI_SUPPORTED=y
CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y
CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y
CONFIG_SOC_EFUSE_HAS_EFUSE_RST_BUG=y
CONFIG_SOC_EFUSE_SUPPORTED=y
CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y
CONFIG_SOC_RTC_MEM_SUPPORTED=y
CONFIG_SOC_I2S_SUPPORTED=y
CONFIG_SOC_RMT_SUPPORTED=y
CONFIG_SOC_SDM_SUPPORTED=y
CONFIG_SOC_GPSPI_SUPPORTED=y
CONFIG_SOC_LEDC_SUPPORTED=y
CONFIG_SOC_I2C_SUPPORTED=y
……

sdkconfig文件是由编译系统自动生成的,可通过命令idf.py menuconfig进行修改并重新生成。

C:\Users\ns\esp32\helloworld>idf.py menuconfig
Executing action: menuconfig
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 -DCCACHE_ENABLE=1 C:\Users\ns\esp32\helloworld"...
-- ccache will be used for faster recompilation
-- 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
-- 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/e(Top)                                                                                                                                                                          Espressif IoT Development Framework Configuration                                              Build type  --->                                                                                                                     Bootloader config  --->                                                                                                              Security features  --->                                                                                                              Application manager  --->                                                                                                            Boot ROM Behavior  --->                                                                                                              Serial flasher config  --->                                                                                                          Partition Table  --->                                                                                                                Compiler options  --->                                                                                                               Component config  --->                                                                                                           [ ] Make experimental features visible                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    [Space/Enter] Toggle/enter  [ESC] Leave menu           [S] Save                                                                      [O] Load                    [?] Symbol info            [/] Jump to symbol                                                            [F] Toggle show-help mode   [C] Toggle show-name mode  [A] Toggle show-all mode                                                      [Q] Quit (prompts for save) [D] Save minimal config (advanced)                                                                       

menuconfig中的选项主要从工程的Kconfig.projbuild以及组件的Kconfig导入,组件的开发者一般通过在Kconfig中添加配置项,使组件具有灵活可配置的特性。

(4)编译目录(build)

使用命令idf.py build编译产生的中间文件和最终的可执行程序,将默认保存在工程的build目录中

C:\Users\ns\esp32\helloworld>dir build……2024/04/26  14:00    <DIR>          .
2024/04/26  11:49    <DIR>          ..
2024/04/26  14:00               148 .ninja_log
2024/04/26  11:49                77 app-flash_args
2024/04/26  11:49    <DIR>          bootloader
2024/04/26  11:49                83 bootloader-flash_args
2024/04/26  11:49    <DIR>          bootloader-prefix
2024/04/26  13:58         5,134,145 build.ninja
2024/04/26  13:58            25,231 CMakeCache.txt
2024/04/26  13:58    <DIR>          CMakeFiles
2024/04/26  11:49             1,827 cmake_install.cmake
2024/04/26  13:58         4,498,841 compile_commands.json
2024/04/26  11:49    <DIR>          config
2024/04/26  11:49             6,406 config.env
2024/04/26  13:58    <DIR>          esp-idf
2024/04/26  11:49               937 flasher_args.json
2024/04/26  11:49                77 flash_app_args
2024/04/26  11:49               152 flash_args
2024/04/26  11:49               192 flash_args.in
2024/04/26  11:49                83 flash_bootloader_args
2024/04/26  11:49               152 flash_project_args
2024/04/26  11:49             4,030 kconfigs.in
2024/04/26  11:49               449 kconfigs_projbuild.in
2024/04/26  11:49             4,307 ldgen_libraries
2024/04/26  11:49             1,994 ldgen_libraries.in
2024/04/26  11:49    <DIR>          log
2024/04/26  11:49                96 partition-table-flash_args
2024/04/26  11:49           154,009 project_description.json20 个文件      9,833,236 字节8 个目录 416,276,602,880 可用字节

一般情况下,用户不必查看build目录的内容,ESP-IDF预定义了操作该目录的命令。如使用命令“idf.py flash”将自动找到编译生成的二进制文件,并烧录到指定的Flash地址;使用命令“idf.py fullclean”可以对整个build目录进行清理。

(5)分区表(partitions.csv)

每一个工程都会配置相应的分区表,用于划分Flash的空间,指明可执行程序和用户数据空间的大小、起始地址等。命令“idf.py flash”或者OTA升级程序据此将固件烧录到Flash的对应地址。ESP-IDF在components/partitin_table中提供了几套系统默认的分区表,如partitions_singleapp.csv和partitions_two_ota.csv等,用户可以在menuconfig中进行选择。

如果系统默认的分区表不能满足项目的要求,开发者可以在项目目录下添加自定义的分区表partitions.csv,并在menuconfig中选择自定义的分区表。

更多内容请看下回。

这篇关于ESP-IDF编译系统详解(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940071

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例: