mirror of
https://github.com/meshtastic/firmware.git
synced 2026-08-02 03:19:26 -04:00
Since #10967 made Router::sendLocal handle self-addressed packets synchronously, the entire phone-API chain for a BLE client runs inline in the Bluefruit characteristic write callback: toRadioWriteCb -> PhoneAPI::handleToRadio -> admin set-config -> radio reconfigure -> NodeDB::saveToDisk. That callback executes on the Bluefruit BLE FreeRTOS task, whose stock stack is 5 KB (CFG_BLE_TASK_STACKSIZE = 256*5 words) - not the Arduino loop task that #10944 already raised to 8 KB. The loop-task fix therefore protects the wrong task for BLE-originated writes. On a Seeed Wio Tracker L1 the 5 KB stack overflows during pairing first-sync, resetting the device mid-LittleFS-write, every single time. Repeated mid-write resets tear the LittleFS metadata, lfs_assert fires on the next boot, and the corruption handler formats the whole filesystem: region, channels, module config, and the node's keypair are all lost (critical fault #13, new node identity on next region set). Reproduced end-to-end tonight on stock develop 6908d27; with this change the same device pairs, serves config screens, and survives back-to-back config.proto saves over BLE. Raise the BLE task to the same 2048 words (8 KB) as LOOP_STACK_SZ, for the same reason. bluefruit.cpp's #ifndef guard makes the -D take effect with no framework patch. Costs 3 KB of RAM on nrf52840 targets only. Credit where due: Ixitxachitl independently established in #11155 testing that the save-path crash persists after #11185 and that re-queueing sendLocal (moving the pipeline back to the Router thread) makes it go away - which corroborates this diagnosis from the other direction. This commit is the minimal capacity-side fix; #11155's relocation of the pipeline off the BLE task remains the right architectural follow-up, and this guard stays correct even after it lands. Likely also explains #10905 (L1 display-thread crash when a client requests full configuration) and the 2.8 field reports of idle nodes losing region and keys after a BLE session.
74 lines
3.6 KiB
INI
74 lines
3.6 KiB
INI
[nrf52_base]
|
|
; Instead of the standard nordicnrf52 platform, we use our fork which has our added variant files
|
|
platform =
|
|
# renovate: datasource=custom.pio depName=platformio/nordicnrf52 packageName=platformio/platform/nordicnrf52
|
|
platformio/nordicnrf52@10.12.0
|
|
extends = arduino_base
|
|
platform_packages =
|
|
; our custom Git version with C++17 support in platform.txt
|
|
# renovate: datasource=git-refs depName=meshtastic/Adafruit_nRF52_Arduino packageName=https://github.com/meshtastic/Adafruit_nRF52_Arduino gitBranch=master
|
|
platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#0fd295f13203e93df19d578073646ec32f2bf45a
|
|
; Don't renovate toolchain-gccarmnoneeabi
|
|
platformio/toolchain-gccarmnoneeabi@~1.90301.0
|
|
|
|
extra_scripts =
|
|
${env.extra_scripts}
|
|
extra_scripts/nrf52_extra.py
|
|
pre:extra_scripts/nrf52_lto.py
|
|
extra_scripts/nrf52_warm_region.py ; post-link guard: image must end below the 12 KB warm-store raw-flash region at 0xEA000-0xED000
|
|
|
|
build_type = release
|
|
build_flags =
|
|
-include variants/nrf52840/cpp_overrides/lfs_util.h
|
|
${arduino_base.build_flags}
|
|
-Wno-unused-variable
|
|
-Isrc/platform/nrf52
|
|
; The Arduino loop task runs the entire cooperative OSThread scheduler; the core's stock
|
|
; 4 KB (1024-word) stack overflows during BLE first-sync (admin config-apply -> radio
|
|
; reconfigure with XEdDSA/satmap/log frames stacked) - SWD-proven on T1000-E: SP driven
|
|
; 40 B below pxStack, corrupting adjacent heap -> silent HardFault reset on phone pairing.
|
|
; 2048 words = 8 KB, validated on hardware. Value is in WORDS; requires the #ifndef guard
|
|
; from meshtastic/Adafruit_nRF52_Arduino#7 (harmless redefinition warning until it merges).
|
|
-DLOOP_STACK_SZ=2048
|
|
; The Bluefruit BLE task runs the ENTIRE phone-API chain inline (toRadioWriteCb ->
|
|
; handleToRadio -> admin set-config -> radio reconfigure -> LittleFS save): its stock
|
|
; 5 KB (1280-word) stack overflows during pairing/first-sync, resetting mid-flash-write
|
|
; and tearing LittleFS (auto-format -> total config/key wipe, critical fault #13).
|
|
; Reproduced on Wio Tracker L1 @ develop 6908d27. Same rationale as LOOP_STACK_SZ above;
|
|
; bluefruit.cpp's #ifndef guard makes the -D take effect without a framework patch.
|
|
-DCFG_BLE_TASK_STACKSIZE=2048
|
|
-DLFS_NO_ASSERT ; Disable LFS assertions , see https://github.com/meshtastic/firmware/pull/3818
|
|
-DMESHTASTIC_EXCLUDE_AUDIO=1
|
|
-DMESHTASTIC_EXCLUDE_PAXCOUNTER=1
|
|
-DMESHTASTIC_EXCLUDE_PKT_HISTORY_HASH=1 ; drop PacketHistory's 1 KB hash index; O(n) over ~240 records is negligible at LoRa packet rates
|
|
-DOLEDDISPLAY_REDUCE_MEMORY ; drop the ThingPulse OLED back buffer (~1 KB); TFT variants must -U this (TFTDisplay.cpp needs buffer_back)
|
|
-Os
|
|
-std=gnu++17
|
|
-flto ; whole-image LTO (~-60KB) on every nrf52840 target; nrf52_lto.py (pre: extra_script) keeps the interrupt handlers out of LTO so they survive
|
|
-fmerge-all-constants ; fold identical constants image-wide (~0.7KB; same flag stm32 uses)
|
|
build_unflags =
|
|
-Ofast
|
|
-Og
|
|
-ggdb3
|
|
-ggdb2
|
|
-g3
|
|
-g2
|
|
-g
|
|
-g1
|
|
-g0
|
|
-std=c++11
|
|
-std=gnu++11
|
|
|
|
build_src_filter =
|
|
${arduino_base.build_src_filter} +<platform/nrf52/> -<nimble/> -<mesh/wifi/> -<mesh/api/> -<mesh/http/> -<modules/esp32> -<mesh/eth/> -<mesh/raspihttp> -<serialization/>
|
|
|
|
lib_deps=
|
|
${arduino_base.lib_deps}
|
|
${radiolib_base.lib_deps}
|
|
# renovate: datasource=git-refs depName=meshtastic/Crypto packageName=https://github.com/meshtastic/Crypto gitBranch=main
|
|
https://github.com/meshtastic/Crypto/archive/591ff9a690e8168ccb7a36abde8d7783e448d395.zip
|
|
|
|
lib_ignore =
|
|
BluetoothOTA
|
|
lvgl
|