diff --git a/Makefile b/Makefile index a35e8da9..69990ad4 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,10 @@ ifeq ($(MACHINE),) else CC_FLAGS += -DMACHINE_$(MACHINE) endif +# Health instrumentation and the "health" console command: HEALTH=1 gmake ... +ifneq ($(HEALTH),) + CC_FLAGS += -DHEALTH +endif ifeq ($(CI),1) CC_FLAGS += --Werror diff --git a/cmd_parser.c b/cmd_parser.c index a18b3837..30c55144 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -1849,8 +1849,10 @@ void cmd_parser(void) __banked } } else if (cmd_compare(0, "stp")) { stp_parse(); +#ifdef HEALTH } else if (cmd_compare(0, "health")) { health_show(); +#endif } else if (cmd_compare(0, "pvid")) { if (cmd_words_len == 3 && cmd_parse_port_separator(cmd_words_b[1]) != 0 && atoi_short(cmd_words_b[2]) && atoi_results_short && atoi_results_short <= 4094) @@ -2050,6 +2052,7 @@ void execute_commands(__xdata uint8_t *p) __banked { }; } +#ifdef HEALTH /* * Health instrumentation. The counters live in xdata and are fed from the * main loop through the banked entry points below; the "health" command @@ -2205,3 +2208,4 @@ void health_show(void) __banked print_short(management_vlan); write_char('\n'); } +#endif diff --git a/cmd_parser.h b/cmd_parser.h index 9f140135..29d08c36 100644 --- a/cmd_parser.h +++ b/cmd_parser.h @@ -9,7 +9,10 @@ extern __xdata uint8_t cmd_buffer[CMD_BUF_SIZE]; extern __xdata uint8_t cmd_available; extern __xdata uint8_t err_status; -/* Phase ids of the health instrumentation, in main-loop order */ +/* Health instrumentation, built with HEALTH=1. Without it the hooks below + * compile to nothing and the "health" command does not exist. */ +#ifdef HEALTH +/* Phase ids, in main-loop order */ #define HEALTH_PH_LINK 0 #define HEALTH_PH_SFP 1 #define HEALTH_PH_RX 2 @@ -19,11 +22,18 @@ extern __xdata uint8_t err_status; #define HEALTH_PHASES 6 extern __xdata uint16_t health_rx_frames; +#define health_rx_frame() health_rx_frames++ void health_loop_start(void) __banked; /* once per idle() pass, resets the phase baseline */ void health_phase(uint8_t id) __banked; /* after each phase; accounts ticks since last checkpoint */ void health_stack_paint(void) __banked; /* paint the unused stack area once at boot */ void health_show(void) __banked; /* "health" CLI dump */ +#else +#define health_rx_frame() +#define health_loop_start() +#define health_phase(id) +#define health_stack_paint() +#endif void cmd_tokenize(void) __banked; void cmd_parser(void) __banked; diff --git a/doc/health.md b/doc/health.md index 08629b11..736d52b7 100644 --- a/doc/health.md +++ b/doc/health.md @@ -20,6 +20,17 @@ tcp st 00 tmr 00 rtx 00 rto 00 len 0x0000 mss 0x05b4 httpd left 0x0000 entry 00 stp 01 mvlan 0x0002 ``` +The instrumentation is not part of a default build. It costs about 1.1 kB +of bank 2, a few bytes of xdata and seven banked calls per main-loop pass, +which is nothing a user needs unless they are chasing a problem, so it is +switched on at build time: + +``` +make MACHINE=SWTGW218AS HEALTH=1 +``` + +Without it the hooks compile to nothing and `health` is not a command. + All figures are raw hex. The counters are cumulative: take two dumps a known time apart and the differences give the rates. diff --git a/rtlplayground.c b/rtlplayground.c index 79a3d0b9..bd61c87c 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -1004,7 +1004,7 @@ void handle_rx(void) REG_SET(RTL837X_REG_NIC_RXCMD, 1); return; } - health_rx_frames++; + health_rx_frame(); #ifdef RXTXDBG print_string("\n<< ");