diff --git a/platform/mbed_stats.c b/platform/mbed_stats.c new file mode 100644 index 0000000000..533ae08805 --- /dev/null +++ b/platform/mbed_stats.c @@ -0,0 +1,37 @@ +#include "mbed_stats.h" +#include + +#if MBED_CONF_RTOS_PRESENT +#include "cmsis_os.h" +#endif + +// note: mbed_stats_heap_get defined in mbed_alloc_wrappers.cpp + +void mbed_stats_stack_get(mbed_stats_stack_t *stats) +{ + memset(stats, 0, sizeof(mbed_stats_stack_t)); + +#if MBED_STACK_STATS_ENABLED && MBED_CONF_RTOS_PRESENT + osThreadEnumId enumid = _osThreadsEnumStart(); + osThreadId threadid; + + while ((threadid = _osThreadEnumNext(enumid))) { + osEvent e; + + e = _osThreadGetInfo(threadid, osThreadInfoStackMax); + if (e.status == osOK) { + stats->max_size += (uint32_t)e.value.p; + } + + e = _osThreadGetInfo(threadid, osThreadInfoStackSize); + if (e.status == osOK) { + stats->reserved_size += (uint32_t)e.value.p; + } + + stats->stack_cnt += 1; + } +#elif MBED_STACK_STATS_ENABLED +#warning Stack statistics are not supported without the rtos. +#endif +} + diff --git a/platform/mbed_stats.h b/platform/mbed_stats.h index c9f4765550..b5eac88c23 100644 --- a/platform/mbed_stats.h +++ b/platform/mbed_stats.h @@ -18,6 +18,7 @@ */ #ifndef MBED_STATS_H #define MBED_STATS_H +#include #ifdef __cplusplus extern "C" { @@ -36,6 +37,17 @@ typedef struct { */ void mbed_stats_heap_get(mbed_stats_heap_t *stats); +typedef struct { + uint32_t max_size; /**< Sum of the maximum number of bytes used in each stack. */ + uint32_t reserved_size; /**< Current number of bytes allocated for all stacks. */ + uint32_t stack_cnt; /**< Number of stacks currently allocated. */ +} mbed_stats_stack_t; + +/** + * Fill the passed in structure with stack stats. + */ +void mbed_stats_stack_get(mbed_stats_stack_t *stats); + #ifdef __cplusplus } #endif