From bd56356b58f8acfa65c690cc1437292f86798e7b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 18 Jun 2014 10:54:04 +0200 Subject: smptests/smpwakeafter01: New test --- testsuites/smptests/Makefile.am | 1 + testsuites/smptests/configure.ac | 1 + testsuites/smptests/smpwakeafter01/Makefile.am | 19 +++ testsuites/smptests/smpwakeafter01/init.c | 153 +++++++++++++++++++++ .../smptests/smpwakeafter01/smpwakeafter01.doc | 12 ++ .../smptests/smpwakeafter01/smpwakeafter01.scn | 44 ++++++ 6 files changed, 230 insertions(+) create mode 100644 testsuites/smptests/smpwakeafter01/Makefile.am create mode 100644 testsuites/smptests/smpwakeafter01/init.c create mode 100644 testsuites/smptests/smpwakeafter01/smpwakeafter01.doc create mode 100644 testsuites/smptests/smpwakeafter01/smpwakeafter01.scn diff --git a/testsuites/smptests/Makefile.am b/testsuites/smptests/Makefile.am index 8c2ac7bb06..1edfbde7f0 100644 --- a/testsuites/smptests/Makefile.am +++ b/testsuites/smptests/Makefile.am @@ -30,6 +30,7 @@ SUBDIRS += smpsignal01 SUBDIRS += smpswitchextension01 SUBDIRS += smpthreadlife01 SUBDIRS += smpunsupported01 +SUBDIRS += smpwakeafter01 if HAS_POSIX SUBDIRS += smppsxaffinity01 SUBDIRS += smppsxaffinity02 diff --git a/testsuites/smptests/configure.ac b/testsuites/smptests/configure.ac index bdc166b063..79b3bf8a2b 100644 --- a/testsuites/smptests/configure.ac +++ b/testsuites/smptests/configure.ac @@ -88,5 +88,6 @@ smpsignal01/Makefile smpswitchextension01/Makefile smpthreadlife01/Makefile smpunsupported01/Makefile +smpwakeafter01/Makefile ]) AC_OUTPUT diff --git a/testsuites/smptests/smpwakeafter01/Makefile.am b/testsuites/smptests/smpwakeafter01/Makefile.am new file mode 100644 index 0000000000..d6bd878374 --- /dev/null +++ b/testsuites/smptests/smpwakeafter01/Makefile.am @@ -0,0 +1,19 @@ +rtems_tests_PROGRAMS = smpwakeafter01 +smpwakeafter01_SOURCES = init.c + +dist_rtems_tests_DATA = smpwakeafter01.scn smpwakeafter01.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(smpwakeafter01_OBJECTS) +LINK_LIBS = $(smpwakeafter01_LDLIBS) + +smpwakeafter01$(EXEEXT): $(smpwakeafter01_OBJECTS) $(smpwakeafter01_DEPENDENCIES) + @rm -f smpwakeafter01$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/smptests/smpwakeafter01/init.c b/testsuites/smptests/smpwakeafter01/init.c new file mode 100644 index 0000000000..cae42e16ac --- /dev/null +++ b/testsuites/smptests/smpwakeafter01/init.c @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2014 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 "tmacros.h" + +#include +#include + +#include +#include + +const char rtems_test_name[] = "SMPWAKEAFTER 1"; + +#define CPU_COUNT 32 + +#define INTERVAL_COUNT 8 + +static rtems_id task_ids[CPU_COUNT][INTERVAL_COUNT]; + +static const rtems_interval intervals[INTERVAL_COUNT] = + { 1, 2, 3, 5, 7, 11, 13, 17 }; + +static uint32_t counts[CPU_COUNT][INTERVAL_COUNT]; + +static rtems_task_argument make_arg(uint32_t i, uint32_t j) +{ + return (i << 8) | (j << 0); +} + +static void get_indices(rtems_task_argument arg, uint32_t *i, uint32_t *j) +{ + *i = (arg >> 8) & 0xff; + *j = (arg >> 0) & 0xff; +} + +static void task(rtems_task_argument arg) +{ + uint32_t i; + uint32_t j; + rtems_interval ticks; + + get_indices(arg, &i, &j); + ticks = intervals[j]; + + while (true) { + rtems_status_code sc; + + ++counts[i][j]; + + sc = rtems_task_wake_after(ticks); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + } +} + +static void test(void) +{ + rtems_status_code sc; + uint32_t test_time_in_seconds = 10; + uint32_t cpu_count = rtems_get_processor_count(); + uint32_t i; + + for (i = 0; i < cpu_count; ++i) { + uint32_t j; + + for (j = 0; j < INTERVAL_COUNT; ++j) { + sc = rtems_task_create( + rtems_build_name('T', 'A', 'S', 'K'), + 2, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &task_ids[i][j] + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_start(task_ids[i][j], task, make_arg(i, j)); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + } + } + + for (i = 0; i < test_time_in_seconds; ++i) { + printf("%" PRIu32 " seconds remaining\n", test_time_in_seconds - i); + + sc = rtems_task_wake_after(rtems_clock_get_ticks_per_second()); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + } + + for (i = 0; i < cpu_count; ++i) { + uint32_t j; + + for (j = 0; j < INTERVAL_COUNT; ++j) { + sc = rtems_task_delete(task_ids[i][j]); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + printf( + "counts[%" PRIu32 "][%" PRIu32 "] = %" PRIu32 "\n", + i, + j, + counts[i][j] + ); + } + } +} + +static void Init(rtems_task_argument arg) +{ + rtems_resource_snapshot snapshot; + + TEST_BEGIN(); + + rtems_resource_snapshot_take(&snapshot); + + test(); + + rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); + + TEST_END(); + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER + +#define CONFIGURE_MICROSECONDS_PER_TICK 1000 + +#define CONFIGURE_SMP_APPLICATION + +#define CONFIGURE_SMP_MAXIMUM_PROCESSORS CPU_COUNT + +#define CONFIGURE_MAXIMUM_TASKS (1 + CPU_COUNT) + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT + +#include diff --git a/testsuites/smptests/smpwakeafter01/smpwakeafter01.doc b/testsuites/smptests/smpwakeafter01/smpwakeafter01.doc new file mode 100644 index 0000000000..64ee40c7a9 --- /dev/null +++ b/testsuites/smptests/smpwakeafter01/smpwakeafter01.doc @@ -0,0 +1,12 @@ +This file describes the directives and concepts tested by this test set. + +test set name: smpwakeafter01 + +directives: + + - rtems_task_wake_after() + +concepts: + + - Ensure that rtems_task_wake_after() works on multiple processors with some + tasks using different intervals. diff --git a/testsuites/smptests/smpwakeafter01/smpwakeafter01.scn b/testsuites/smptests/smpwakeafter01/smpwakeafter01.scn new file mode 100644 index 0000000000..9bbb558421 --- /dev/null +++ b/testsuites/smptests/smpwakeafter01/smpwakeafter01.scn @@ -0,0 +1,44 @@ +*** BEGIN OF TEST SMPWAKEAFTER 1 *** +10 seconds remaining +9 seconds remaining +8 seconds remaining +7 seconds remaining +6 seconds remaining +5 seconds remaining +4 seconds remaining +3 seconds remaining +2 seconds remaining +1 seconds remaining +counts[0][0] = 15479 +counts[0][1] = 17039 +counts[0][2] = 12389 +counts[0][3] = 8077 +counts[0][4] = 3 +counts[0][5] = 2431 +counts[0][6] = 2630 +counts[0][7] = 2128 +counts[1][0] = 15461 +counts[1][1] = 16813 +counts[1][2] = 12248 +counts[1][3] = 7483 +counts[1][4] = 5499 +counts[1][5] = 3170 +counts[1][6] = 2549 +counts[1][7] = 1748 +counts[2][0] = 71 +counts[2][1] = 17068 +counts[2][2] = 7661 +counts[2][3] = 8190 +counts[2][4] = 5513 +counts[2][5] = 3864 +counts[2][6] = 1454 +counts[2][7] = 1993 +counts[3][0] = 14511 +counts[3][1] = 16115 +counts[3][2] = 12561 +counts[3][3] = 7281 +counts[3][4] = 5507 +counts[3][5] = 3828 +counts[3][6] = 2687 +counts[3][7] = 1278 +*** END OF TEST SMPWAKEAFTER 1 *** -- cgit v1.2.3