mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-28 08:30:11 +08:00
sptests/sp39: Convert to sptests/spintrcritical21
Use interrupt critical section test support. Do not print end of test message in case of failure.
This commit is contained in:
@@ -6,7 +6,7 @@ _SUBDIRS = \
|
||||
sp01 sp02 sp03 sp04 sp05 sp06 sp07 sp08 \
|
||||
sp10 sp11 sp12 sp13 sp14 sp15 sp16 sp17 sp18 sp19 \
|
||||
sp20 sp21 sp22 sp23 sp24 sp25 sp26 sp27 sp27a \
|
||||
sp30 sp31 sp32 sp33 sp34 sp35 sp37 sp38 sp39 \
|
||||
sp30 sp31 sp32 sp33 sp34 sp35 sp37 sp38 \
|
||||
sp40 sp41 sp42 sp43 sp44 sp45 sp46 sp47 sp48 sp49 \
|
||||
sp50 sp51 sp52 sp53 sp54 sp55 sp56 sp57 sp58 sp59 \
|
||||
sp60 sp62 sp63 sp64 sp65 sp66 sp67 sp68 sp69 \
|
||||
@@ -53,6 +53,7 @@ _SUBDIRS += sptls02
|
||||
endif
|
||||
_SUBDIRS += sptls01
|
||||
_SUBDIRS += spintrcritical20
|
||||
_SUBDIRS += spintrcritical21
|
||||
_SUBDIRS += spcontext01
|
||||
_SUBDIRS += spfatal26
|
||||
_SUBDIRS += speventtransient01
|
||||
|
||||
@@ -53,6 +53,7 @@ spcpucounter01/Makefile
|
||||
sptls02/Makefile
|
||||
sptls01/Makefile
|
||||
spintrcritical20/Makefile
|
||||
spintrcritical21/Makefile
|
||||
spcontext01/Makefile
|
||||
spfatal26/Makefile
|
||||
spinternalerror02/Makefile
|
||||
@@ -98,7 +99,6 @@ sp35/Makefile
|
||||
sp36/Makefile
|
||||
sp37/Makefile
|
||||
sp38/Makefile
|
||||
sp39/Makefile
|
||||
sp40/Makefile
|
||||
sp41/Makefile
|
||||
sp42/Makefile
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
|
||||
rtems_tests_PROGRAMS = sp39
|
||||
sp39_SOURCES = init.c system.h
|
||||
|
||||
dist_rtems_tests_DATA = sp39.scn
|
||||
dist_rtems_tests_DATA += sp39.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 = $(sp39_OBJECTS)
|
||||
LINK_LIBS = $(sp39_LDLIBS)
|
||||
|
||||
sp39$(EXEEXT): $(sp39_OBJECTS) $(sp39_DEPENDENCIES)
|
||||
@rm -f sp39$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.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
|
||||
@@ -16,9 +16,11 @@
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
#include <intrcritical.h>
|
||||
|
||||
#include <rtems/rtems/eventimpl.h>
|
||||
|
||||
const char rtems_test_name[] = "SP 39";
|
||||
const char rtems_test_name[] = "SPINTRCRITICAL 21";
|
||||
|
||||
/*
|
||||
* ERROR CHECKING NOTE:
|
||||
@@ -28,21 +30,13 @@ const char rtems_test_name[] = "SP 39";
|
||||
* fatal_directive_check_status_only() not directive_failed().
|
||||
*/
|
||||
|
||||
rtems_timer_service_routine test_event_from_isr(
|
||||
rtems_id timer,
|
||||
void *arg
|
||||
);
|
||||
rtems_timer_service_routine test_event_with_timeout_from_isr(
|
||||
rtems_id timer,
|
||||
void *arg
|
||||
);
|
||||
static volatile bool case_hit;
|
||||
|
||||
volatile bool case_hit;
|
||||
static rtems_id main_task;
|
||||
|
||||
rtems_id main_task;
|
||||
rtems_id other_task;
|
||||
static rtems_id other_task;
|
||||
|
||||
rtems_timer_service_routine test_event_from_isr(
|
||||
static rtems_timer_service_routine test_event_from_isr(
|
||||
rtems_id timer,
|
||||
void *arg
|
||||
)
|
||||
@@ -64,13 +58,26 @@ rtems_timer_service_routine test_event_from_isr(
|
||||
status = rtems_event_send( main_task, 0x02 );
|
||||
fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
|
||||
|
||||
case_hit = TRUE;
|
||||
case_hit = true;
|
||||
}
|
||||
status = rtems_event_send( main_task, 0x01 );
|
||||
fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
|
||||
}
|
||||
|
||||
rtems_timer_service_routine test_event_with_timeout_from_isr(
|
||||
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
|
||||
)
|
||||
@@ -82,33 +89,35 @@ rtems_timer_service_routine test_event_with_timeout_from_isr(
|
||||
* We want to catch the task while it is blocking. Otherwise
|
||||
* just send and make it happy.
|
||||
*/
|
||||
case_hit = TRUE;
|
||||
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;
|
||||
rtems_id timer;
|
||||
rtems_event_set out;
|
||||
int i;
|
||||
int max;
|
||||
uint32_t iterations = 0;
|
||||
|
||||
TEST_BEGIN();
|
||||
|
||||
main_task = rtems_task_self();
|
||||
|
||||
/*
|
||||
* Timer used in multiple ways
|
||||
*/
|
||||
status = rtems_timer_create( 1, &timer );
|
||||
directive_failed( status, "rtems_timer_create" );
|
||||
|
||||
status = rtems_task_create(
|
||||
0xa5a5a5a5,
|
||||
1,
|
||||
@@ -122,71 +131,40 @@ rtems_task Init(
|
||||
/*
|
||||
* Test Event send successful from ISR -- receive is forever
|
||||
*/
|
||||
case_hit = FALSE;
|
||||
iterations = 0;
|
||||
max = 1;
|
||||
|
||||
while (1) {
|
||||
if ( case_hit )
|
||||
break;
|
||||
status = rtems_timer_fire_after( timer, 1, test_event_from_isr, NULL );
|
||||
directive_failed( status, "timer_fire_after failed" );
|
||||
|
||||
for (i=0 ; i<max ; i++ )
|
||||
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_SATISFIED )
|
||||
break;
|
||||
|
||||
status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 0, &out );
|
||||
directive_failed( status, "rtems_event_receive" );
|
||||
if ( case_hit == TRUE )
|
||||
break;
|
||||
max += 2;
|
||||
|
||||
/* with our clock tick, this is about 30 seconds */
|
||||
if ( ++iterations >= 4L * 1000L * 30L)
|
||||
break;
|
||||
}
|
||||
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 == TRUE ) ? "" : "NOT ")
|
||||
case_hit ? "" : "NOT "
|
||||
);
|
||||
|
||||
rtems_test_assert( case_hit );
|
||||
|
||||
/*
|
||||
* Test Event send successful from ISR -- receive has timeout
|
||||
*/
|
||||
case_hit = FALSE;
|
||||
iterations = 0;
|
||||
max = 1;
|
||||
|
||||
while (1) {
|
||||
if ( case_hit )
|
||||
break;
|
||||
status = rtems_timer_fire_after(
|
||||
timer, 1, test_event_with_timeout_from_isr, NULL );
|
||||
directive_failed( status, "timer_fire_after failed" );
|
||||
|
||||
for (i=0 ; i<max ; i++ )
|
||||
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_SATISFIED )
|
||||
break;
|
||||
|
||||
status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 10, &out );
|
||||
directive_failed( status, "rtems_event_receive" );
|
||||
if ( case_hit == TRUE )
|
||||
break;
|
||||
max += 2;
|
||||
|
||||
/* with our clock tick, this is about 30 seconds */
|
||||
if ( ++iterations >= 4L * 1000L * 30L)
|
||||
break;
|
||||
}
|
||||
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 == TRUE ) ? "" : "NOT ")
|
||||
case_hit ? "" : "NOT "
|
||||
);
|
||||
|
||||
rtems_test_assert( case_hit );
|
||||
|
||||
TEST_END();
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: sp39
|
||||
test set name: spintrcritical21
|
||||
|
||||
directives:
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
*** TEST 39 ***
|
||||
*** 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 39 ***
|
||||
*** END OF TEST SPINTRCRITICAL 21 ***
|
||||
@@ -32,6 +32,7 @@ rtems_task Init(
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||
#define CONFIGURE_MAXIMUM_TIMERS 1
|
||||
#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
Reference in New Issue
Block a user