mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 08:45:10 +08:00
rtems_semaphore_flush test from Eric Norum <eric@cls.usask.ca>.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -64,6 +64,7 @@ sp23/Makefile
|
||||
sp24/Makefile
|
||||
sp25/Makefile
|
||||
sp26/Makefile
|
||||
sp27/Makefile
|
||||
spsize/Makefile
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user