rtems_semaphore_flush test from Eric Norum <eric@cls.usask.ca>.

This commit is contained in:
Joel Sherrill
1999-11-10 20:36:25 +00:00
parent cbccd37599
commit 74db82a343
11 changed files with 290 additions and 29 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ all-local: $(PREINSTALLDIRS)
## sp10 and spfatal are not included for now
SUBDIRS = . sp01 sp02 sp03 sp04 sp05 sp06 sp07 sp08 sp09 sp11 sp12 sp13 sp14 \
sp15 sp16 sp17 sp19 sp20 sp21 sp22 sp23 sp24 sp25 sp26 spsize
sp15 sp16 sp17 sp19 sp20 sp21 sp22 sp23 sp24 sp25 sp26 sp27 spsize
include $(top_srcdir)/../../../../automake/subdirs.am
include $(top_srcdir)/../../../../automake/local.am
+1
View File
@@ -64,6 +64,7 @@ sp23/Makefile
sp24/Makefile
sp25/Makefile
sp26/Makefile
sp27/Makefile
spsize/Makefile
)
+81
View File
@@ -0,0 +1,81 @@
#
# $Id$
#
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
top_builddir = ..
subdir = sp27
RTEMS_ROOT = @RTEMS_ROOT@
PROJECT_ROOT = @PROJECT_ROOT@
VPATH = @srcdir@
TEST = sp27
MANAGERS = all
# C source names, if any, go here -- minus the .c
C_PIECES = init
C_FILES = $(C_PIECES:%=%.c)
C_O_FILES = $(C_PIECES:%=${ARCH}/%.o)
H_FILES =
DOCTYPES = scn doc
DOCS = $(DOCTYPES:%=$(TEST).%)
SRCS = $(DOCS) $(C_FILES) $(H_FILES)
OBJS = $(C_O_FILES)
PRINT_SRCS = $(DOCS)
PGM = ${ARCH}/$(TEST).exe
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(RTEMS_ROOT)/make/leaf.cfg
INSTALL_CHANGE = @INSTALL_CHANGE@
PACKHEX = @PACKHEX@
mkinstalldirs = $(SHELL) $(top_srcdir)/@RTEMS_TOPdir@/mkinstalldirs
INSTALLDIRS = $(PROJECT_RELEASE)/tests/screens/sptests
$(INSTALLDIRS):
@$(mkinstalldirs) $(INSTALLDIRS)
#
# (OPTIONAL) Add local stuff here using +=
#
DEFINES +=
CPPFLAGS +=
CFLAGS +=
LD_PATHS +=
LD_LIBS +=
LDFLAGS +=
#
# Add your list of files to delete here. The config files
# already know how to delete some stuff, so you may want
# to just run 'make clean' first to see what gets missed.
# 'make clobber' already includes 'make clean'
#
CLEAN_ADDITIONS +=
CLOBBER_ADDITIONS +=
all: ${ARCH} $(SRCS) $(PGM)
$(INSTALL_VARIANT) -m 755 ${PGM} $(PROJECT_RELEASE)/tests
$(INSTALL_CHANGE) $(srcdir)/$(TEST).scn \
$(PROJECT_RELEASE)/tests/screens/sptests/$(TEST).scn
${PGM}: $(OBJS) $(LINK_FILES)
$(make-exe)
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) \
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-27
View File
@@ -1,27 +0,0 @@
#
# $Id$
#
This test will be for rtems_semaphore_flush once it is written.
To avoid scheduling problems in the printout, it would be better to
have the test program:
volatile int bFlag, cFlag;
TaskA:
create semaphore with initial count 0
start taskB and TaskC (Higher priority than taskA, no
round-robin)
print bFlag, cFlag (should both be 0)
semaphore_flush
print bFlag, cFlag (should both be 1)
TaskB/C:
obtain semaphore
set flag (B or C as appropriate)
suspend/delete self
Successful test would show message from both tasks B and C after the
message from task A.
+103
View File
@@ -0,0 +1,103 @@
/*
* Test for rtems_semaphore_flush
*
* $Id$
*/
#include <bsp.h>
rtems_task Init (rtems_task_argument argument);
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
#define CONFIGURE_MICROSECONDS_PER_TICK 52429
#define CONFIGURE_INIT
#include <confdefs.h>
#include <rtems/error.h>
#include <stdio.h>
#define NTASK 4
rtems_id semaphore;
volatile int flags[NTASK];
rtems_task
subtask (rtems_task_argument arg)
{
rtems_status_code sc;
for (;;) {
flags[arg]++;
sc = rtems_semaphore_obtain (semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc == RTEMS_SUCCESSFUL)
puts ("Obtained semaphore -- and should not have done so!");
else if (sc != RTEMS_UNSATISFIED)
printf ("Can't get semaphore: %s\n", rtems_status_text (sc));
}
}
void
starttask (int arg)
{
rtems_id tid;
rtems_status_code sc;
rtems_task_priority priority;
rtems_task_set_priority (RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &priority);
sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', arg + 'A'),
priority,
10000,
RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
&tid);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't create task: %s\n", rtems_status_text (sc));
rtems_task_suspend (RTEMS_SELF);
}
sc = rtems_task_start (tid, subtask, arg);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't start task: %s\n", rtems_status_text (sc));
rtems_task_suspend (RTEMS_SELF);
}
}
rtems_task
Init (rtems_task_argument ignored)
{
int pass, i;
rtems_status_code sc;
puts("**** Semaphore flush test ****");
sc = rtems_semaphore_create (
rtems_build_name ('S', 'E', 'M', 'F'),
0,
RTEMS_LOCAL|RTEMS_BINARY_SEMAPHORE|RTEMS_NO_INHERIT_PRIORITY|RTEMS_NO_PRIORITY_CEILING|RTEMS_FIFO,
0,
&semaphore);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't flush semaphore: %s\n", rtems_status_text (sc));
exit (1);
}
for (i = 0 ; i < NTASK ; i++)
starttask (i);
for (pass = 1 ; pass < 10 ; pass++) {
rtems_task_wake_after (1);
for (i = 0 ; i < NTASK ; i++) {
if (flags[i] != pass)
printf ("flags[%d] = %d -- expected %d\n", i, flags[i], pass);
}
sc = rtems_semaphore_flush (semaphore);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't flush semaphore: %s\n", rtems_status_text (sc));
exit (1);
}
}
puts ("**** Semaphore flush test succeeded ****");
exit (1);
}
View File
View File
+1 -1
View File
@@ -15,7 +15,7 @@ all-local: $(PREINSTALLDIRS)
## sp10 and spfatal are not included for now
SUBDIRS = . sp01 sp02 sp03 sp04 sp05 sp06 sp07 sp08 sp09 sp11 sp12 sp13 sp14 \
sp15 sp16 sp17 sp19 sp20 sp21 sp22 sp23 sp24 sp25 sp26 spsize
sp15 sp16 sp17 sp19 sp20 sp21 sp22 sp23 sp24 sp25 sp26 sp27 spsize
include $(top_srcdir)/../../../../automake/subdirs.am
include $(top_srcdir)/../../../../automake/local.am
+103
View File
@@ -0,0 +1,103 @@
/*
* Test for rtems_semaphore_flush
*
* $Id$
*/
#include <bsp.h>
rtems_task Init (rtems_task_argument argument);
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
#define CONFIGURE_MICROSECONDS_PER_TICK 52429
#define CONFIGURE_INIT
#include <confdefs.h>
#include <rtems/error.h>
#include <stdio.h>
#define NTASK 4
rtems_id semaphore;
volatile int flags[NTASK];
rtems_task
subtask (rtems_task_argument arg)
{
rtems_status_code sc;
for (;;) {
flags[arg]++;
sc = rtems_semaphore_obtain (semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc == RTEMS_SUCCESSFUL)
puts ("Obtained semaphore -- and should not have done so!");
else if (sc != RTEMS_UNSATISFIED)
printf ("Can't get semaphore: %s\n", rtems_status_text (sc));
}
}
void
starttask (int arg)
{
rtems_id tid;
rtems_status_code sc;
rtems_task_priority priority;
rtems_task_set_priority (RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &priority);
sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', arg + 'A'),
priority,
10000,
RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
&tid);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't create task: %s\n", rtems_status_text (sc));
rtems_task_suspend (RTEMS_SELF);
}
sc = rtems_task_start (tid, subtask, arg);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't start task: %s\n", rtems_status_text (sc));
rtems_task_suspend (RTEMS_SELF);
}
}
rtems_task
Init (rtems_task_argument ignored)
{
int pass, i;
rtems_status_code sc;
puts("**** Semaphore flush test ****");
sc = rtems_semaphore_create (
rtems_build_name ('S', 'E', 'M', 'F'),
0,
RTEMS_LOCAL|RTEMS_BINARY_SEMAPHORE|RTEMS_NO_INHERIT_PRIORITY|RTEMS_NO_PRIORITY_CEILING|RTEMS_FIFO,
0,
&semaphore);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't flush semaphore: %s\n", rtems_status_text (sc));
exit (1);
}
for (i = 0 ; i < NTASK ; i++)
starttask (i);
for (pass = 1 ; pass < 10 ; pass++) {
rtems_task_wake_after (1);
for (i = 0 ; i < NTASK ; i++) {
if (flags[i] != pass)
printf ("flags[%d] = %d -- expected %d\n", i, flags[i], pass);
}
sc = rtems_semaphore_flush (semaphore);
if (sc != RTEMS_SUCCESSFUL) {
printf ("Can't flush semaphore: %s\n", rtems_status_text (sc));
exit (1);
}
}
puts ("**** Semaphore flush test succeeded ****");
exit (1);
}
View File
View File