From ca056e3fe7127f89dfb6e52803358db1051117a5 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 11 Oct 2018 06:12:16 +0200 Subject: tmtests/tmonetoone: New test program --- testsuites/tmtests/Makefile.am | 9 + testsuites/tmtests/configure.ac | 1 + testsuites/tmtests/tmonetoone/init.c | 292 +++++++++++++++++++++++++++ testsuites/tmtests/tmonetoone/tmonetoone.doc | 16 ++ testsuites/tmtests/tmonetoone/tmonetoone.scn | 19 ++ 5 files changed, 337 insertions(+) create mode 100644 testsuites/tmtests/tmonetoone/init.c create mode 100644 testsuites/tmtests/tmonetoone/tmonetoone.doc create mode 100644 testsuites/tmtests/tmonetoone/tmonetoone.scn diff --git a/testsuites/tmtests/Makefile.am b/testsuites/tmtests/Makefile.am index 3c2509d029..0fe59d6480 100644 --- a/testsuites/tmtests/Makefile.am +++ b/testsuites/tmtests/Makefile.am @@ -371,6 +371,15 @@ tmfine01_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_tmfine01) \ $(support_includes) endif +if TEST_tmonetoone +tm_tests += tmonetoone +tm_screens += tmonetoone/tmonetoone.scn +tm_docs += tmonetoone/tmonetoone.doc +tmonetoone_SOURCES = tmonetoone/init.c +tmonetoone_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_tmonetoone) \ + $(support_includes) +endif + if TEST_tmoverhd tm_tests += tmoverhd tm_docs += tmoverhd/tmoverhd.doc diff --git a/testsuites/tmtests/configure.ac b/testsuites/tmtests/configure.ac index 35fc899d30..90707453dc 100644 --- a/testsuites/tmtests/configure.ac +++ b/testsuites/tmtests/configure.ac @@ -67,6 +67,7 @@ RTEMS_TEST_CHECK([tm36]) RTEMS_TEST_CHECK([tmck]) RTEMS_TEST_CHECK([tmcontext01]) RTEMS_TEST_CHECK([tmfine01]) +RTEMS_TEST_CHECK([tmonetoone]) RTEMS_TEST_CHECK([tmoverhd]) RTEMS_TEST_CHECK([tmtimer01]) diff --git a/testsuites/tmtests/tmonetoone/init.c b/testsuites/tmtests/tmonetoone/init.c new file mode 100644 index 0000000000..756a1eabf1 --- /dev/null +++ b/testsuites/tmtests/tmonetoone/init.c @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2018 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include + +const char rtems_test_name[] = "TMONETOONE"; + +typedef enum { + TEST_EVENTS, + TEST_BSEM, + TEST_CLASSIC_FIFO_BSEM, + TEST_CLASSIC_PRIO_BSEM +} test_variant; + +typedef struct { + volatile uint32_t counter; + test_variant variant; + rtems_id task; + rtems_binary_semaphore bsem; + rtems_id classic_fifo_bsem; + rtems_id classic_prio_bsem; + rtems_id other_task; + rtems_binary_semaphore *other_bsem; + rtems_id other_classic_fifo_bsem; + rtems_id other_classic_prio_bsem; +} task_context RTEMS_ALIGNED(CPU_CACHE_LINE_BYTES); + +typedef struct { + task_context a; + task_context b; +} test_context; + +static test_context test_instance; + +static void test_events(task_context *tc) +{ + uint32_t counter; + rtems_id other; + + counter = 0; + other = tc->other_task; + + while (true) { + rtems_event_set events; + + (void)rtems_event_receive( + RTEMS_EVENT_0, + RTEMS_WAIT | RTEMS_EVENT_ALL, + RTEMS_NO_TIMEOUT, + &events + ); + (void)rtems_event_send(other, RTEMS_EVENT_0); + ++counter; + tc->counter = counter; + } +} + +static void test_bsem(task_context *tc) +{ + uint32_t counter; + rtems_binary_semaphore *other; + + counter = 0; + other = tc->other_bsem; + + while (true) { + rtems_binary_semaphore_wait(&tc->bsem); + rtems_binary_semaphore_post(other); + ++counter; + tc->counter = counter; + } +} + +static void test_classic_fifo_bsem(task_context *tc) +{ + uint32_t counter; + rtems_id own; + rtems_id other; + + counter = 0; + own = tc->classic_fifo_bsem; + other = tc->other_classic_fifo_bsem; + + while (true) { + (void)rtems_semaphore_obtain(own, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + (void)rtems_semaphore_release(other); + ++counter; + tc->counter = counter; + } +} + +static void test_classic_prio_bsem(task_context *tc) +{ + uint32_t counter; + rtems_id own; + rtems_id other; + + counter = 0; + own = tc->classic_prio_bsem; + other = tc->other_classic_prio_bsem; + + while (true) { + (void)rtems_semaphore_obtain(own, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + (void)rtems_semaphore_release(other); + ++counter; + tc->counter = counter; + } +} + +static void worker_task(rtems_task_argument arg) +{ + task_context *tc; + + tc = (task_context *) arg; + + switch (tc->variant) { + case TEST_EVENTS: + test_events(tc); + break; + case TEST_BSEM: + test_bsem(tc); + break; + case TEST_CLASSIC_FIFO_BSEM: + test_classic_fifo_bsem(tc); + break; + case TEST_CLASSIC_PRIO_BSEM: + test_classic_prio_bsem(tc); + break; + default: + rtems_test_assert(0); + break; + } +} + +static void create_task(task_context *tc) +{ + rtems_status_code sc; + + rtems_binary_semaphore_init(&tc->bsem, "test"); + + sc = rtems_semaphore_create( + rtems_build_name('T', 'E', 'S', 'T'), + 0, + RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, + 0, + &tc->classic_fifo_bsem + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_semaphore_create( + rtems_build_name('T', 'E', 'S', 'T'), + 0, + RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, + 0, + &tc->classic_prio_bsem + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_create( + rtems_build_name('T', 'E', 'S', 'T'), + 2, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &tc->task + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_start(tc->task, worker_task, (rtems_task_argument) tc); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +static const char * const variant_names[] = { + "event", + "self-contained binary semaphore", + "Classic binary semaphore (FIFO)", + "Classic binary semaphore (priority)" +}; + +static void prepare(test_context *ctx, test_variant variant) +{ + rtems_status_code sc; + + printf("%s\n", variant_names[variant]); + + ctx->a.variant = variant; + ctx->b.variant = variant; + + ctx->a.counter = 0; + ctx->b.counter = 0; + + sc = rtems_task_restart(ctx->a.task, (rtems_task_argument) &ctx->a); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_restart(ctx->b.task, (rtems_task_argument) &ctx->b); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_wake_after(2); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +static void run(test_context *ctx) +{ + rtems_status_code sc; + + sc = rtems_task_wake_after(rtems_clock_get_ticks_per_second()); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + printf("a %" PRIu32 "\nb %" PRIu32 "\n", ctx->a.counter, ctx->b.counter); +} + +static void Init(rtems_task_argument arg) +{ + test_context *ctx = &test_instance; + rtems_status_code sc; + + TEST_BEGIN(); + + create_task(&ctx->a); + create_task(&ctx->b); + + ctx->a.other_task = ctx->b.task; + ctx->a.other_bsem = &ctx->b.bsem; + ctx->a.other_classic_fifo_bsem = ctx->b.classic_fifo_bsem; + ctx->a.other_classic_prio_bsem = ctx->b.classic_prio_bsem; + + ctx->b.other_task = ctx->a.task; + ctx->b.other_bsem = &ctx->a.bsem; + ctx->b.other_classic_fifo_bsem = ctx->a.classic_fifo_bsem; + ctx->b.other_classic_prio_bsem = ctx->a.classic_prio_bsem; + + prepare(ctx, TEST_EVENTS); + + sc = rtems_event_send(ctx->a.task, RTEMS_EVENT_0); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + run(ctx); + prepare(ctx, TEST_BSEM); + + rtems_binary_semaphore_post(&ctx->a.bsem); + + run(ctx); + prepare(ctx, TEST_CLASSIC_FIFO_BSEM); + + sc = rtems_semaphore_release(ctx->a.classic_fifo_bsem); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + run(ctx); + prepare(ctx, TEST_CLASSIC_PRIO_BSEM); + + sc = rtems_semaphore_release(ctx->a.classic_prio_bsem); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + run(ctx); + + TEST_END(); + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER + +#define CONFIGURE_MAXIMUM_TASKS 3 + +#define CONFIGURE_MAXIMUM_SEMAPHORES 4 + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT + +#include diff --git a/testsuites/tmtests/tmonetoone/tmonetoone.doc b/testsuites/tmtests/tmonetoone/tmonetoone.doc new file mode 100644 index 0000000000..ddb71e428f --- /dev/null +++ b/testsuites/tmtests/tmonetoone/tmonetoone.doc @@ -0,0 +1,16 @@ +This file describes the directives and concepts tested by this test set. + +test set name: tmonetoone + +directives: + + - rtems_event_send() + - rtems_event_receive() + - rtems_semaphore_obtain() + - rtems_semaphore_release() + - rtems_binary_semaphore_post() + - rtems_binary_semaphore_wait() + +concepts: + + - Compare performance of different task/ISR synchronization primitives. diff --git a/testsuites/tmtests/tmonetoone/tmonetoone.scn b/testsuites/tmtests/tmonetoone/tmonetoone.scn new file mode 100644 index 0000000000..1e7e36eeb3 --- /dev/null +++ b/testsuites/tmtests/tmonetoone/tmonetoone.scn @@ -0,0 +1,19 @@ +*** BEGIN OF TEST TMONETOONE *** +*** TEST VERSION: 5.0.0.629faf95046cddedc161ba9bc43fda925ca04ee5 +*** TEST STATE: EXPECTED-PASS +*** TEST BUILD: +*** TEST TOOLS: 7.3.0 20180125 (RTEMS 5, RSB 9670d7541e0621915e521fe76e7bb33de8cee661, Newlib d13c84eb07e35984bf7a974cd786a6cdac29e6b9) +event +a 252994 +b 252994 +self-contained binary semaphore +a 210823 +b 210822 +Classic binary semaphore (FIFO) +a 172056 +b 172055 +Classic binary semaphore (priority) +a 165889 +b 165888 + +*** END OF TEST TMONETOONE *** -- cgit v1.2.3