diff --git a/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.cmake b/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.cmake index ac60dc8630929..9da09fc081eec 100644 --- a/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.cmake +++ b/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.cmake @@ -1,4 +1,4 @@ set(SDKCONFIG_DEFAULTS boards/sdkconfig.base - boards/sdkconfig.ble + boards/ESP32_GENERIC/sdkconfig.optimize ) diff --git a/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.h b/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.h index 7171a84bb3c7b..1d75fe8a9f6c2 100644 --- a/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.h +++ b/ports/esp32/boards/ESP32_GENERIC/mpconfigboard.h @@ -8,3 +8,10 @@ #ifndef MICROPY_HW_MCU_NAME #define MICROPY_HW_MCU_NAME "ESP32" #endif + +// 禁用藍牙以節省記憶體和韌體空間 +#define MICROPY_PY_BLUETOOTH (0) + +// Python heap 設為 80KB,保留更多記憶體給 WiFi/MQTT +// 180KB 可用記憶體對 Python 應用已經足夠 +#define MICROPY_GC_INITIAL_HEAP_SIZE (80 * 1024) diff --git a/ports/esp32/boards/ESP32_GENERIC/sdkconfig.optimize b/ports/esp32/boards/ESP32_GENERIC/sdkconfig.optimize new file mode 100644 index 0000000000000..8f04fb347858c --- /dev/null +++ b/ports/esp32/boards/ESP32_GENERIC/sdkconfig.optimize @@ -0,0 +1,97 @@ +# ESP32 韌體優化設定 +# 目標:禁用藍牙、最大化 WiFi 和 MQTT 性能與穩定性 + +# ============================================ +# 禁用藍牙功能(釋放約 30-40KB RAM) +# ============================================ +CONFIG_BT_ENABLED=n +CONFIG_BT_NIMBLE_ENABLED=n +CONFIG_BT_CONTROLLER_ENABLED=n +CONFIG_BT_BLUEDROID_ENABLED=n + +# ============================================ +# WiFi 性能優化(優先考慮穩定性) +# ============================================ +# 大幅增加 WiFi 緩衝區以提供最佳穩定性 +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=64 +CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=64 + +# WiFi RX 緩衝區最大長度 +CONFIG_ESP_WIFI_RX_BA_WIN=16 + +# 啟用 WiFi AMPDU(提高吞吐量) +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y + +# WiFi NVS 支援 +CONFIG_ESP_WIFI_NVS_ENABLED=y + +# ============================================ +# TCP/IP 協議堆疊優化(針對 MQTT) +# ============================================ +# 增加 TCP/IP 任務堆疊大小 +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 + +# 最大化接收郵箱大小(確保不丟包) +CONFIG_LWIP_TCP_RECVMBOX_SIZE=32 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=32 + +# 大幅增加 TCP 發送/接收窗口 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=16384 +CONFIG_LWIP_TCP_WND_DEFAULT=16384 + +# TCP MSS 設定 +CONFIG_LWIP_TCP_MSS=1440 + +# TCP 段重傳超時設定(更積極) +CONFIG_LWIP_TCP_TMR_INTERVAL=250 + +# ============================================ +# MQTT 長連接優化 +# ============================================ +# 啟用 TCP 保活機制(對 MQTT 很關鍵) +CONFIG_LWIP_TCP_KEEPALIVE_DEFAULT=y + +# TCP 保活參數(適合 MQTT) +CONFIG_LWIP_TCP_KEEPIDLE_DEFAULT=7200 +CONFIG_LWIP_TCP_KEEPINTVL_DEFAULT=75 +CONFIG_LWIP_TCP_KEEPCNT_DEFAULT=9 + +# 增加並發 TCP 連接數 +CONFIG_LWIP_MAX_ACTIVE_TCP=16 + +# 增加監聽連接數 +CONFIG_LWIP_MAX_LISTENING_TCP=16 + +# ============================================ +# Socket 選項優化 +# ============================================ +# 啟用 SO_REUSEADDR(快速重連) +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y + +# 啟用 SO_RCVBUF(接收緩衝控制) +CONFIG_LWIP_SO_RCVBUF=y + +# ============================================ +# 記憶體管理 +# ============================================ +# 增加 LWIP 記憶體池 +CONFIG_LWIP_MEM_ALLOC_MODE_INTERNAL=y + +# DNS 快取大小 +CONFIG_LWIP_DNS_MAX_SERVERS=3 + +# ============================================ +# 網路效能調整 +# ============================================ +# 啟用 IP 轉發(如果需要) +# CONFIG_LWIP_IP_FORWARD=n + +# 網路緩衝區數量 +CONFIG_LWIP_MAX_SOCKETS=16 + +# DHCP 選項 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=3 diff --git a/ports/esp32/boards/ESP32_GENERIC_S3/mpconfigboard.h b/ports/esp32/boards/ESP32_GENERIC_S3/mpconfigboard.h index c714fe2c227f3..d70c9255da4b7 100644 --- a/ports/esp32/boards/ESP32_GENERIC_S3/mpconfigboard.h +++ b/ports/esp32/boards/ESP32_GENERIC_S3/mpconfigboard.h @@ -9,3 +9,6 @@ #define MICROPY_HW_I2C0_SCL (9) #define MICROPY_HW_I2C0_SDA (8) + +// Disable I2C target mode due to ESP-IDF v5.3.1 API incompatibility +#define MICROPY_PY_MACHINE_I2C_TARGET (0) diff --git a/ports/esp32/lockfiles/dependencies.lock.esp32 b/ports/esp32/lockfiles/dependencies.lock.esp32 index 71eccf03201bc..f1f2b34e4de3f 100644 --- a/ports/esp32/lockfiles/dependencies.lock.esp32 +++ b/ports/esp32/lockfiles/dependencies.lock.esp32 @@ -25,7 +25,7 @@ dependencies: idf: source: type: idf - version: 5.5.1 + version: 5.3.1 direct_dependencies: - espressif/lan867x - espressif/mdns diff --git a/ports/esp32/lockfiles/dependencies.lock.esp32s3 b/ports/esp32/lockfiles/dependencies.lock.esp32s3 index 38c17f5d6252a..7ec41743ed2f7 100644 --- a/ports/esp32/lockfiles/dependencies.lock.esp32s3 +++ b/ports/esp32/lockfiles/dependencies.lock.esp32s3 @@ -40,7 +40,7 @@ dependencies: idf: source: type: idf - version: 5.5.1 + version: 5.3.1 direct_dependencies: - espressif/esp_tinyusb - espressif/mdns diff --git a/ports/esp32/machine_timer.c b/ports/esp32/machine_timer.c index ea9ce5469b0b7..a6016ebf03db4 100644 --- a/ports/esp32/machine_timer.c +++ b/ports/esp32/machine_timer.c @@ -180,7 +180,7 @@ void machine_timer_enable(machine_timer_obj_t *self) { } timer_ll_enable_counter(self->hal_context.dev, self->index, false); - esp_clk_tree_enable_src(TIMER_CLK_SRC, true); + // esp_clk_tree_enable_src(TIMER_CLK_SRC, true); // 在 ESP-IDF 5.3.1 中此函數不可用,時鐘源由 LL 層管理 #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0) timer_ll_set_clock_source(self->hal_context.dev, self->index, TIMER_CLK_SRC); timer_ll_enable_clock(self->hal_context.dev, self->index, true);