diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-09-09 17:13:51 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-09-10 07:12:55 +0200 |
commit | 4984ee4aa227cd9a4e4d3f171ea9317d1bc3e163 (patch) | |
tree | 220d66bfa7b6f47236aba68a6737a0da031edba3 /testsuites/sptests/spintrcritical21 | |
parent | psxtests/psxonce01: Use test extension (diff) | |
download | rtems-4984ee4aa227cd9a4e4d3f171ea9317d1bc3e163.tar.bz2 |
sptests/sp39: Convert to sptests/spintrcritical21
Use interrupt critical section test support. Do not print end of test
message in case of failure.
Diffstat (limited to 'testsuites/sptests/spintrcritical21')
-rw-r--r-- | testsuites/sptests/spintrcritical21/Makefile.am | 20 | ||||
-rw-r--r-- | testsuites/sptests/spintrcritical21/init.c | 170 | ||||
-rw-r--r-- | testsuites/sptests/spintrcritical21/spintrcritical21.doc | 22 | ||||
-rw-r--r-- | testsuites/sptests/spintrcritical21/spintrcritical21.scn | 4 | ||||
-rw-r--r-- | testsuites/sptests/spintrcritical21/system.h | 39 |
5 files changed, 255 insertions, 0 deletions
diff --git a/testsuites/sptests/spintrcritical21/Makefile.am b/testsuites/sptests/spintrcritical21/Makefile.am new file mode 100644 index 0000000000..b53d0006de --- /dev/null +++ b/testsuites/sptests/spintrcritical21/Makefile.am @@ -0,0 +1,20 @@ +rtems_tests_PROGRAMS = spintrcritical21 +spintrcritical21_SOURCES = init.c ../spintrcritical_support/intrcritical.c + +dist_rtems_tests_DATA = spintrcritical21.scn spintrcritical21.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 +AM_CPPFLAGS += -I$(top_srcdir)/spintrcritical_support + +LINK_OBJS = $(spintrcritical21_OBJECTS) +LINK_LIBS = $(spintrcritical21_LDLIBS) + +spintrcritical21$(EXEEXT): $(spintrcritical21_OBJECTS) $(spintrcritical21_DEPENDENCIES) + @rm -f spintrcritical21$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/sptests/spintrcritical21/init.c b/testsuites/sptests/spintrcritical21/init.c new file mode 100644 index 0000000000..8b1ddcfc37 --- /dev/null +++ b/testsuites/sptests/spintrcritical21/init.c @@ -0,0 +1,170 @@ +/* + * Classic API Signal to Task from ISR + * + * COPYRIGHT (c) 1989-2011. + * On-Line Applications Research Corporation (OAR). + * + * 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 + +#define CONFIGURE_INIT +#include "system.h" + +#include <intrcritical.h> + +#include <rtems/rtems/eventimpl.h> + +const char rtems_test_name[] = "SPINTRCRITICAL 21"; + +/* + * ERROR CHECKING NOTE: + * + * We are either at dispatch disable level 1 or 2. Either way, it is + * safer not to check the dispatch level explicitly so we are using + * fatal_directive_check_status_only() not directive_failed(). + */ + +static volatile bool case_hit; + +static rtems_id main_task; + +static rtems_id other_task; + +static rtems_timer_service_routine test_event_from_isr( + rtems_id timer, + void *arg +) +{ + rtems_status_code status; + + if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) { + /* + * This event send hits the critical section but sends to + * another task so doesn't impact this critical section. + */ + status = rtems_event_send( other_task, 0x02 ); + fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" ); + + /* + * This event send hits the main task but doesn't satisfy + * it's blocking condition so it will still block + */ + status = rtems_event_send( main_task, 0x02 ); + fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" ); + + case_hit = true; + } + status = rtems_event_send( main_task, 0x01 ); + fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" ); +} + +static bool test_body_event_from_isr( void *arg ) +{ + rtems_status_code status; + rtems_event_set out; + + (void) arg; + + status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 0, &out ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + return case_hit; +} + +static rtems_timer_service_routine test_event_with_timeout_from_isr( + rtems_id timer, + void *arg +) +{ + rtems_status_code status; + + if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) { + /* + * We want to catch the task while it is blocking. Otherwise + * just send and make it happy. + */ + case_hit = true; + } + status = rtems_event_send( main_task, 0x01 ); + fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" ); +} + +static bool test_body_event_with_timeout_from_isr( void *arg ) +{ + rtems_status_code status; + rtems_event_set out; + + (void) arg; + + status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 1, &out ); + rtems_test_assert( status == RTEMS_SUCCESSFUL || status == RTEMS_TIMEOUT ); + + return case_hit; +} + +rtems_task Init( + rtems_task_argument argument +) +{ + rtems_status_code status; + + TEST_BEGIN(); + + main_task = rtems_task_self(); + + status = rtems_task_create( + 0xa5a5a5a5, + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &other_task + ); + directive_failed( status, "rtems_task_create" ); + + /* + * Test Event send successful from ISR -- receive is forever + */ + + case_hit = false; + interrupt_critical_section_test( + test_body_event_from_isr, + NULL, + test_event_from_isr + ); + + printf( + "Event sent from ISR hitting synchronization point has %soccurred\n", + case_hit ? "" : "NOT " + ); + + rtems_test_assert( case_hit ); + + /* + * Test Event send successful from ISR -- receive has timeout + */ + + case_hit = false; + interrupt_critical_section_test( + test_body_event_with_timeout_from_isr, + NULL, + test_event_with_timeout_from_isr + ); + + printf( + "Event sent from ISR (with timeout) hitting synchronization " + "point has %soccurred\n", + case_hit ? "" : "NOT " + ); + + rtems_test_assert( case_hit ); + + TEST_END(); + rtems_test_exit( 0 ); +} diff --git a/testsuites/sptests/spintrcritical21/spintrcritical21.doc b/testsuites/sptests/spintrcritical21/spintrcritical21.doc new file mode 100644 index 0000000000..94423e107f --- /dev/null +++ b/testsuites/sptests/spintrcritical21/spintrcritical21.doc @@ -0,0 +1,22 @@ +# COPYRIGHT (c) 1989-2009. +# On-Line Applications Research Corporation (OAR). +# +# 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. +# + +This file describes the directives and concepts tested by this test set. + +test set name: spintrcritical21 + +directives: + + rtems_event_receive + rtems_event_send + +concepts: + ++ Ensure that the interrupt critical section for sending an event from an + ISR while the receiving task is in the process of blocking with and withing + timeout is handled properly. diff --git a/testsuites/sptests/spintrcritical21/spintrcritical21.scn b/testsuites/sptests/spintrcritical21/spintrcritical21.scn new file mode 100644 index 0000000000..d7a1998d0a --- /dev/null +++ b/testsuites/sptests/spintrcritical21/spintrcritical21.scn @@ -0,0 +1,4 @@ +*** BEGIN OF TEST SPINTRCRITICAL 21 *** +Event sent from ISR hitting synchronization point has occurred +Event sent from ISR (with timeout) hitting synchronization point has occurred +*** END OF TEST SPINTRCRITICAL 21 *** diff --git a/testsuites/sptests/spintrcritical21/system.h b/testsuites/sptests/spintrcritical21/system.h new file mode 100644 index 0000000000..f9111c0412 --- /dev/null +++ b/testsuites/sptests/spintrcritical21/system.h @@ -0,0 +1,39 @@ +/* system.h + * + * This include file contains information that is included in every + * function in the test set. + * + * COPYRIGHT (c) 1989-2007. + * On-Line Applications Research Corporation (OAR). + * + * 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. + */ + +#include <tmacros.h> + +/* functions */ + +rtems_task Init( + rtems_task_argument argument +); + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_MICROSECONDS_PER_TICK 1000 + +#define CONFIGURE_MAXIMUM_TASKS 2 +#define CONFIGURE_MAXIMUM_TIMERS 1 +#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1 + +#include <rtems/confdefs.h> + +/* end of include file */ |