zoukankan      html  css  js  c++  java
  • ESP32构建系统(CMake版)

          ESP32 芯片是一款 2.4 GHz Wi-Fi 和蓝牙双模芯片,内置 1 或 2 个 32 位处理器,运算能力最高可达 600 DMIPS。

          ESP-IDF 即乐鑫物联网开发框架,可为在 Windows、Linux 和 macOS 系统平台上开发 ESP32 应用程序提供工具链、API、组件和工作流的支持。


    概述:

          一个 ESP-IDF 项目可以看作是多个不同组件的集合,ESP-IDF 可以显式地指定和配置每个组件。在构建项目的时候,构建系统会前往 ESP-IDF 目录、项目目录和用户自定义目录(可选)中查找所有组件,允许用户通过文本菜单系统配置 ESP-IDF 项目中用到的每个组件。在所有组件配置结束后,构建系统开始编译整个项目。

    概念:

    项目:  特指一个目录,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如分区表、数据/文件系统分区和引导程序。
    项目配置:保存在项目根目录下名为 sdkconfig 的文件中,可以通过 idf.py menuconfig 进行修改,且一个项目只能包含一个项目配置。
    应用程序:是由 ESP-IDF 构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(可执行的主文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序)。
    组件:  是模块化且独立的代码,会被编译成静态库(.a 文件)并链接到应用程序。部分组件由 ESP-IDF 官方提供,其他组件则来源于其它开源项目。
    目标:  特指运行构建后应用程序的硬件设备。ESP-IDF 当前仅支持 ESP32 这一个硬件目标。

    使用构建系统:

    idf.py 命令行工具提供了一个前端,可以帮助您轻松管理项目的构建过程,它管理了以下工具:

    • CMake,配置待构建的系统
    • 命令行构建工具(Ninja 或 GNU Make)
    • esptool.py,烧录 ESP32

    idf.py常用命令:

    • idf.py --help                                           查看命令列表
    • idf.py build                                             构建项目
    • idf.py clean                                            清除构建的文件,不会删除 CMake 配置输出及其他文件。
    • idf.py fullclean                                       构建文件全部删除
    • idf.py -p com1 -b 115200 flash              通过串口1使用115200的比特率烧录代码
    • idf.py -p com1 monitor                          显示串口1输出
    • idf.py -p com1 clean flash monitor        依次清理-构建-烧录-监视串口
    • idf.py size                                              打印应用程序相关的大小信息
    • idf.py set-target esp32                           设置目标芯片
    • idf.py menuconfig                                  配置

    示例项目

     1 - myProject/
     2         - CMakeLists.txt                                 //设置全局CMake变量
     3         - sdkconfig                                      //项目配置文件
     4         - components/                                    //可选自定义组件
     5                  - component1/ 
     6                            - CMakeLists.txt              //设置自定义组件的CMake变量和项目集成
     7                            - Kconfig                     //组件配置
     8                            - src1.c
     9                  - component2/ 
    10                            - CMakeLists.txt
    11                            - Kconfig
    12                            - src1.c
    13                            - include/ - component2.h
    14         - main/                                         //特殊组件,main是默认名称
    15                   - src1.c                                                
    16                   - src2.c
    17         - build/                                        //构建输出目录

          main是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。

    项目CMakeLists文件

    1 cmake_minimum_required(VERSION 3.5)               //设置CMake版本
    2 include($ENV{IDF_PATH}/tools/cmake/project.cmake) //导入CMake其余功能来配置项目、检索组件
    3 project(myProject)                                //创建项目并指定名称

          使用 cmake 中的 set 命令 来设置的变量,即 set(VARIABLE "VALUE")。请注意,set() 命令需放在 include(...) 之前,cmake_minimum(...) 之后。

    • COMPONENT_DIRS:组件的搜索目录,默认为 ${IDF_PATH}/components、${PROJECT_PATH}/components 和 EXTRA_COMPONENT_DIRS。
    • EXTRA_COMPONENT_DIRS:用于搜索组件的其它可选目录列表。
    • COMPONENTS:要构建进项目中的组件名称列表,默认为 COMPONENT_DIRS 目录下检索到的所有组件。
    • COMPONENT_REQUIRES: 指定了它依赖的另一个组件,会自动将其添加到 COMPONENTS 中
    • COMPONENT_REQUIRES_COMMON:每个组件都需要的通用组件列表,这些通用组件会自动添加到每个组件的 COMPONENT_PRIV_REQUIRES 列表中以及项目的 COMPONENTS 列表中。

     组件CMakeLists文件

    1 set(COMPONENT_SRCS "foo.c")               //用空格分隔的源文件列表,会编译进组件库
    2 set(COMPONENT_ADD_INCLUDEDIRS "include")  //目录列表
    3 register_component()                      //将组件添加到构建系统中,构建生成与组件同名的库,并最终被链接到应用程序中。

           组件是 COMPONENT_DIRS 列表中包含 CMakeLists.txt 文件的任何目录。

           同名组件:ESP-IDF 在搜索所有待构建的组件时,会按照 COMPONENT_DIRS 指定的顺序依次进行,这意味着在默认情况下,首先搜索 ESP-IDF 内部组件,然后是项目组件,最后是 EXTRA_COMPONENT_DIRS 中的组件。如果这些目录中的两个或者多个包含具有相同名字的组件,则使用搜索到的最后一个位置的组件。这就允许将组件复制到项目目录中再修改以覆盖 ESP-IDF 组件。

           如果没有设置 COMPONENT_SRCDIRS 或 COMPONENT_SRCS,组件不会被编译成库文件,但仍可以被添加到 include 路径中,以便在编译其他组件时使用。

    • PROJECT_VER:项目版本号,如果 ${PROJECT_PATH}/version.txt 文件存在,其内容会用作 PROJECT_VER 的值。
    • COMPONENT_ADD_INCLUDEDIRS:相对于组件目录的相对路径,为被添加到所有需要该组件的其他组件的全局 include 搜索路径中。
    • COMPONENT_PRIV_INCLUDEDIRS:include目录仅仅在编译当前组件时需要,PRIV同private。
    • COMPONENT_REQUIRES: 是一个用空格分隔的组件列表,列出了当前组件依赖的其他组件。
    • COMPONENT_PRIV_REQUIRES:以空格分隔的组件列表,用于编译或链接当前组件的源文件。这些组件的头文件路径不会传递给其余需要它的组件,仅用于编译当前组件的源代码。
    • COMPONENT_SRCS:要编译进当前组件的源文件的路径,推荐使用此方法向构建系统中添加源文件。
    • COMPONENT_SRCDIRS:相对于组件目录的源文件目录路径,用于搜索源文件(*.cpp,*.c,*.S)。匹配成功的源文件会替代 COMPONENT_SRCS 中指定的源文件,进而被编译进组件。即设置 COMPONENT_SRCDIRS 会导致 COMPONENT_SRCS 会被忽略。此方法可以很容易地将源文件整体导入到组件中,但并不推荐使用。
    • COMPONENT_SRCEXCLUDE:需要从组件中剔除的源文件路径。 

          举例:

    set(COMPONENT_SRCS "test.c")              //编译的源文件路径
    set(COMPONENT_ADD_INCLUDEDIRS "include")  //所有组件包含的目录
    set(COMPONENT_PRIV_INCLUDEDIRS freertos ) //当前组件包含的目录
    set(COMPONENT_REQUIRES  freertos )        //该组件依赖的其他组件
    set(COMPONENT_PRIV_REQUIRES freertos )    //该组件依赖的其他组件,不会传递给其他组件
    register_component()                      //组件添加到构建系统中

    组件配置

        每个组件都可以包含一个 Kconfig 文件,和 CMakeLists.txt 放在同一目录下。Kconfig 文件中包含要添加到该组件配置菜单中的一些配置设置信息。运行 menuconfig 时,可以在 Component Settings 菜单栏下找到这些设置。 

    参考:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system.html

  • 相关阅读:
    [Linux] Nginx服务下统计网站的QPS
    [Go] go等待读取最后一行的数据内容
    [Go] Golang中的面向对象
    [Linux] 常见的并发模型
    [PHP] pmap可以查看进程占用内存的详细情况
    [PHP] 解决php中上传大文件的错误
    [PHP] 循环查看php-fpm的内存占用情况
    [Go] go中的goto语句跳到指定标签
    Java抽象类(Abstract Class)与接口(Interface)区别
    Java访问级别修饰符
  • 原文地址:https://www.cnblogs.com/kerwincui/p/13972856.html
Copyright © 2011-2022 走看看