forked from Imagelibrary/rtems
sptests/spintrcritical20: PR2140: New test
This commit is contained in:
@@ -29,6 +29,7 @@ SUBDIRS = \
|
|||||||
spsem01 spsem02 spsimplesched01 spsimplesched02 spsimplesched03 spnsext01 \
|
spsem01 spsem02 spsimplesched01 spsimplesched02 spsimplesched03 spnsext01 \
|
||||||
spedfsched01 spedfsched02 spedfsched03 \
|
spedfsched01 spedfsched02 spedfsched03 \
|
||||||
spcbssched01 spcbssched02 spcbssched03 spqreslib sptimespec01
|
spcbssched01 spcbssched02 spcbssched03 spqreslib sptimespec01
|
||||||
|
SUBDIRS += spintrcritical20
|
||||||
SUBDIRS += spintrcritical19
|
SUBDIRS += spintrcritical19
|
||||||
SUBDIRS += spcontext01
|
SUBDIRS += spcontext01
|
||||||
SUBDIRS += spfatal26
|
SUBDIRS += spfatal26
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ AC_CHECK_SIZEOF([time_t])
|
|||||||
|
|
||||||
# Explicitly list all Makefiles here
|
# Explicitly list all Makefiles here
|
||||||
AC_CONFIG_FILES([Makefile
|
AC_CONFIG_FILES([Makefile
|
||||||
|
spintrcritical20/Makefile
|
||||||
spintrcritical19/Makefile
|
spintrcritical19/Makefile
|
||||||
spcontext01/Makefile
|
spcontext01/Makefile
|
||||||
spfatal26/Makefile
|
spfatal26/Makefile
|
||||||
|
|||||||
20
testsuites/sptests/spintrcritical20/Makefile.am
Normal file
20
testsuites/sptests/spintrcritical20/Makefile.am
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
rtems_tests_PROGRAMS = spintrcritical20
|
||||||
|
spintrcritical20_SOURCES = init.c ../spintrcritical_support/intrcritical.c
|
||||||
|
|
||||||
|
dist_rtems_tests_DATA = spintrcritical20.scn spintrcritical20.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 = $(spintrcritical20_OBJECTS)
|
||||||
|
LINK_LIBS = $(spintrcritical20_LDLIBS)
|
||||||
|
|
||||||
|
spintrcritical20$(EXEEXT): $(spintrcritical20_OBJECTS) $(spintrcritical20_DEPENDENCIES)
|
||||||
|
@rm -f spintrcritical20$(EXEEXT)
|
||||||
|
$(make-exe)
|
||||||
|
|
||||||
|
include $(top_srcdir)/../automake/local.am
|
||||||
165
testsuites/sptests/spintrcritical20/init.c
Normal file
165
testsuites/sptests/spintrcritical20/init.c
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013 embedded brains GmbH. All rights reserved.
|
||||||
|
*
|
||||||
|
* embedded brains GmbH
|
||||||
|
* Dornierstr. 4
|
||||||
|
* 82178 Puchheim
|
||||||
|
* Germany
|
||||||
|
* <rtems@embedded-brains.de>
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <tmacros.h>
|
||||||
|
#include <intrcritical.h>
|
||||||
|
#include <rtems/score/threadqimpl.h>
|
||||||
|
#include <rtems/rtems/semimpl.h>
|
||||||
|
|
||||||
|
#define TEST_NAME "20"
|
||||||
|
|
||||||
|
#define PRIORITY_MASTER 2
|
||||||
|
|
||||||
|
#define PRIORITY_SEMAPHORE 1
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
rtems_id master_task;
|
||||||
|
rtems_id semaphore_task;
|
||||||
|
rtems_id semaphore_id;
|
||||||
|
Thread_Control *semaphore_task_tcb;
|
||||||
|
bool thread_queue_was_null;
|
||||||
|
bool status_was_successful;
|
||||||
|
bool status_was_timeout;
|
||||||
|
} test_context;
|
||||||
|
|
||||||
|
static test_context ctx_instance;
|
||||||
|
|
||||||
|
static void semaphore_task(rtems_task_argument arg)
|
||||||
|
{
|
||||||
|
test_context *ctx = (test_context *) arg;
|
||||||
|
|
||||||
|
ctx->semaphore_task_tcb = _Thread_Get_executing();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
rtems_status_code sc = rtems_semaphore_obtain(
|
||||||
|
ctx->semaphore_id,
|
||||||
|
RTEMS_WAIT,
|
||||||
|
RTEMS_NO_TIMEOUT
|
||||||
|
);
|
||||||
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_TIMEOUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void release_semaphore(rtems_id timer, void *arg)
|
||||||
|
{
|
||||||
|
/* The arg is NULL */
|
||||||
|
test_context *ctx = &ctx_instance;
|
||||||
|
rtems_status_code sc = rtems_semaphore_release(ctx->semaphore_id);
|
||||||
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Init(rtems_task_argument ignored)
|
||||||
|
{
|
||||||
|
test_context *ctx = &ctx_instance;
|
||||||
|
int resets = 0;
|
||||||
|
rtems_status_code sc;
|
||||||
|
|
||||||
|
puts("\n\n*** TEST INTERRUPT CRITICAL SECTION " TEST_NAME " ***\n");
|
||||||
|
|
||||||
|
ctx->master_task = rtems_task_self();
|
||||||
|
|
||||||
|
sc = rtems_semaphore_create(
|
||||||
|
rtems_build_name('S', 'E', 'M', 'A'),
|
||||||
|
1,
|
||||||
|
RTEMS_COUNTING_SEMAPHORE,
|
||||||
|
0,
|
||||||
|
&ctx->semaphore_id
|
||||||
|
);
|
||||||
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
|
sc = rtems_task_create(
|
||||||
|
rtems_build_name('S', 'E', 'M', 'A'),
|
||||||
|
PRIORITY_SEMAPHORE,
|
||||||
|
RTEMS_MINIMUM_STACK_SIZE,
|
||||||
|
RTEMS_DEFAULT_MODES,
|
||||||
|
RTEMS_DEFAULT_ATTRIBUTES,
|
||||||
|
&ctx->semaphore_task
|
||||||
|
);
|
||||||
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
|
sc = rtems_task_start(
|
||||||
|
ctx->semaphore_task,
|
||||||
|
semaphore_task,
|
||||||
|
(rtems_task_argument) ctx
|
||||||
|
);
|
||||||
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
|
interrupt_critical_section_test_support_initialize(
|
||||||
|
release_semaphore
|
||||||
|
);
|
||||||
|
|
||||||
|
while (resets < 3) {
|
||||||
|
if (interrupt_critical_section_test_support_delay()) {
|
||||||
|
++resets;
|
||||||
|
}
|
||||||
|
|
||||||
|
_Thread_Disable_dispatch();
|
||||||
|
|
||||||
|
rtems_test_assert(
|
||||||
|
ctx->semaphore_task_tcb->Wait.return_code
|
||||||
|
== CORE_SEMAPHORE_STATUS_SUCCESSFUL
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ctx->semaphore_task_tcb->Wait.queue == NULL) {
|
||||||
|
ctx->thread_queue_was_null = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_Thread_queue_Process_timeout(ctx->semaphore_task_tcb);
|
||||||
|
|
||||||
|
switch (ctx->semaphore_task_tcb->Wait.return_code) {
|
||||||
|
case CORE_SEMAPHORE_STATUS_SUCCESSFUL:
|
||||||
|
ctx->status_was_successful = true;
|
||||||
|
break;
|
||||||
|
case CORE_SEMAPHORE_TIMEOUT:
|
||||||
|
ctx->status_was_timeout = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rtems_test_assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_Thread_Enable_dispatch();
|
||||||
|
}
|
||||||
|
|
||||||
|
rtems_test_assert(ctx->thread_queue_was_null);
|
||||||
|
rtems_test_assert(ctx->status_was_successful);
|
||||||
|
rtems_test_assert(ctx->status_was_timeout);
|
||||||
|
|
||||||
|
puts("*** END OF TEST INTERRUPT CRITICAL SECTION " TEST_NAME " ***");
|
||||||
|
|
||||||
|
rtems_test_exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||||
|
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
|
||||||
|
|
||||||
|
#define CONFIGURE_MICROSECONDS_PER_TICK 1000
|
||||||
|
|
||||||
|
#define CONFIGURE_MAXIMUM_SEMAPHORES 1
|
||||||
|
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||||
|
#define CONFIGURE_MAXIMUM_TIMERS 1
|
||||||
|
|
||||||
|
#define CONFIGURE_INIT_TASK_PRIORITY PRIORITY_MASTER
|
||||||
|
#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
|
||||||
|
#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
|
||||||
|
|
||||||
|
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||||
|
|
||||||
|
#define CONFIGURE_INIT
|
||||||
|
|
||||||
|
#include <rtems/confdefs.h>
|
||||||
13
testsuites/sptests/spintrcritical20/spintrcritical20.doc
Normal file
13
testsuites/sptests/spintrcritical20/spintrcritical20.doc
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
This file describes the directives and concepts tested by this test set.
|
||||||
|
|
||||||
|
test set name: spintrcritical20
|
||||||
|
|
||||||
|
directives:
|
||||||
|
|
||||||
|
- _Thread_queue_Dequeue()
|
||||||
|
- _Thread_queue_Process_timeout()
|
||||||
|
|
||||||
|
concepts:
|
||||||
|
|
||||||
|
- Ensure that _Thread_queue_Process_timeout() works in case it is
|
||||||
|
interrupted and _Thread_queue_Dequeue() is called.
|
||||||
4
testsuites/sptests/spintrcritical20/spintrcritical20.scn
Normal file
4
testsuites/sptests/spintrcritical20/spintrcritical20.scn
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*** TEST INTERRUPT CRITICAL SECTION 20 ***
|
||||||
|
|
||||||
|
Support - rtems_timer_create - creating timer 1
|
||||||
|
*** END OF TEST INTERRUPT CRITICAL SECTION 20 ***
|
||||||
Reference in New Issue
Block a user