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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM