diff --git a/src/helpers/bridges/MQTTBridge.cpp b/src/helpers/bridges/MQTTBridge.cpp index e43ee162..a57fc661 100644 --- a/src/helpers/bridges/MQTTBridge.cpp +++ b/src/helpers/bridges/MQTTBridge.cpp @@ -1665,8 +1665,12 @@ void MQTTBridge::publishStatusToSlot(int index) { // Reuse pre-allocated buffer to avoid heap alloc/free churn under memory pressure. // _status_json_buffer and _last_raw_data are both Core 0-owned; no mutex needed. + #if defined(BOARD_HAS_PSRAM) char fallback_status_buffer[STATUS_JSON_BUFFER_SIZE]; char* json_buffer = (_status_json_buffer != nullptr) ? _status_json_buffer : fallback_status_buffer; + #else + char* json_buffer = _status_json_buffer; + #endif char origin_id[65]; char timestamp[32]; @@ -2356,8 +2360,12 @@ bool MQTTBridge::publishStatus() { // Reuse pre-allocated buffer to avoid heap alloc/free churn under memory pressure. // _status_json_buffer and _last_raw_data are both Core 0-owned; no mutex needed. + #if defined(BOARD_HAS_PSRAM) char fallback_status_buffer[STATUS_JSON_BUFFER_SIZE]; char* json_buffer = (_status_json_buffer != nullptr) ? _status_json_buffer : fallback_status_buffer; + #else + char* json_buffer = _status_json_buffer; + #endif char origin_id[65]; char timestamp[32]; char radio_info[64]; @@ -2475,7 +2483,8 @@ bool MQTTBridge::publishPacket(mesh::Packet* packet, bool is_tx, } #endif - // Use pre-allocated buffer; fallback to single stack buffer if not available + // Use pre-allocated buffer; stack fallback only when PSRAM heap alloc may be null. +#if defined(BOARD_HAS_PSRAM) char json_buffer_stack[PUBLISH_JSON_BUFFER_SIZE]; char* active_buffer; size_t active_buffer_size; @@ -2486,6 +2495,10 @@ bool MQTTBridge::publishPacket(mesh::Packet* packet, bool is_tx, active_buffer = json_buffer_stack; active_buffer_size = PUBLISH_JSON_BUFFER_SIZE; } +#else + char* active_buffer = _publish_json_buffer; + const size_t active_buffer_size = PUBLISH_JSON_BUFFER_SIZE; +#endif char origin_id[65]; strncpy(origin_id, _device_id, sizeof(origin_id) - 1); @@ -2552,7 +2565,7 @@ bool MQTTBridge::publishRaw(mesh::Packet* packet) { refreshOriginFromPrefs(); - // Use pre-allocated buffer; fallback to single stack buffer if not available +#if defined(BOARD_HAS_PSRAM) char json_buffer_stack[PUBLISH_JSON_BUFFER_SIZE]; char* active_buffer; size_t active_buffer_size; @@ -2563,6 +2576,10 @@ bool MQTTBridge::publishRaw(mesh::Packet* packet) { active_buffer = json_buffer_stack; active_buffer_size = PUBLISH_JSON_BUFFER_SIZE; } +#else + char* active_buffer = _publish_json_buffer; + const size_t active_buffer_size = PUBLISH_JSON_BUFFER_SIZE; +#endif char origin_id[65]; strncpy(origin_id, _device_id, sizeof(origin_id) - 1); diff --git a/src/helpers/bridges/MQTTBridge.h b/src/helpers/bridges/MQTTBridge.h index e633e1de..e67ee656 100644 --- a/src/helpers/bridges/MQTTBridge.h +++ b/src/helpers/bridges/MQTTBridge.h @@ -223,7 +223,7 @@ private: char _status_json_buffer[STATUS_JSON_BUFFER_SIZE]; #endif - // JSON document scratch space — inline StaticJsonDocument keeps the pool off the 8 KB MQTT + // JSON document scratch space — inline StaticJsonDocument keeps the pool off the MQTT // task stack and eliminates two separate heap allocations (fragmentation reduction). StaticJsonDocument _packet_json_doc; StaticJsonDocument _status_json_doc; diff --git a/variants/lilygo_tlora_v2_1/platformio.ini b/variants/lilygo_tlora_v2_1/platformio.ini index 796dbe5c..81603ead 100644 --- a/variants/lilygo_tlora_v2_1/platformio.ini +++ b/variants/lilygo_tlora_v2_1/platformio.ini @@ -155,6 +155,8 @@ build_flags = -D WITH_MQTT_BRIDGE=1 -D MAX_MQTT_BROKERS=3 -D MQTT_MAX_PACKET_SIZE=1024 + -D MQTT_TASK_STACK_SIZE=16384 + -D ESP32_CPU_FREQ=240 ; -D MQTT_DEBUG=1 ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 @@ -197,6 +199,8 @@ build_flags = -D WITH_MQTT_BRIDGE=1 -D MAX_MQTT_BROKERS=3 -D MQTT_MAX_PACKET_SIZE=1024 + -D MQTT_TASK_STACK_SIZE=16384 + -D ESP32_CPU_FREQ=240 -D MQTT_DEBUG=1 ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1