mirror of
https://github.com/mikecarper/MeshCore.git
synced 2026-09-13 13:05:37 +00:00
Move large repeater tables off classic ESP32 static DRAM
Classic ESP32 links into a dram0_0_seg of only 124,580 bytes: memory.ld carves the BT controller's 0xdb5c (56,156) reservation off the 0x2c200 window before the application gets any. Three large objects dominated what was left, and Tbeam_SX1262_repeater_observer_mqtt overran the build's 8 KiB static reserve by 4,744 bytes. Heap-allocate them instead, each with a defined behaviour when the allocation fails: - OtaContext: generalize the Companion's borrowed-storage path behind OTA_DYNAMIC_CONTEXT and add OTA_HEAP_CONTEXT, which allocates the context on first use and frees it once no transfer, apply or folder link needs it. A repeater is idle nearly all the time, so the workspace is usually absent. Exhaustion is reported to the caller and the operation declines. - ClientACL: the client table becomes a pointer with a live capacity; capacity 0 refuses new clients rather than writing through a null table. - MyMesh flood packet filters: likewise, with flood_packet_filter_slots as the live bound for every rule loop. At capacity 0 the node forwards unfiltered, and both save paths refuse to write so a stored ruleset is never replaced by an empty file. Also override the Arduino SDK's weak btInUse() in simple_repeater so initArduino() releases the BT controller memory to the heap. That grows the runtime heap these tables now come from; it cannot recover the same reservation from the linker's static window. Static DRAM, classic ESP32: Heltec_v2_repeater 108,332 -> 70,732 Tbeam_SX1262_repeater_observer_mqtt 121,132 -> 83,532 (was failing)
This commit is contained in:
@@ -24,6 +24,19 @@
|
||||
#include <helpers/nrf52/EthernetCLI.h>
|
||||
#endif
|
||||
|
||||
#if defined(ESP32) && defined(CONFIG_BT_ENABLED) && !defined(BLE_PIN_CODE)
|
||||
// A repeater has no Bluetooth transport, but the Arduino SDK is built with the
|
||||
// BT controller enabled, so its memory stays reserved unless the application
|
||||
// says otherwise. initArduino() calls esp_bt_controller_mem_release() when
|
||||
// this weak hook returns false, handing that region to the heap. Note this
|
||||
// only grows the *runtime heap*: the same reservation is also carved out of
|
||||
// the linker's dram0_0_seg (0xdb5c on classic ESP32), and no runtime call can
|
||||
// give those static bytes back. It is what makes the heap-allocated tables
|
||||
// above comfortable, not a substitute for them.
|
||||
extern "C" bool btInUse();
|
||||
extern "C" bool btInUse() { return false; }
|
||||
#endif
|
||||
|
||||
StdRNG fast_rng;
|
||||
#if MAX_RECENT_REPEATERS > 0
|
||||
#if defined(ESP32)
|
||||
|
||||
Reference in New Issue
Block a user