mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
stp_timers() ran every fourth pass of the main loop and stp_clock counted passes, which only measures time while a pass is one tick long. It never quite was: a pass is as long as the packets it handles, and #482 now takes up to four of them, so under an IPv4 stream a pass is about 16 ms and STP time runs at a third of its rate, with hellos 6 s apart and a root aged out after a minute. Since #483 the loop also stops sleeping while packets wait, so under a flood of cheap frames passes come faster than ticks and STP time runs fast instead, shortening the forward delay in exactly the situation a loop produces. uip_periodic() had the same problem from the other side: it ran once per pass, so the retransmit timer sped up with the loop. Both now go by the tick counter the timer interrupt keeps. The STP block catches up on ticks a long pass missed, at most eight steps at a time, and handle_tx() runs its periodics once per tick at most. One byte of xdata more, 48 bytes of code. A host test drives the gate with one pass every 5 ms, every 16 ms and every 0.6 ms for ten seconds each; the STP clock lands on 500 steps in all three, where counting passes gave 156 and 4166. A pass of 1.3 s loses time rather than firing 65 steps at once, and the arithmetic survives the tick counter wrapping.
74 lines
2.7 KiB
Makefile
74 lines
2.7 KiB
Makefile
# Host unit-test harness for RTLPlayground firmware logic.
|
|
#
|
|
# Compiles selected firmware translation units with host gcc + AddressSanitizer,
|
|
# force-including sdcc_shim.h to erase 8051 keywords, and links them against
|
|
# mocked hardware edges (support.c). No SDCC, no flashing, no hardware.
|
|
#
|
|
# make build + run all tests
|
|
# make run run tests
|
|
# make clean
|
|
|
|
CC = gcc
|
|
SRCROOT = ..
|
|
# -include shim first so __xdata/__code/__banked vanish before any firmware header.
|
|
CFLAGS = -std=gnu11 -g -O1 -Wall -Wextra -Werror -Wno-unused-parameter -Wno-unknown-pragmas \
|
|
-Wno-pointer-sign \
|
|
-DRTLP_HOST_TEST \
|
|
-fsanitize=address,undefined -fno-omit-frame-pointer \
|
|
-include sdcc_shim.h -Istub -I. -I$(SRCROOT) -I$(SRCROOT)/httpd -I$(SRCROOT)/uip
|
|
ifeq ($(findstring clang,$(shell $(CC) --version 2>/dev/null)),)
|
|
CFLAGS += -Wno-builtin-declaration-mismatch
|
|
endif
|
|
LDFLAGS = -fsanitize=address,undefined
|
|
|
|
BUILDDIR = build
|
|
|
|
# One binary per subsystem under test.
|
|
TESTS = $(BUILDDIR)/test_cmd_editor \
|
|
$(BUILDDIR)/test_port_tables \
|
|
$(BUILDDIR)/test_page_json \
|
|
$(BUILDDIR)/test_httpd_tx \
|
|
$(BUILDDIR)/test_tick_gate
|
|
|
|
# The table tests link the register mock and one environment file; stub/
|
|
# stands in for the two headers a firmware build generates.
|
|
TABLE_ENV = support.c hw_mock.c env_tables.c $(SRCROOT)/cmd_editor.c \
|
|
$(SRCROOT)/rtl837x_port.c $(SRCROOT)/httpd/page_impl.c
|
|
|
|
all: run
|
|
|
|
$(BUILDDIR):
|
|
mkdir -p $(BUILDDIR)
|
|
|
|
# cmd_editor.c is compiled UNMODIFIED from the firmware tree.
|
|
$(BUILDDIR)/test_cmd_editor: test_cmd_editor.c support.c $(SRCROOT)/cmd_editor.c | $(BUILDDIR)
|
|
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
|
|
|
|
# rtl837x_port.c and httpd/page_impl.c are compiled UNMODIFIED from the firmware tree.
|
|
$(BUILDDIR)/test_port_tables: test_port_tables.c $(TABLE_ENV) hw_mock.h | $(BUILDDIR)
|
|
$(CC) $(CFLAGS) $(filter %.c,$^) -o $@ $(LDFLAGS)
|
|
|
|
$(BUILDDIR)/test_tick_gate: test_tick_gate.c support.c $(SRCROOT)/cmd_editor.c | $(BUILDDIR)
|
|
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
|
|
|
|
$(BUILDDIR)/test_page_json: test_page_json.c $(TABLE_ENV) hw_mock.h | $(BUILDDIR)
|
|
$(CC) $(CFLAGS) $(filter %.c,$^) -o $@ $(LDFLAGS)
|
|
|
|
# httpd/httpd.c and uip/uip.c are compiled UNMODIFIED from the firmware tree;
|
|
# this test carries the environment below them itself.
|
|
$(BUILDDIR)/test_httpd_tx: test_httpd_tx.c $(SRCROOT)/httpd/httpd.c $(SRCROOT)/uip/uip.c | $(BUILDDIR)
|
|
$(CC) $(CFLAGS) $(filter %.c,$^) -o $@ $(LDFLAGS)
|
|
|
|
run: $(TESTS)
|
|
@fail=0; for t in $(TESTS); do \
|
|
echo "=== $$t ==="; \
|
|
$$t || fail=1; \
|
|
echo; \
|
|
done; \
|
|
if [ $$fail -ne 0 ]; then echo "TESTS FAILED"; exit 1; else echo "ALL TESTS PASSED"; fi
|
|
|
|
clean:
|
|
rm -rf $(BUILDDIR)
|
|
|
|
.PHONY: all run clean
|