diff --git a/cpu/esp32/include/cpu_conf.h b/cpu/esp32/include/cpu_conf.h index 3d04a391c7..2668bf7fec 100644 --- a/cpu/esp32/include/cpu_conf.h +++ b/cpu/esp32/include/cpu_conf.h @@ -31,6 +31,11 @@ extern "C" { #endif +/** + * @brief Declare the heap_stats function as available + */ +#define HAVE_HEAP_STATS + /** * @name Stack size configuration * @{ diff --git a/cpu/esp32/syscalls.c b/cpu/esp32/syscalls.c index 4691564b83..fa2e5cef65 100644 --- a/cpu/esp32/syscalls.c +++ b/cpu/esp32/syscalls.c @@ -60,6 +60,9 @@ #ifdef MODULE_ESP_IDF_HEAP #include "heap/esp_heap_caps.h" +#include "heap/include/multi_heap.h" +#else +#include "malloc.h" #endif #define MHZ 1000000UL @@ -218,6 +221,24 @@ void* IRAM_ATTR __wrap__calloc_r(struct _reent *r, size_t count, size_t size) return result; } +unsigned int IRAM get_free_heap_size (void) +{ + return heap_caps_get_free_size( MALLOC_CAP_DEFAULT ); +} + +void heap_stats(void) +{ + multi_heap_info_t hinfo; + + heap_caps_get_info(&hinfo, MALLOC_CAP_DEFAULT); + + size_t _free = hinfo.total_free_bytes; + size_t _alloc = hinfo.total_allocated_bytes; + + _free + _alloc, _alloc, _free); + ets_printf("heap: %u (used %u free %u) [bytes]\n", +} + #else /* MODULE_ESP_IDF_HEAP */ /* for compatibiliy with ESP-IDF heap functions */ @@ -242,21 +263,24 @@ extern uint8_t _eheap; /* end of heap (defined in esp32.common.ld) */ extern uint8_t _sheap; /* start of heap (defined in esp32.common.ld) */ extern uint8_t *heap_top; /* current top of heap as defined in newlib_syscalls_default */ -#endif /* MODULE_ESP_IDF_HEAP */ - unsigned int IRAM get_free_heap_size (void) { - #if MODULE_ESP_IDF_HEAP - return heap_caps_get_free_size( MALLOC_CAP_DEFAULT ); - #else - return &_eheap - ((heap_top) ? heap_top : &_sheap); - #endif + struct mallinfo minfo = mallinfo(); + return &_eheap - &_sheap - minfo.uordblks; } +void heap_stats(void) +{ + &_eheap - &_sheap, &_eheap - &_sheap - get_free_heap_size(), + ets_printf("heap: %u (used %u free %u)\n", + get_free_heap_size()); +} + +#endif /* MODULE_ESP_IDF_HEAP */ + /* alias for compatibility with espressif/wifi_libs */ uint32_t esp_get_free_heap_size( void ) __attribute__((alias("get_free_heap_size"))); - /** * @name Other system functions */