fix(diag): report real heap/stack stats on ESP32, not just nRF52

DeviceDiag::getHeapStats()/getStackFreeBytes() only had an implementation
for NRF52_PLATFORM; every other platform fell through to the 0/0 stub, so
Diagnostics > Live showed "N/A" for Heap free and Stack free on ESP32
boards (Heltec v3/v4) -- exactly the boards where that number is most
useful to see. Added an ESP32 branch using heap_caps_get_free_size()/
heap_caps_get_total_size() (MALLOC_CAP_8BIT, matching the general-purpose
heap `new`/malloc() actually draw from) and the same
uxTaskGetStackHighWaterMark() call nRF52 already uses, since Arduino-ESP32
runs on FreeRTOS too.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-09-02 09:02:53 +02:00
co-authored by Claude Sonnet 5
parent 300f5fab0b
commit 19b8d96ffe
+19
View File
@@ -24,6 +24,25 @@ uint32_t DeviceDiag::getStackFreeBytes() {
return (uint32_t)uxTaskGetStackHighWaterMark(NULL) * sizeof(StackType_t);
}
#elif defined(ESP32)
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_heap_caps.h>
// MALLOC_CAP_8BIT: the general-purpose byte-addressable heap (what `new`/
// malloc() actually draw from) -- excludes DMA-only/IRAM regions a plain
// allocation could never land in, so this matches what's really available to
// the rest of the firmware rather than overstating it with capability pools
// nothing here can use.
void DeviceDiag::getHeapStats(uint32_t& free_bytes, uint32_t& total_bytes) {
free_bytes = (uint32_t)heap_caps_get_free_size(MALLOC_CAP_8BIT);
total_bytes = (uint32_t)heap_caps_get_total_size(MALLOC_CAP_8BIT);
}
uint32_t DeviceDiag::getStackFreeBytes() {
return (uint32_t)uxTaskGetStackHighWaterMark(NULL) * sizeof(StackType_t);
}
#else
void DeviceDiag::getHeapStats(uint32_t& free_bytes, uint32_t& total_bytes) {