[PATCH 27/33] spintrcritical18: Use T_interrupt_test()
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Jul 21 15:04:44 UTC 2020
---
testsuites/sptests/Makefile.am | 4 +-
testsuites/sptests/spintrcritical18/init.c | 146 ++++++++++++------
.../spintrcritical18/spintrcritical18.scn | 30 +++-
3 files changed, 131 insertions(+), 49 deletions(-)
diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
index 136a8378b5..5df21b89af 100644
--- a/testsuites/sptests/Makefile.am
+++ b/testsuites/sptests/Makefile.am
@@ -1330,9 +1330,7 @@ if TEST_spintrcritical18
sp_tests += spintrcritical18
sp_screens += spintrcritical18/spintrcritical18.scn
sp_docs += spintrcritical18/spintrcritical18.doc
-spintrcritical18_SOURCES = spintrcritical18/init.c \
- spintrcritical_support/intrcritical.h \
- spintrcritical_support/intrcritical.c
+spintrcritical18_SOURCES = spintrcritical18/init.c
spintrcritical18_CPPFLAGS = $(AM_CPPFLAGS) \
$(TEST_FLAGS_spintrcritical18) $(support_includes) \
-I$(top_srcdir)/spintrcritical_support
diff --git a/testsuites/sptests/spintrcritical18/init.c b/testsuites/sptests/spintrcritical18/init.c
index 000f081f60..1ac9483c86 100644
--- a/testsuites/sptests/spintrcritical18/init.c
+++ b/testsuites/sptests/spintrcritical18/init.c
@@ -1,11 +1,5 @@
/*
- * Copyright (c) 2012 embedded brains GmbH. All rights reserved.
- *
- * embedded brains GmbH
- * Obere Lagerstr. 30
- * 82178 Puchheim
- * Germany
- * <rtems at embedded-brains.de>
+ * Copyright (C) 2012, 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -16,8 +10,8 @@
#include "config.h"
#endif
-#include <tmacros.h>
-#include <intrcritical.h>
+#include <rtems/test.h>
+#include <rtems/simple-test.h>
const char rtems_test_name[] = "SPINTRCRITICAL 18";
@@ -29,22 +23,22 @@ const char rtems_test_name[] = "SPINTRCRITICAL 18";
#define PRIORITY_HIGH 1
-#define ASSERT_SC(sc) rtems_test_assert( (sc) == RTEMS_SUCCESSFUL )
-
typedef struct {
rtems_id middle_priority_task;
rtems_id high_priority_task;
bool high_priority_task_activated;
+ volatile bool early;
+ volatile bool switching;
+ volatile bool late;
+ long potential_hits;
} test_context;
-static test_context global_ctx;
-
-static void wake_up(rtems_id task)
+static void wake_up( rtems_id task )
{
rtems_status_code sc;
sc = rtems_event_send( task, WAKE_UP );
- ASSERT_SC( sc );
+ T_quiet_rsc_success( sc );
}
static void wait_for_wake_up( void )
@@ -58,18 +52,43 @@ static void wait_for_wake_up( void )
RTEMS_NO_TIMEOUT,
&events
);
- ASSERT_SC( sc );
- rtems_test_assert( events == WAKE_UP );
+ T_quiet_rsc_success( sc );
+ T_quiet_eq_u32( events, WAKE_UP );
}
-static void active_high_priority_task( rtems_id timer, void *arg )
+static T_interrupt_test_state active_high_priority_task( void *arg )
{
- /* The arg is NULL */
- test_context *ctx = &global_ctx;
+ test_context *ctx = arg;
+ T_interrupt_test_state state;
+
+ state = T_interrupt_test_change_state(
+ T_INTERRUPT_TEST_ACTION,
+ T_INTERRUPT_TEST_ACTION
+ );
+
+ if ( state != T_INTERRUPT_TEST_ACTION ) {
+ return T_INTERRUPT_TEST_CONTINUE;
+ }
- rtems_test_assert( !ctx->high_priority_task_activated );
+ T_quiet_false( ctx->high_priority_task_activated );
ctx->high_priority_task_activated = true;
wake_up( ctx->high_priority_task );
+
+ if ( ctx->early ) {
+ state = T_INTERRUPT_TEST_EARLY;
+ } else if ( ctx->late ) {
+ state = T_INTERRUPT_TEST_LATE;
+ } else {
+ ++ctx->potential_hits;
+
+ if ( ctx->potential_hits > 13 ) {
+ state = T_INTERRUPT_TEST_DONE;
+ } else {
+ state = T_INTERRUPT_TEST_CONTINUE;
+ }
+ }
+
+ return state;
}
static void middle_priority_task( rtems_task_argument arg )
@@ -78,8 +97,9 @@ static void middle_priority_task( rtems_task_argument arg )
while ( true ) {
wait_for_wake_up();
+ ctx->late = true;
- rtems_test_assert( !ctx->high_priority_task_activated );
+ T_quiet_false( ctx->high_priority_task_activated );
}
}
@@ -90,26 +110,60 @@ static void high_priority_task( rtems_task_argument arg )
while ( true ) {
wait_for_wake_up();
- rtems_test_assert( ctx->high_priority_task_activated );
+ T_quiet_true( ctx->high_priority_task_activated );
ctx->high_priority_task_activated = false;
}
}
-static bool test_body( void *arg )
+static void prepare( void *arg )
{
test_context *ctx = arg;
+ ctx->early = true;
+ ctx->switching = false;
+ ctx->late = false;
+}
+
+static void action( void *arg )
+{
+ test_context *ctx = arg;
+
+ ctx->early = false;
wake_up( ctx->middle_priority_task );
+}
- return false;
+static void blocked( void *arg )
+{
+ test_context *ctx = arg;
+ T_interrupt_test_state state;
+
+ state = T_interrupt_test_change_state(
+ T_INTERRUPT_TEST_ACTION,
+ T_INTERRUPT_TEST_LATE
+ );
+
+ if ( state == T_INTERRUPT_TEST_ACTION ) {
+ ctx->switching = true;
+ T_busy( 100 );
+ ctx->switching = false;
+ }
}
-static void Init( rtems_task_argument ignored )
+static const T_interrupt_test_config config = {
+ .prepare = prepare,
+ .action = action,
+ .interrupt = active_high_priority_task,
+ .blocked = blocked,
+ .max_iteration_count = 10000
+};
+
+T_TEST_CASE(InterruptDuringThreadDispatch)
{
- test_context *ctx = &global_ctx;
+ T_interrupt_test_state state;
+ test_context ctx;
rtems_status_code sc;
- TEST_BEGIN();
+ memset( &ctx, 0, sizeof( ctx ) );
sc = rtems_task_create(
rtems_build_name( 'H', 'I', 'G', 'H' ),
@@ -117,16 +171,16 @@ static void Init( rtems_task_argument ignored )
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
- &ctx->high_priority_task
+ &ctx.high_priority_task
);
- ASSERT_SC(sc);
+ T_assert_rsc_success( sc );
sc = rtems_task_start(
- ctx->high_priority_task,
+ ctx.high_priority_task,
high_priority_task,
- (rtems_task_argument) ctx
+ (rtems_task_argument) &ctx
);
- ASSERT_SC(sc);
+ T_assert_rsc_success( sc );
sc = rtems_task_create(
rtems_build_name( 'M', 'I', 'D', 'L' ),
@@ -134,22 +188,30 @@ static void Init( rtems_task_argument ignored )
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_DEFAULT_MODES,
RTEMS_DEFAULT_ATTRIBUTES,
- &ctx->middle_priority_task
+ &ctx.middle_priority_task
);
- ASSERT_SC(sc);
+ T_assert_rsc_success( sc );
sc = rtems_task_start(
- ctx->middle_priority_task,
+ ctx.middle_priority_task,
middle_priority_task,
- (rtems_task_argument) ctx
+ (rtems_task_argument) &ctx
);
- ASSERT_SC(sc);
+ T_assert_rsc_success( sc );
- interrupt_critical_section_test( test_body, ctx, active_high_priority_task );
+ state = T_interrupt_test( &config, &ctx );
+ T_eq_int( state, T_INTERRUPT_TEST_DONE );
- TEST_END();
+ sc = rtems_task_delete( ctx.high_priority_task );
+ T_rsc_success( sc );
- rtems_test_exit( 0 );
+ sc = rtems_task_delete( ctx.middle_priority_task );
+ T_rsc_success( sc );
+}
+
+static rtems_task Init( rtems_task_argument argument )
+{
+ rtems_test_run( argument, TEST_STATE );
}
#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
@@ -158,8 +220,6 @@ static void Init( rtems_task_argument ignored )
#define CONFIGURE_MICROSECONDS_PER_TICK 1000
#define CONFIGURE_MAXIMUM_TASKS 3
-#define CONFIGURE_MAXIMUM_TIMERS 1
-#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
#define CONFIGURE_INIT_TASK_PRIORITY PRIORITY_LOW
#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
diff --git a/testsuites/sptests/spintrcritical18/spintrcritical18.scn b/testsuites/sptests/spintrcritical18/spintrcritical18.scn
index 4cf1d938e9..51f6199881 100644
--- a/testsuites/sptests/spintrcritical18/spintrcritical18.scn
+++ b/testsuites/sptests/spintrcritical18/spintrcritical18.scn
@@ -1,4 +1,28 @@
-*** TEST INTERRUPT CRITICAL SECTION 18 ***
+*** BEGIN OF TEST SPINTRCRITICAL 18 ***
+*** TEST VERSION: 6.0.0.929e49a54ab4d2d18c9fb8d03610614f63e25b8d
+*** TEST STATE: EXPECTED_PASS
+*** TEST BUILD: RTEMS_DEBUG RTEMS_POSIX_API RTEMS_SMP
+*** TEST TOOLS: 10.0.1 20200406 (RTEMS 6, RSB bec88a6dd856892c3e66e4598252ea07d7a0d762, Newlib ece49e4)
+A:SPINTRCRITICAL 18
+S:Platform:RTEMS
+S:Compiler:10.0.1 20200406 (RTEMS 6, RSB bec88a6dd856892c3e66e4598252ea07d7a0d762, Newlib ece49e4)
+S:Version:6.0.0.929e49a54ab4d2d18c9fb8d03610614f63e25b8d
+S:BSP:realview_pbx_a9_qemu
+S:RTEMS_DEBUG:1
+S:RTEMS_MULTIPROCESSING:0
+S:RTEMS_POSIX_API:1
+S:RTEMS_PROFILING:0
+S:RTEMS_SMP:1
+B:InterruptDuringThreadDispatch
+P:0:0:UI1:init.c:176
+P:1:0:UI1:init.c:183
+P:2:0:UI1:init.c:193
+P:3:0:UI1:init.c:200
+P:4:0:UI1:init.c:203
+P:5:0:UI1:init.c:206
+P:6:0:UI1:init.c:209
+E:InterruptDuringThreadDispatch:N:7:F:0:D:0.096291
+Z:SPINTRCRITICAL 18:C:1:N:7:F:0:D:0.097615
+Y:ReportHash:SHA256:60e93b7dd3417ceb3b6374392e8dd8e1b16279a45bf6ae7ccca3c67bb9ee298f
-Support - rtems_timer_create - creating timer 1
-*** END OF TEST INTERRUPT CRITICAL SECTION 18 ***
+*** END OF TEST SPINTRCRITICAL 18 ***
--
2.26.2
More information about the devel
mailing list