ESP-IDF 编译系统说明

1. 配置管理

1.1 Kconfig配置系统

ESP-IDF基于Kconfig配置系统,配置文件以Kconfig命名,分布于各组件目录,顶层有主Kconfig文件。通过idf.py menuconfig生成sdkconfig文件,作为编译时配置输入。

  • 根目录Kconfig定义全局配置选项。
  • 各组件目录Kconfig定义组件相关配置。
  • sdkconfig存储最终配置,影响编译选项和功能启用。

1.2 代码示例

根目录Kconfig片段:

kconfig 复制代码
config IDF_CMAKE
    bool
    default "y"

config IDF_TARGET_ARCH_XTENSA
    bool
    default "y"

1.3 配置流程

  • 执行idf.py menuconfig,加载所有Kconfig文件,生成sdkconfig
  • 编译时读取sdkconfig,设置编译选项。

2. 新项目添加

2.1 目录结构

复制代码
<project_root>/
  main/
    CMakeLists.txt
    <source>.c/.cpp
  CMakeLists.txt
  sdkconfig.defaults (可选)
  Kconfig.projbuild (可选)

2.2 示例代码

main/CMakeLists.txt示例:

cmake 复制代码
idf_component_register(SRCS "hello_world_main.c"
                       PRIV_REQUIRES spi_flash
                       INCLUDE_DIRS "")

2.3 添加流程

  • 复制示例项目目录。
  • 修改main目录源代码。
  • 通过idf.py menuconfig配置项目。

3. 新板卡支持

3.1 目录和文件

  • 新板卡支持放置于boards目录(需手动添加)。
  • 包含引脚定义、启动代码、板级配置文件。

3.2 配置

  • 在项目配置中选择对应板卡。
  • 编译时根据板卡配置宏选择代码。

4. 新组件添加

4.1 目录结构

  • components目录新建组件文件夹。
  • 包含CMakeLists.txtKconfig

4.2 示例代码

CMakeLists.txt示例:

cmake 复制代码
idf_component_register(SRCS "my_component.c"
                       INCLUDE_DIRS "include"
                       PRIV_REQUIRES driver esp_common)

Kconfig示例:

kconfig 复制代码
menu "My Component"
config MY_COMPONENT_ENABLE
    bool "Enable My Component"
    default y
endmenu

4.3 添加流程

  • 新建组件目录,添加代码和配置。
  • 顶层CMakeLists.txt自动递归添加组件。

5. 编译链路

5.1 起始配置文件

  • 项目根目录下的sdkconfig

5.2 编译流程

  • 顶层CMakeLists.txt加载配置,设置编译选项。
  • 递归调用组件CMakeLists.txt,注册源文件和依赖。
  • 生成目标文件和固件镜像。

5.3 代码示例

顶层CMakeLists.txt片段:

cmake 复制代码
idf_build_get_property(build_component_targets __BUILD_COMPONENT_TARGETS)

foreach(component_target ${build_component_targets})
    __component_get_property(dir ${component_target} COMPONENT_DIR)
    add_subdirectory(${dir} ${component_target})
endforeach()

5.4 编译链路流程图

6. 示例项目代码

examples/get-started/hello_world/main/hello_world_main.c示例:

c 复制代码
void app_main(void)
{
    printf("Hello world!\n");

    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU cores\n",
           CONFIG_IDF_TARGET,
           chip_info.cores);
}