mirror of
https://github.com/cesanta/mongoose.git
synced 2026-11-10 16:31:44 +00:00
Flatten mem stats
This commit is contained in:
1 parent
de037d6ef9
commit
069024b41c
17 files changed
+347
-260
No files matched your search
@@ -1,25 +1,22 @@
|
||||
THISDIR = $(realpath $(CURDIR))
|
||||
ROOTDIR = $(realpath $(CURDIR)/../../..)
|
||||
DOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) espressif/idf
|
||||
CMD ?= idf.py -DCFLAGS_EXTRA="$(CFLAGS_EXTRA)" build
|
||||
ARCH ?= esp32
|
||||
PORT ?= /dev/ttyUSB0
|
||||
|
||||
CFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN
|
||||
|
||||
all: example
|
||||
|
||||
example:
|
||||
true
|
||||
|
||||
build: Makefile $(wildcard main/*)
|
||||
$(DOCKER) $(CMD)
|
||||
test -d build || $(DOCKER) idf.py set-target $(ARCH)
|
||||
$(DOCKER) idf.py build
|
||||
|
||||
flash:
|
||||
flash: CMD = idf.py flash
|
||||
flash: DA = --device $(PORT)
|
||||
flash: build
|
||||
cd build && esptool --chip $(ARCH) --baud 460800 --port $(PORT) write-flash @flash_args
|
||||
|
||||
clean:
|
||||
test -d build && $(DOCKER) rm -rf build sdkconfig || true
|
||||
test -d build && (rm -rf build sdkconfig || true)
|
||||
|
||||
.PHONY: build
|
||||
@@ -1,3 +1,16 @@
|
||||
#define MG_ARCH MG_ARCH_ESP32
|
||||
|
||||
// Crash reports and mem usage stats
|
||||
// Make sure to add to sdkconfig.defaults the following:
|
||||
// CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y
|
||||
// CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y
|
||||
// CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=16
|
||||
// CONFIG_ESP_COREDUMP_STACK_SIZE=2048
|
||||
// CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
|
||||
#define MG_ENABLE_HEALTH 1
|
||||
|
||||
// mdash.net device management support, https://mongoose.ws/docs/guides/mdash/
|
||||
#define MG_ENABLE_MDASH 0
|
||||
#define MG_MDASH_KEY "..."
|
||||
#define MG_FIRMWARE_VERSION "esp32_min.1.0.0"
|
||||
#define MG_TLS MG_TLS_BUILTIN
|
||||
@@ -5,3 +5,5 @@ CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y
|
||||
CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y
|
||||
CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=16
|
||||
CONFIG_ESP_COREDUMP_STACK_SIZE=2048
|
||||
CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
|
||||
CONFIG_FREERTOS_USE_TRACE_FACILITY=y
|
||||
@@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include <stm32h5xx_hal.h>
|
||||
#define MG_ARCH MG_ARCH_CUBE
|
||||
#define MG_ENABLE_LFS 1
|
||||
#define MG_LFS_SIZE (128 * 1024)
|
||||
@@ -73,6 +73,7 @@ extern uint32_t SystemCoreClock;
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configHEAP_CLEAR_MEMORY_ON_FREE 0
|
||||
#define configUSE_TRACE_FACILITY 1
|
||||
#define configRECORD_STACK_HIGH_ADDRESS 1
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configUSE_MUTEXES 1
|
||||
#define configQUEUE_REGISTRY_SIZE 8
|
||||
|
||||
@@ -104,8 +104,7 @@ static void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {
|
||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||
if (mg_match(hm->uri, mg_str("/api/tick"), NULL)) {
|
||||
mg_http_reply(c, 200, "", "{%m:%lu}\n", MG_ESC("tick"), HAL_GetTick());
|
||||
} else if (mg_match(hm->uri, mg_str("/api/kill"), NULL)) {
|
||||
SCB->SHCSR &= ~SCB_SHCSR_USGFAULTENA_Msk;
|
||||
} else if (mg_match(hm->uri, mg_str("/api/crash"), NULL)) {
|
||||
__asm volatile("udf #0");
|
||||
} else {
|
||||
mg_http_reply(c, 200, "Content-Type: text/plain\r\n",
|
||||
@@ -446,6 +445,11 @@ void StartDefaultTask(void *argument)
|
||||
mg_mgr_init(&mgr);
|
||||
mg_http_listen(&mgr, "http://0.0.0.0", http_ev_handler, NULL);
|
||||
|
||||
MG_INFO(("Initialised. CPU clock: %lu MHz", SystemCoreClock / 1000000));
|
||||
MG_INFO(("Memory: %M", mg_print_mem_stats));
|
||||
MG_INFO(("Crash record: %s, %M", mg_health_valid() ? "enabled" : "disabled",
|
||||
mg_print_crash_record));
|
||||
|
||||
/* Infinite loop */
|
||||
for(;;)
|
||||
{
|
||||
|
||||
Vendored
+7
@@ -328,6 +328,13 @@ typedef struct tskTaskControlBlock /* The old naming convention is used to
|
||||
* below to enable the use of older kernel aware debuggers. */
|
||||
typedef tskTCB TCB_t;
|
||||
|
||||
#if ( configRECORD_STACK_HIGH_ADDRESS == 1 )
|
||||
_Static_assert( offsetof( TCB_t, pcTaskName ) == offsetof( StaticTask_t, ucDummy7 ),
|
||||
"StaticTask_t task-name offset must match TCB_t" );
|
||||
_Static_assert( offsetof( TCB_t, pxEndOfStack ) == offsetof( StaticTask_t, pxDummy8 ),
|
||||
"StaticTask_t stack-end offset must match TCB_t" );
|
||||
#endif
|
||||
|
||||
/*lint -save -e956 A manual analysis and inspection has been used to determine
|
||||
* which static variables must be declared volatile. */
|
||||
portDONT_DISCARD PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;
|
||||
|
||||
@@ -254,4 +254,6 @@ SECTIONS
|
||||
libgcc.a:* ( * )
|
||||
}
|
||||
|
||||
/* Retained health record. Startup code must neither copy nor clear it. */
|
||||
.mg_health (NOLOAD) : { KEEP(*(.mg_health .mg_health*)) } > RAM_D3
|
||||
}
|
||||
@@ -1,7 +1,11 @@
|
||||
#pragma once
|
||||
#define MG_ARCH MG_ARCH_CUBE
|
||||
#define MG_ENABLE_HEALTH 1
|
||||
#define MG_ENABLE_FREERTOS 1
|
||||
#define MG_ENABLE_HEALTH 1 // Mem stats and crash reports
|
||||
#define MG_ENABLE_FREERTOS 1 // Set configRECORD_STACK_HIGH_ADDRESS
|
||||
|
||||
#define MG_ENABLE_MDASH 0 // mdash.net device management service support
|
||||
#define MG_MDASH_KEY "..." // See https://mongoose.ws/docs/guides/mdash/
|
||||
#define MG_FIRMWARE_VERSION "h723_cube.1.0.0"
|
||||
|
||||
// Ethernet driver tunables:
|
||||
// #define MG_DRIVER_MDC_CR 4 // RMII MDC clock divider, from 0 to 5
|
||||
|
||||
@@ -86,22 +86,24 @@ static void MX_USART3_UART_Init(void);
|
||||
/* USER CODE BEGIN 0 */
|
||||
size_t mg_usage(int task, int metric) {
|
||||
extern void *_sbrk(ptrdiff_t incr);
|
||||
extern unsigned char _end, _sstack;
|
||||
extern unsigned char _end, _sstack, _estack;
|
||||
extern uint32_t _Min_Stack_Size;
|
||||
switch (metric) {
|
||||
case MG_USAGE_NUM_TASKS: return 1;
|
||||
case MG_USAGE_TASK_NAME: return task == 0 ? (size_t) "main" : 0;
|
||||
case MG_USAGE_STACK_TOTAL:
|
||||
return task == 0 ? (size_t) &_Min_Stack_Size : 0;
|
||||
case MG_USAGE_STACK_FREE: {
|
||||
size_t sp = (size_t) __get_MSP(), base = (size_t) &_sstack;
|
||||
return task == 0 && sp > base ? sp - base : 0;
|
||||
case MG_USAGE_STACK_USED: {
|
||||
size_t sp = (size_t) __get_MSP();
|
||||
size_t base = (size_t) &_sstack, top = (size_t) &_estack;
|
||||
if (task != 0 || sp > top) return 0;
|
||||
return top - (sp < base ? base : sp);
|
||||
}
|
||||
case MG_USAGE_HEAP_TOTAL:
|
||||
return (size_t) &_sstack - (size_t) &_end;
|
||||
case MG_USAGE_HEAP_FREE: {
|
||||
size_t heap = (size_t) _sbrk(0), limit = (size_t) &_sstack;
|
||||
return limit > heap ? limit - heap : 0;
|
||||
case MG_USAGE_HEAP_USED: {
|
||||
size_t heap = (size_t) _sbrk(0), start = (size_t) &_end;
|
||||
return heap >= start && heap <= (size_t) &_sstack ? heap - start : 0;
|
||||
}
|
||||
default: return 0;
|
||||
}
|
||||
@@ -121,8 +123,7 @@ static void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {
|
||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||
if (mg_match(hm->uri, mg_str("/api/tick"), NULL)) {
|
||||
mg_http_reply(c, 200, "", "{%m:%lu}\n", MG_ESC("tick"), HAL_GetTick());
|
||||
} else if (mg_match(hm->uri, mg_str("/api/kill"), NULL)) {
|
||||
SCB->SHCSR &= ~SCB_SHCSR_USGFAULTENA_Msk;
|
||||
} else if (mg_match(hm->uri, mg_str("/api/crash"), NULL)) {
|
||||
__asm volatile("udf #0");
|
||||
} else {
|
||||
mg_http_reply(c, 200, "", "Hi from Mongoose, tick %lu\n%M\n",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include <stm32h7xx_hal.h>
|
||||
#define MG_ARCH MG_ARCH_CUBE
|
||||
#define MG_ENABLE_HEALTH 1
|
||||
#define MG_ENABLE_CUSTOM_USAGE 1
|
||||
|
||||
@@ -6,13 +6,17 @@
|
||||
|
||||
size_t mg_usage(int task, int metric) {
|
||||
extern void *_sbrk(int incr);
|
||||
extern unsigned char _end[], _estack[];
|
||||
if (metric == MG_USAGE_NUM_TASKS) return 1;
|
||||
if (metric == MG_USAGE_TASK_NAME) return task == 0 ? (size_t) "main" : 0;
|
||||
// Heap and stack share the free gap, neither has a fixed total
|
||||
if (metric == MG_USAGE_HEAP_FREE ||
|
||||
(metric == MG_USAGE_STACK_FREE && task == 0)) {
|
||||
size_t sp = (size_t) __get_MSP(), heap = (size_t) _sbrk(0);
|
||||
return sp > heap ? sp - heap : 0;
|
||||
// Heap and stack share RAM, so neither has a fixed total.
|
||||
if (metric == MG_USAGE_HEAP_USED) {
|
||||
size_t heap = (size_t) _sbrk(0), start = (size_t) _end;
|
||||
return heap >= start && heap <= (size_t) _estack ? heap - start : 0;
|
||||
}
|
||||
if (metric == MG_USAGE_STACK_USED && task == 0) {
|
||||
size_t sp = (size_t) __get_MSP(), top = (size_t) _estack;
|
||||
return sp <= top ? top - sp : 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user