博客 / 詳情

返回

《ESP32-S3使用指南—IDF版 V1.6》第六章 初識Menuconfig

第六章 初識Menuconfig

在嵌入式開發中,系統配置的靈活性和定製化是確保硬件與軟件高效配合的關鍵。ESP32-P4提供了強大的配置工具——menuconfig,它是ESP-IDF(Espressif IoT Development Framework)中一個用於配置芯片和系統特性的圖形化界面。通過menuconfig,開發者可以輕鬆調整系統參數、啓用或禁用特定的硬件功能,並優化系統性能。本章節將詳細介紹如何使用menuconfig進行系統配置,涵蓋從基礎功能到高級選項的講解,幫助開發者充分利用ESP32-P4的硬件資源,加速開發流程。
本章將分為如下幾個小節:
6.1 項目配置簡介
6.2 項目配置菜單

6.1 項目配置簡介
Menuconfig是ESP32開發框架ESP-IDF提供的一個基於文本的配置工具,允許開發人員為他們的項目選擇硬件和軟件配置選項。它是一個基於Kconfig系統的菜單界面,用於設置項目的編譯選項、驅動程序、硬件外設配置等。
1,Menuconfig主要功能
1)硬件外設配置:開發者可以啓用或禁用各種外設,比如 UART、I2C、Wi-Fi、藍牙等。
2)系統設置:可以配置 ESP32 的 CPU 頻率、任務調度器、內存分配、低功耗模式等。
3)庫和組件管理:選擇項目需要的庫組件,比如 FATFS 文件系統、freeRTOS操作系統等。
4)網絡配置:設置 Wi-Fi、藍牙及其他網絡相關的配置。
5)調試和日誌選項:設置調試器、日誌輸出級別等。

2,Menuconfig使用方法
在ESP32-P4的開發過程中,menuconfig工具提供了兩種主要的使用方式,用於系統配置和功能定製。我們在之前的章節中已經介紹過這兩種方式,分別為命令行方式和圖形化方式:
1)命令行方式:通過命令行輸入idf.py menuconfig,可以打開menuconfig的文本界面。這種方式適用於所有支持終端操作的開發環境,無論是Windows、Linux還是macOS,開發者都可以直接通過命令行進行配置。
2)圖形化配置方式:在VS Code集成開發環境(IDE)中,開發者可以直接通過圖形界面打開menuconfig菜單進行配置。這種方式更加直觀,適合對終端不熟悉的開發者,或者需要更快的配置流程。
這兩種方式各有優勢,具體選擇哪種方式可根據開發者的習慣和項目需求。
3,Menuconfig工作原理
menuconfig基於Kconfig系統運行,它是Linux內核配置系統的一個變種。Kconfig文件定義了項目中可配置的選項,而menuconfig是其用户界面,通過它用户可以根據項目需求選擇不同的配置選項。下圖是ESP-IDF項目工程菜單配置流程。

image001

圖6.1.1 ESP-IDF項目工程菜單配置流程
從上圖中可以看出,當輸入“idf.py menuconfig”命令時,頂層的Kconfig文件會調用多個子Kconfig文件,這些文件共同構成了完整的配置選項集。通過這種層次化的配置機制,menuconfig能夠將複雜的硬件和軟件配置展現為一個直觀的圖形化配置界面,方便開發者快速瀏覽和修改配置選項。完成配置後,系統會自動生成一個名為sdkconfig的文件。這個文件在整個項目中起着至關重要的作用,它記錄了所有的配置選項,成為構建系統的重要輸入。具體來説,sdkconfig文件向構建系統提供了編譯和鏈接項目的指令。這包括啓用或禁用特定功能、選擇硬件接口、設置網絡參數等配置。CMake在構建過程中會讀取sdkconfig文件,並根據其中的選項調整整個構建過程,確保生成的固件符合開發者在menuconfig中設定的需求。通過這種方式,menuconfig不僅簡化了配置過程,還確保了構建的固件能夠精準地匹配項目需求,極大提高了開發的效率和準確性。
6.2 項目配置菜單
接下來,筆者將為大家詳細講解ESP-IDF項目工程中常用的菜單配置項,並説明每個配置項的具體作用。這些配置項為開發者提供了高度的靈活性,允許根據項目需求進行定製化配置。為了幫助大家更直觀地瞭解這些配置項的位置和分類,文中還附上了ESP-IDF項目工程的菜單目錄結構圖。通過合理調整這些配置,不僅能優化項目的開發流程,還能有效提升開發效率,使項目更貼合具體的應用場景。
首先,在VS Code中按下快捷鍵“Ctrl + Shift + P”進入所有命令行的頁面。在搜索框中輸入“Menuconfig”,然後選擇相應選項,即可進入圖形化的SDK配置編輯器界面,如下圖所示。

image003

圖6.2.1 ESP32P4項目工程菜單目錄
接下來,作者將詳細介紹上圖中標記為①、②、⑥、⑦和⑨的選項及其具體作用。對於其他分組的選項,建議讀者查閲樂鑫官方ESP-IDF編程指南中的menuconfig菜單章節,以獲取更全面和詳細的信息。這些選項的配置將有助於優化ESP-IDF項目的性能與功能。請注意,以下的截圖均來源於VS Code的菜單界面,方便大家更直觀地理解各項配置。
1, 編譯類型(Build type)
用於選擇應用程序的構建方式,如下所示。

image005

圖6.2.2 編譯類型
(1)應用編譯類型
在上圖中的“Application build type”選項中,默認情況下,應用程序將被構建為與ESP-IDF啓動加載器兼容的二進制文件格式(即“binary application + 2nd stage bootloader”)。除了應用程序本身,系統還會生成第二階段的啓動加載器。這些二進制文件可以被寫入閃存,並從閃存中加載和執行。另一種適用於非常小且功能有限的應用程序選項是僅鏈接應用程序的.elf文件(即“Build app runs entirely in RAM (EXPERIMENTAL)”選項),這樣可以通過JTAG或UART將應用程序直接加載到RAM中。由於IRAM和DRAM的容量非常有限,複雜的應用程序無法通過此方式構建。但對於一些測試和調試場景,這種方式可以加快迭代速度,因為應用程序不需要每次都寫入閃存。

(2)啓用可重現構建
“Enable reproducible build”選項啓用後,編譯過程將消除所有日期、時間和路徑信息,並自動生成.gdbinit文件,或者如果已存在該文件,系統會將新信息附加到現有文件中。這確保了每次構建的結果一致性,便於調試和版本控制。

** (3)無生成二進制庫**
“No Binary Blobs”選項啓用後,應用程序構建時將禁用二進制庫的鏈接。這意味着Wi-Fi和藍牙功能將不可用。此選項通常適用於無需這些功能的應用場景。

2,Bootloader配置(Bootloader config)
此部分用於配置啓動加載器(Bootloader)的各項設置。在嵌入式系統中,啓動加載器負責引導主應用程序的執行。啓動加載器的配置選項會直接影響系統啓動的效率和行為。Bootloader配置子菜單內容如下所示。

image007

圖6.2.3 Bootloader配置子菜單內容
(1)啓用時間/日期戳
啓用此選項後,啓動加載器會在構建時附加時間和日期戳。這對於追蹤不同版本的構建時間非常有用,尤其是在調試和版本控制過程中,可以幫助開發人員快速識別構建的時間。

(2)項目版本
此選項允許設置項目的版本號。它可以幫助開發者在不同版本的固件之間進行區分,尤其是在需要跟蹤不同版本的更新和修復時非常有用。

(3)啓動加載器優化級別
啓動加載器的優化級別決定了代碼在編譯時的優化策略:
 Size (-Os):該選項啓用後,編譯器會盡可能優化代碼的大小。它通過移除不必要的代碼和數據來縮小生成的啓動加載器鏡像大小,適用於內存資源有限的設備或項目。
 Debug (-Og):此選項針對調試進行了優化。雖然不如其他優化級別那樣注重性能或代碼大小,但它保留了調試信息,便於開發者調試啓動加載器中的問題。這是開發調試期間的推薦選擇。
 Optimize for performance (-O2):啓用此選項後,編譯器將盡可能優化代碼的執行效率。這會生成更高效的機器代碼,以提高啓動加載器的運行速度。適用於對啓動時間和性能有較高要求的應用場景。

(4)日誌
此部分配置啓動加載器的日誌功能:
 No output:選擇此選項後,啓動加載器不會輸出任何日誌信息。適用於對日誌輸出完全不需要的情況。
 Error:僅輸出錯誤信息。此級別適用於正常運行時僅監控關鍵性錯誤,減少日誌冗餘。
 Warning:輸出警告信息和錯誤信息。用於捕獲可能導致問題的非致命性事件,同時減少不必要的詳細信息。
 Info:輸出關鍵信息、警告和錯誤信息。此選項適用於希望查看系統狀態以及基本啓動信息的場景。
 Debug:輸出調試信息、信息、警告和錯誤。適用於開發和調試階段,幫助開發者更詳細地跟蹤啓動過程中的各類事件。
 Verbose:輸出所有類型的日誌,包括詳細的調試信息。這是最詳細的日誌級別,適用於需要完整日誌記錄的調試場景。

(5)和(6)日記消息輸出的顏色格式和時間戳格式
選擇日誌的輸出格式。常見選項包括彩色(Color)輸出,使得日誌在終端中更容易閲讀。也可以選擇顯示時間戳,默認選項是顯示自系統啓動以來的毫秒數(Milliseconds Since Boot)。這對於瞭解各個啓動階段的時序和性能分析非常有幫助。

3,串行Flash配置(Serial flasher config)
配置了與ESP32啓動、SPI Flash、RTC看門狗等功能相關的啓動行為,如下圖所示。

image009

圖6.2.4 串行Flash子菜單配置項
(1)強制第二階段啓動加載器以DOUT模式加載,並通過重置Flash恢復Dummy Cycle設置。此選項有助於支持更高的SPI頻率,但需要謹慎配置。
(2)啓用對XMC品牌Flash芯片的支持,按照XMC推薦的啓動流程操作。關閉此選項將禁止使用XMC芯片,除非非常確定,建議不要禁用此選項。
(3)允許通過特定GPIO引腳觸發設備恢復出廠設置。這通常用於清除一個或多個數據分區,並從“工廠”分區啓動。
(4)允許通過GPIO引腳觸發設備從測試應用程序分區啓動。此選項可用於調試期間快速切換到測試分區。
(5)啓用對未映射內存區域的保護,以防止對這些區域的無意訪問。這會觸發異常,有助於提升系統安全性。
(6)啓用RTC看門狗以監控啓動代碼的執行時間,防止由於啓動代碼執行過長而導致系統鎖定或重啓。
(7)允許用户禁用RTC看門狗。默認情況下,ESP-IDF會在調用app_main()前禁用看門狗。
(8)設置RTC看門狗的超時時間,默認值為9000毫秒。超時後看門狗將重啓系統。
(9)啓用應用程序回滾支持。當更新後的應用首次啓動時,如果應用被確認不可用,則會回滾到之前的工作版本。
(10)在從深度睡眠模式退出時跳過固件鏡像的驗證。此選項可以加快喚醒速度,但需要謹慎使用,尤其是結合OTA更新時。
(11)啓用此選項後,上電覆位時將跳過固件鏡像驗證。這可以加快啓動速度,但存在潛在的閃存損壞風險。
(12)始終跳過固件鏡像驗證,可能導致應用程序的閃存損壞後設備無法啓動。此選項通常不建議啓用。
(13)此選項允許保留RTC FAST內存用於自定義用途。這部分內存在重啓時依然有效(但不包括斷電)。

4,分區表配置(Partition Table)
ESP32上分區表的配置,它主要定義了應用程序、數據和其他資源在閃存中的存儲位置,該子菜單內容如下圖所示。

image011

圖6.2.5 分區表子菜單配置項
(1)分區表的類型
這些術語的理解非常準確。
①:“Single factory app, no OTA”:意味着設備上只有一個分區預裝的應用程序,不支持後續的OTA(Over-The-Air)遠程更新。該應用程序是唯一的,不能通過無線方式進行更新。
②:“Factory app, two OTA definitions”:意味着設備除了分區預裝的應用程序外,還預留了兩個分區用於OTA更新。這允許設備在運行時通過無線更新應用程序,兩次OTA更新可以輪流進行,確保即使更新失敗也有可用的應用程序。
③:“Two large size OTA partitions”:表示設備上有兩個較大的分區,用於存放OTA更新的應用程序鏡像。這允許設備在更新時將新的應用程序放入其中一個分區,而當前分區仍運行舊版本應用程序,從而實現無縫更新。
④:“Custom partition table CSV”:指的是自定義的分區表,以CSV文件格式定義分區的佈局。這種表格通常用於指定設備存儲資源的分配,比如哪些區域用來存放應用程序、哪些用於OTA、哪些用於用户數據等。和安卓設備的分區表類似,在嵌入式設備中,這種自定義表格能夠靈活地定義存儲的用途和大小。
(2)指定自定義分區表CSV文件的文件名。
(3)指定分區表的存儲地址(默認0x8000)。
此選項允許調整分區表的位置,通常為啓動加載器騰出更多空間。注意,啓動加載器和應用程序都必須使用相同的PARTITION_TABLE_OFFSET值編譯。此外,分區表CSV文件中的分區偏移量可能需要調整,以適應更高的分區表偏移值。如果希望每個分區偏移量自動適應配置的分區表偏移,請在CSV文件中將分區偏移留空。
(4)啓用後,將為分區表生成MD5校驗和,用於保護分區表的完整性。
對於不能識別分區表中MD5校驗和的舊啓動加載器,應關閉該選項。

5,核心組件配置(Component config)
由於核心組件的配置選項過多,難以一一理解,為了幫助讀者更好地使用這個子菜單,筆者對核心組件配置做了一次小總結,方便讀者理解。ESP-IDF(Espressif IoT Development Framework)中組件配置涵蓋了多種硬件驅動、庫以及應用層功能。通過分析它們的共性,可以總結如下:

1)ISR 和 IRAM 的優化
①:ISR(中斷服務程序)相關優化:多個配置項提到將中斷服務程序(ISR)放入IRAM(內部RAM),這可以提高中斷處理的響應速度,避免中斷代碼在外部閃存中運行導致延遲。常見於驅動:MCPWM、TWAI、GPTimer、I2C、I2S、GPIO等
②:IRAM-Safe:有些驅動明確標識了“IRAM-Safe”的功能,這意味着該功能或中斷處理被優化為可以安全地在IRAM中執行。

2)調試日誌支持
多個驅動程序提供了調試日誌選項,允許開發者在開發和調試過程中輸出詳細的日誌信息,以便更好地定位問題。例如:MCPWM、I2C、I2S、GPIO等驅動都有啓用調試日誌的選項。

3)對舊驅動的支持及棄用警告
多箇舊版驅動,如ADC、MCPWM、Timer Group、I2S等,仍然提供配置選項,允許開發者繼續使用舊版驅動程序,同時提供了抑制棄用警告的選項(Suppress legacy driver deprecated warning),用於消除編譯過程中關於舊驅動棄用的提示。
其他的配置項請參考各個配置項描述的信息。筆者建議讀者在開發過程中,深入瞭解這些配置項,針對需要的配置進行具體研究和應用。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.