跳至正文
首页 » ESP-IDF 项目文件结构快速介绍

ESP-IDF 项目文件结构快速介绍

ESP-IDF 相较于使用 IDE 开发,涉及的配置文件较多。本文以 LVGL Demos Example 为例,介绍 ESP-IDF 项目文件结构,重点介绍了 CMakelists 和分区表等配置文件。通过了解这些文件的格式和作用,你可以更好地理解 ESP-IDF 项目的组织方法,为自己的ESP32项目奠定基础。

1 文件结构

首先快速介绍下 ESP-IDF 项目的文件结构:

  • build:编译的生成文件
  • main:项目自身源码
  • managed_componets:下载的组件文件
  • CMakeLists:CMake配置文件
  • dependencies.lock:组件文件哈希值
  • partitions.csv:分区表
  • README.md:说明文档
  • sdkconfig:项目配置文件
  • sdkconfig.defaults:默认项目配置文件

2 项目CMakeLists

项目的根目录都需要 CMakeLists.txt 文件,以说明项目的构建设置。下面是示例项目的项目 CMakeLists

cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)

add_compile_options(-fdiagnostics-color=always
                    -Wno-attributes
                    -Wno-unused-variable
                    -Wno-unused-function
                    -Wno-ignored-qualifiers)

project(lvgl_demos)
  • cmake_minimum_required:必需项,指定该项目所需的最小 CMake 版本,必须位于文件第一行。
  • include:必需项,导入 CMake 的其余功能来完成配置项目、检索组件等任务。
  • add_compile_options:非必需项,增加编译配置选项。
  • project:必需项,创建项目并执行项目名称。

3 组件 CMakeLists

除项目外,每个组件都需要 CMakeLists 文件,以说明组件结构。下面是 managed_components/espressif_button 的 CMakeLists 文件。

set(PRIVREQ esp_timer)

if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER_EQUAL "5.0")
    list(APPEND REQ esp_adc)
else()
    list(APPEND REQ esp_adc_cal)
endif()

idf_component_register(SRCS "button_adc.c" "button_gpio.c" "iot_button.c" "button_matrix.c"
                        INCLUDE_DIRS include
                        REQUIRES driver ${REQ}
                        PRIV_REQUIRES ${PRIVREQ})

include(package_manager)
cu_pkg_define_version(${CMAKE_CURRENT_LIST_DIR})
  • set(PRIVREQ esp_timer) 指定 esp_timer 为私有依赖(仅组件有效)。
  • if(“${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}” VERSION_GREATER_EQUAL “5.0”) 判断版本大于等于 5.0
  • list(APPEND REQ esp_adc) 在依赖中添加 esp_adc
  • idf_component_register 将组件注册到系统中,SRCS 是源文件列表,INCLUDE_DIRES 是头文件路径,REQUIRES 是组件依赖,PRIV_REQUIRES 是私有组件依赖。
  • include 一般用于语句的复用。对于多个 CMakeLists 使用的语句,可以将其写入文件中,在使用的地方进行 include 操作。
  • cu_pkg_define_version 用于定义组件版本号。

4 分区表

在 SDK Configuration editor 中,选择使用自定义分区。这时编译会自动读取分区文件,文件形式如下

# Name,   Type, SubType,  Offset,   Size,  Flags
nvs,      data, nvs,      0x9000,  0x4000
otadata,  data, ota,      0xd000,  0x2000
phy_init, data, phy,      0xf000,  0x1000
factory,  app,  factory,  0x10000,  1M
ota_0,    app,  ota_0,    ,         1M
ota_1,    app,  ota_1,    ,         1M
nvs_key,  data, nvs_keys, ,        0x1000

# 开头为注释,每个非注释行为一个分区定义。 Name 仅用于解释说明;Type 可以指定为 app 或 data;app 的 SubType 有 factory、ota_0、ota_15、test;data 的 SubType 有 ota、phy、nvs、nvs_keys;Offset 为偏移地址,为空时编译器会根据空间大小自动分配偏移地址;Size 为空间大小;Flags 支持 encrypted、readonly。

5 sdkconfig 文件

sdkconfig 是项目配置文件,其中包括了 ESP-IDF 在内所有项目组件的配置信息,通常使用 SDK Configuration Editor 编辑修改。当依赖组件修改或 IDF 版本修改时,编译器会自动更新 sdkconfig 文件。

在仅指定指定某些键值时,可以创建 sdkconfig.defaults 文件。在没有 sdkconfig 文件或文件缺少项时,编译器会查看 sdkconfig.defaults 文件。

对于已经编辑 sdkconfig 文件,使用 idf.py save-defconfig 命令更新 sdkconfig.defaults 文件。

6 参考

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注