diff --git a/tests/bench_thread_yield_pingpong/Makefile b/tests/bench_thread_yield_pingpong/Makefile new file mode 100644 index 000000000000..85437c51a283 --- /dev/null +++ b/tests/bench_thread_yield_pingpong/Makefile @@ -0,0 +1,12 @@ +include ../Makefile.tests_common + +BOARD_INSUFFICIENT_MEMORY := nucleo-f031k6 + +USEMODULE += xtimer + +TEST_ON_CI_WHITELIST += all + +include $(RIOTBASE)/Makefile.include + +test: + tests/01-run.py diff --git a/tests/bench_thread_yield_pingpong/README.md b/tests/bench_thread_yield_pingpong/README.md new file mode 100644 index 000000000000..20f6617f8ed9 --- /dev/null +++ b/tests/bench_thread_yield_pingpong/README.md @@ -0,0 +1,8 @@ +# About + +This test measures the amount of context switches between two threads of the +same priority. The result amounts to the number of thread_yield() calls in +*one* thread (half the number of actual context switches). + +This test application intentionally duplicates code with some similar benchmark +applications in order to be able to compare code sizes. diff --git a/tests/bench_thread_yield_pingpong/main.c b/tests/bench_thread_yield_pingpong/main.c new file mode 100644 index 000000000000..9d514b56227f --- /dev/null +++ b/tests/bench_thread_yield_pingpong/main.c @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2017 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief Context switch benchmark test application + * + * @author Kaspar Schleiser + * + * @} + */ + +#include + +#include "thread.h" +#include "xtimer.h" + +#ifndef TEST_DURATION +#define TEST_DURATION (1000000U) +#endif + +volatile unsigned _flag = 0; +static char _stack[THREAD_STACKSIZE_MAIN]; + +static void _timer_callback(void*arg) +{ + (void)arg; + + _flag = 1; +} + +static void *_second_thread(void *arg) +{ + (void)arg; + + while(1) { + thread_yield(); + } + + return NULL; +} + +int main(void) +{ + printf("main starting\n"); + + thread_create(_stack, + sizeof(_stack), + THREAD_PRIORITY_MAIN, + THREAD_CREATE_STACKTEST, + _second_thread, + NULL, + "second_thread"); + + xtimer_t timer; + timer.callback = _timer_callback; + + uint32_t n = 0; + + xtimer_set(&timer, TEST_DURATION); + while(!_flag) { + thread_yield(); + n++; + } + + printf("{ \"result\" : %"PRIu32" }\n", n); + + return 0; +} diff --git a/tests/bench_thread_yield_pingpong/tests/01-run.py b/tests/bench_thread_yield_pingpong/tests/01-run.py new file mode 100755 index 000000000000..3a1e733980e9 --- /dev/null +++ b/tests/bench_thread_yield_pingpong/tests/01-run.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2018 Kaspar Schleiser +# 2017 Sebastian Meiling +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. + +import os +import sys + + +def testfunc(child): + child.expect(r"{ \"result\" : \d+ }") + + +if __name__ == "__main__": + sys.path.append(os.path.join(os.environ['RIOTTOOLS'], 'testrunner')) + from testrunner import run + sys.exit(run(testfunc))