ESP-IDF 相较于使用 IDE 开发,涉及的配置文件较多。本文以 LVGL Demos Example 为例,介绍 ESP-IDF 项目文件结构,重点介绍了 CMakelists 和分区表等配置文件。通过了解这些文件的格式和作用,你可以更好地理解 ESP-IDF 项目的组织方法,为自己的ESP32项目奠定基础。
文件结构
首先快速介绍下 ESP-IDF 项目的文件结构:
- build:编译的生成文件
- main:项目自身源码
- managed_componets:下载的组件文件
- CMakeLists:CMake配置文件
- dependencies.lock:组件文件哈希值
- partitions.csv:分区表
- README.md:说明文档
- sdkconfig:项目配置文件
- sdkconfig.defaults:默认项目配置文件
项目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:必需项,创建项目并执行项目名称。
组件 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 用于定义组件版本号。
分区表
在 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。
sdkconfig 文件
sdkconfig 是项目配置文件,其中包括了 ESP-IDF 在内所有项目组件的配置信息,通常使用 SDK Configuration Editor 编辑修改。当依赖组件修改或 IDF 版本修改时,编译器会自动更新 sdkconfig 文件。
在仅指定指定某些键值时,可以创建 sdkconfig.defaults 文件。在没有 sdkconfig 文件或文件缺少项时,编译器会查看 sdkconfig.defaults 文件。
对于已经编辑 sdkconfig 文件,使用 idf.py save-defconfig 命令更新 sdkconfig.defaults 文件。