diff --git a/tests/sys/shell/Makefile b/tests/sys/shell/Makefile index 0c904de2de..ec4ed07377 100644 --- a/tests/sys/shell/Makefile +++ b/tests/sys/shell/Makefile @@ -4,6 +4,7 @@ include ../Makefile.sys_common USEMODULE += app_metadata USEMODULE += shell_cmds_default USEMODULE += ps +USEMODULE += ztimer_msec # Use a terminal that does not introduce extra characters into the stream. RIOT_TERMINAL ?= socat @@ -13,6 +14,9 @@ APP_SHELL_FMT ?= NONE # microbit qemu failing currently TEST_ON_CI_BLACKLIST += microbit +# requires #19005 +TEST_ON_CI_BLACKLIST += native native64 + include $(RIOTBASE)/Makefile.include CFLAGS += '-DTHREAD_STACKSIZE_MAIN=(THREAD_STACKSIZE_SMALL+THREAD_EXTRA_STACKSIZE_PRINTF)' diff --git a/tests/sys/shell/Makefile.ci b/tests/sys/shell/Makefile.ci index 72db76ccb5..6dd70e7964 100644 --- a/tests/sys/shell/Makefile.ci +++ b/tests/sys/shell/Makefile.ci @@ -1,3 +1,4 @@ BOARD_INSUFFICIENT_MEMORY := \ + atmega328p-xplained-mini \ atmega8 \ # diff --git a/tests/sys/shell/main.c b/tests/sys/shell/main.c index bb665b0625..46fec268c9 100644 --- a/tests/sys/shell/main.c +++ b/tests/sys/shell/main.c @@ -20,14 +20,15 @@ #include #include +#include + +#include "thread.h" +#include "string_utils.h" +#include "ztimer.h" #include "architecture.h" #include "shell.h" -#if MODULE_STDIO_RTT -#include "xtimer.h" -#endif - /* define buffer to be used by the shell. Note: This is intentionally * smaller than 64 bytes, as the EDBG integrated UART bridge of the samr21-xpro * (and likely all other EDBG boards) drops chars when sending more than 64 @@ -100,12 +101,48 @@ static int print_empty(int argc, char **argv) return 0; } +static char _stack[THREAD_STACKSIZE_TINY]; +static struct { + uint16_t period_ms; + uint16_t reps; +} _periodic_ctx; + +static void *_func(void *arg) +{ + (void)arg; + + while (_periodic_ctx.reps--) { + ztimer_sleep(ZTIMER_MSEC, _periodic_ctx.period_ms); + puts("test"); + } + + return NULL; +} + +/* test to make sure that waiting for stdin does not block other threads */ +static int print_periodic(int argc, char **argv) +{ + if (argc > 1) { + _periodic_ctx.reps = atoi(argv[1]); + } else { + _periodic_ctx.reps = 5; + } + + _periodic_ctx.period_ms = 500; + + thread_create(_stack, sizeof(_stack), THREAD_PRIORITY_MAIN, THREAD_CREATE_STACKTEST, + _func, NULL, "periodic"); + + return 0; +} + static const shell_command_t shell_commands[] = { { "bufsize", "Get the shell's buffer size", print_shell_bufsize }, { "start_test", "starts a test", print_teststart }, { "end_test", "ends a test", print_testend }, { "echo", "prints the input command", print_echo }, { "empty", "print nothing on command", print_empty }, + { "periodic", "periodically print command", print_periodic }, { NULL, NULL, NULL } }; diff --git a/tests/sys/shell/tests/01-run.py b/tests/sys/shell/tests/01-run.py index fc9c081d0b..faa79a3859 100755 --- a/tests/sys/shell/tests/01-run.py +++ b/tests/sys/shell/tests/01-run.py @@ -19,6 +19,7 @@ EXPECTED_HELP = ( 'end_test ends a test', 'echo prints the input command', 'empty print nothing on command', + 'periodic periodically print command', 'app_metadata Returns application metadata', 'pm interact with layered PM subsystem', 'ps Prints information about running threads.', @@ -205,6 +206,18 @@ def check_control_d(child): child.expect_exact(PROMPT) +def check_preempt(child): + child.expect(PROMPT) + child.sendline('periodic 5') + + child.expect_exact('test') + child.expect_exact('test') + child.expect_exact('test') + child.expect_exact('test') + child.expect_exact('test') + child.sendline('') + + def testfunc(child): # avoid sending an extra empty line on native. if BOARD in ['native', 'native64']: @@ -224,6 +237,8 @@ def testfunc(child): check_control_d(child) + check_preempt(child) + # loop other defined commands and expected output for cmd, expected in CMDS: