forked from Imagelibrary/rtems
tests: atomic support for RTEMS. SMP tests for atomic operations.
This commit is contained in:
22
testsuites/smptests/smpatomic01/Makefile.am
Normal file
22
testsuites/smptests/smpatomic01/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
rtems_tests_PROGRAMS = smpatomic01
|
||||
smpatomic01_SOURCES = init.c tasks.c system.h ../../support/src/locked_print.c
|
||||
|
||||
dist_rtems_tests_DATA = smpatomic01.scn
|
||||
dist_rtems_tests_DATA += smpatomic01.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 = $(smpatomic01_OBJECTS)
|
||||
LINK_LIBS = $(smpatomic01_LDLIBS)
|
||||
|
||||
smpatomic01$(EXEEXT): $(smpatomic01_OBJECTS) $(smpatomic01_DEPENDENCIES)
|
||||
@rm -f smpatomic01$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
72
testsuites/smptests/smpatomic01/init.c
Normal file
72
testsuites/smptests/smpatomic01/init.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic load operation.
|
||||
*
|
||||
* 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
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int i;
|
||||
char ch;
|
||||
rtems_id id;
|
||||
rtems_status_code status;
|
||||
bool allDone;
|
||||
|
||||
/* XXX - Delay a bit to allow debug messages from
|
||||
* startup to print. This may need to go away when
|
||||
* debug messages go away.
|
||||
*/
|
||||
locked_print_initialize();
|
||||
|
||||
/* Put start of test message */
|
||||
locked_printf( "\n\n*** SMPatomic01 TEST ***\n" );
|
||||
|
||||
/* Initialize the TaskRan array */
|
||||
for ( i=0; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
TaskRan[i] = false;
|
||||
}
|
||||
|
||||
/* Create and start tasks for each processor */
|
||||
for ( i=1; i< rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
ch = '0' + i;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', ch, ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed( status, "task create" );
|
||||
|
||||
status = rtems_task_start( id, Test_task, i+1 );
|
||||
directive_failed( status, "task start" );
|
||||
}
|
||||
|
||||
/* Wait on the all tasks to run */
|
||||
while (1) {
|
||||
allDone = true;
|
||||
for ( i=1; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
if (TaskRan[i] == false)
|
||||
allDone = false;
|
||||
}
|
||||
if (allDone) {
|
||||
locked_printf( "\n\n*** END OF TEST SMPatomic01 ***\n" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
23
testsuites/smptests/smpatomic01/smpatomic01.doc
Normal file
23
testsuites/smptests/smpatomic01/smpatomic01.doc
Normal file
@@ -0,0 +1,23 @@
|
||||
# COPYRIGHT (c) 1989-2012.
|
||||
# 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.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: smpatomic01
|
||||
|
||||
directives:
|
||||
|
||||
_Atomic_Load_int
|
||||
_Atomic_Load_long
|
||||
_Atomic_Load_ptr
|
||||
_Atomic_Load_32
|
||||
_Atomic_Load_64
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the atomic load operations listed above behave as defined.
|
||||
28
testsuites/smptests/smpatomic01/smpatomic01.scn
Normal file
28
testsuites/smptests/smpatomic01/smpatomic01.scn
Normal file
@@ -0,0 +1,28 @@
|
||||
*** SMPatomic01 TEST ***
|
||||
|
||||
CPU1 _Atomic_Load_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Load_int: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Load_int: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Load_long: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Load_long: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Load_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Load_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Load_ptr: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Load_ptr: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Load_32: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Load_32: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Load_32: SUCCESS
|
||||
|
||||
|
||||
*** END OF TEST SMPatomic01 ***
|
||||
50
testsuites/smptests/smpatomic01/system.h
Normal file
50
testsuites/smptests/smpatomic01/system.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include "tmacros.h"
|
||||
#include "test_support.h"
|
||||
|
||||
/* functions */
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
|
||||
#define CONFIGURE_SMP_APPLICATION
|
||||
#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS \
|
||||
(1 + CONFIGURE_SMP_MAXIMUM_PROCESSORS)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
/* global variables */
|
||||
|
||||
/*
|
||||
* Keep the names and IDs in global variables so another task can use them.
|
||||
*/
|
||||
|
||||
TEST_EXTERN volatile bool TaskRan[ CONFIGURE_SMP_MAXIMUM_PROCESSORS ];
|
||||
|
||||
/*
|
||||
* Handy macros and static inline functions
|
||||
*/
|
||||
|
||||
/* end of include file */
|
||||
80
testsuites/smptests/smpatomic01/tasks.c
Normal file
80
testsuites/smptests/smpatomic01/tasks.c
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic load operation.
|
||||
*
|
||||
* 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 "system.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rtems/rtems/atomic.h>
|
||||
|
||||
#define TEST_REPEAT 200000
|
||||
|
||||
#define ATOMIC_LOAD_NO_BARRIER(NAME, TYPE, cpuid, mem_bar) \
|
||||
{ \
|
||||
Atomic_##TYPE t = (Atomic_##TYPE)-1, a = 0; \
|
||||
unsigned int i; \
|
||||
a = _Atomic_Load_##NAME(&t, mem_bar); \
|
||||
rtems_test_assert(a == t); \
|
||||
for (i = 0; i < TEST_REPEAT; i++){ \
|
||||
t = (Atomic_##TYPE)rand(); \
|
||||
a = _Atomic_Load_##NAME(&t, mem_bar); \
|
||||
rtems_test_assert(a == t); \
|
||||
} \
|
||||
locked_printf("\nCPU%d _Atomic_Load_" #NAME ": SUCCESS\n", cpuid); \
|
||||
}
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int cpu_num;
|
||||
char name[5];
|
||||
char *p;
|
||||
|
||||
/* Get the task name */
|
||||
p = rtems_object_get_name( RTEMS_SELF, 5, name );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
/* Get the CPU Number */
|
||||
cpu_num = bsp_smp_processor_id();
|
||||
|
||||
/* Print that the task is up and running. */
|
||||
/* test relaxed barrier */
|
||||
ATOMIC_LOAD_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_LOAD_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_LOAD_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_LOAD_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
/* test acquire barrier */
|
||||
ATOMIC_LOAD_NO_BARRIER(int, Int, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_LOAD_NO_BARRIER(long, Long, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_LOAD_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_LOAD_NO_BARRIER(32, Int32, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
// ATOMIC_LOAD_NO_BARRIER(64, cpu_num);
|
||||
|
||||
/* Set the flag that the task is up and running */
|
||||
TaskRan[cpu_num] = true;
|
||||
|
||||
/* Drop into a loop which will keep this task on
|
||||
* running on the cpu.
|
||||
*/
|
||||
while(1);
|
||||
}
|
||||
22
testsuites/smptests/smpatomic02/Makefile.am
Normal file
22
testsuites/smptests/smpatomic02/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
rtems_tests_PROGRAMS = smpatomic02
|
||||
smpatomic02_SOURCES = init.c tasks.c system.h ../../support/src/locked_print.c
|
||||
|
||||
dist_rtems_tests_DATA = smpatomic02.scn
|
||||
dist_rtems_tests_DATA += smpatomic02.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 = $(smpatomic02_OBJECTS)
|
||||
LINK_LIBS = $(smpatomic02_LDLIBS)
|
||||
|
||||
smpatomic02$(EXEEXT): $(smpatomic02_OBJECTS) $(smpatomic02_DEPENDENCIES)
|
||||
@rm -f smpatomic01$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
72
testsuites/smptests/smpatomic02/init.c
Normal file
72
testsuites/smptests/smpatomic02/init.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic store operation.
|
||||
*
|
||||
* 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
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int i;
|
||||
char ch;
|
||||
rtems_id id;
|
||||
rtems_status_code status;
|
||||
bool allDone;
|
||||
|
||||
/* XXX - Delay a bit to allow debug messages from
|
||||
* startup to print. This may need to go away when
|
||||
* debug messages go away.
|
||||
*/
|
||||
locked_print_initialize();
|
||||
|
||||
/* Put start of test message */
|
||||
locked_printf( "\n\n*** SMPatomic02 TEST ***\n" );
|
||||
|
||||
/* Initialize the TaskRan array */
|
||||
for ( i=0; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
TaskRan[i] = false;
|
||||
}
|
||||
|
||||
/* Create and start tasks for each processor */
|
||||
for ( i=1; i< rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
ch = '0' + i;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', ch, ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed( status, "task create" );
|
||||
|
||||
status = rtems_task_start( id, Test_task, i+1 );
|
||||
directive_failed( status, "task start" );
|
||||
}
|
||||
|
||||
/* Wait on the all tasks to run */
|
||||
while (1) {
|
||||
allDone = true;
|
||||
for ( i=1; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
if (TaskRan[i] == false)
|
||||
allDone = false;
|
||||
}
|
||||
if (allDone) {
|
||||
locked_printf( "\n\n*** END OF TEST SMPatomic02 ***\n" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
23
testsuites/smptests/smpatomic02/smpatomic02.doc
Normal file
23
testsuites/smptests/smpatomic02/smpatomic02.doc
Normal file
@@ -0,0 +1,23 @@
|
||||
# COPYRIGHT (c) 1989-2012.
|
||||
# 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.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: smpatomic02
|
||||
|
||||
directives:
|
||||
|
||||
_Atomic_Store_int
|
||||
_Atomic_Store_long
|
||||
_Atomic_Store_ptr
|
||||
_Atomic_Store_32
|
||||
_Atomic_Store_64
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the atomic store operations listed above behave as defined.
|
||||
28
testsuites/smptests/smpatomic02/smpatomic02.scn
Normal file
28
testsuites/smptests/smpatomic02/smpatomic02.scn
Normal file
@@ -0,0 +1,28 @@
|
||||
*** SMPatomic02 TEST ***
|
||||
|
||||
CPU1 _Atomic_Store_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Store_int: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Store_int: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Store_long: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Store_long: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Store_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Store_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Store_ptr: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Store_ptr: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Store_32: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Store_32: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Store_32: SUCCESS
|
||||
|
||||
|
||||
*** END OF TEST SMPatomic02 ***
|
||||
50
testsuites/smptests/smpatomic02/system.h
Normal file
50
testsuites/smptests/smpatomic02/system.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include "tmacros.h"
|
||||
#include "test_support.h"
|
||||
|
||||
/* functions */
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
|
||||
#define CONFIGURE_SMP_APPLICATION
|
||||
#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS \
|
||||
(1 + CONFIGURE_SMP_MAXIMUM_PROCESSORS)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
/* global variables */
|
||||
|
||||
/*
|
||||
* Keep the names and IDs in global variables so another task can use them.
|
||||
*/
|
||||
|
||||
TEST_EXTERN volatile bool TaskRan[ CONFIGURE_SMP_MAXIMUM_PROCESSORS ];
|
||||
|
||||
/*
|
||||
* Handy macros and static inline functions
|
||||
*/
|
||||
|
||||
/* end of include file */
|
||||
80
testsuites/smptests/smpatomic02/tasks.c
Normal file
80
testsuites/smptests/smpatomic02/tasks.c
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic store operation.
|
||||
*
|
||||
* 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 "system.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rtems/rtems/atomic.h>
|
||||
|
||||
#define TEST_REPEAT 200000
|
||||
|
||||
#define ATOMIC_STORE_NO_BARRIER(NAME, TYPE, cpuid, mem_bar) \
|
||||
{ \
|
||||
Atomic_##TYPE t = (Atomic_##TYPE)-1, a = 0; \
|
||||
unsigned int i; \
|
||||
_Atomic_Store_##NAME(&a, t, mem_bar); \
|
||||
rtems_test_assert(a == t); \
|
||||
for (i = 0; i < TEST_REPEAT; i++){ \
|
||||
t = (Atomic_##TYPE)rand(); \
|
||||
_Atomic_Store_##NAME(&a, t, mem_bar); \
|
||||
rtems_test_assert(a == t); \
|
||||
} \
|
||||
locked_printf("\nCPU%d _Atomic_Store_" #NAME ": SUCCESS\n", cpuid); \
|
||||
}
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int cpu_num;
|
||||
char name[5];
|
||||
char *p;
|
||||
|
||||
/* Get the task name */
|
||||
p = rtems_object_get_name( RTEMS_SELF, 5, name );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
/* Get the CPU Number */
|
||||
cpu_num = bsp_smp_processor_id();
|
||||
|
||||
/* Print that the task is up and running. */
|
||||
/* test relaxed barrier */
|
||||
ATOMIC_STORE_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_STORE_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_STORE_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_STORE_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
/* test release barrier */
|
||||
ATOMIC_STORE_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_STORE_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_STORE_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_STORE_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
// ATOMIC_STORE_NO_BARRIER(64, cpu_num);
|
||||
|
||||
/* Set the flag that the task is up and running */
|
||||
TaskRan[cpu_num] = true;
|
||||
|
||||
/* Drop into a loop which will keep this task on
|
||||
* running on the cpu.
|
||||
*/
|
||||
while(1);
|
||||
}
|
||||
22
testsuites/smptests/smpatomic03/Makefile.am
Normal file
22
testsuites/smptests/smpatomic03/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
rtems_tests_PROGRAMS = smpatomic03
|
||||
smpatomic03_SOURCES = init.c tasks.c system.h ../../support/src/locked_print.c
|
||||
|
||||
dist_rtems_tests_DATA = smpatomic03.scn
|
||||
dist_rtems_tests_DATA += smpatomic03.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 = $(smpatomic03_OBJECTS)
|
||||
LINK_LIBS = $(smpatomic03_LDLIBS)
|
||||
|
||||
smpatomic03$(EXEEXT): $(smpatomic03_OBJECTS) $(smpatomic03_DEPENDENCIES)
|
||||
@rm -f smpatomic03$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
72
testsuites/smptests/smpatomic03/init.c
Normal file
72
testsuites/smptests/smpatomic03/init.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic add operation.
|
||||
*
|
||||
* 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
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int i;
|
||||
char ch;
|
||||
rtems_id id;
|
||||
rtems_status_code status;
|
||||
bool allDone;
|
||||
|
||||
/* XXX - Delay a bit to allow debug messages from
|
||||
* startup to print. This may need to go away when
|
||||
* debug messages go away.
|
||||
*/
|
||||
locked_print_initialize();
|
||||
|
||||
/* Put start of test message */
|
||||
locked_printf( "\n\n*** SMPatomic03 TEST ***\n" );
|
||||
|
||||
/* Initialize the TaskRan array */
|
||||
for ( i=0; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
TaskRan[i] = false;
|
||||
}
|
||||
|
||||
/* Create and start tasks for each processor */
|
||||
for ( i=1; i< rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
ch = '0' + i;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', ch, ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed( status, "task create" );
|
||||
|
||||
status = rtems_task_start( id, Test_task, i+1 );
|
||||
directive_failed( status, "task start" );
|
||||
}
|
||||
|
||||
/* Wait on the all tasks to run */
|
||||
while (1) {
|
||||
allDone = true;
|
||||
for ( i=1; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
if (TaskRan[i] == false)
|
||||
allDone = false;
|
||||
}
|
||||
if (allDone) {
|
||||
locked_printf( "\n\n*** END OF TEST SMPatomic03 ***\n" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
23
testsuites/smptests/smpatomic03/smpatomic03.doc
Normal file
23
testsuites/smptests/smpatomic03/smpatomic03.doc
Normal file
@@ -0,0 +1,23 @@
|
||||
# COPYRIGHT (c) 1989-2012.
|
||||
# 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.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: smpatomic03
|
||||
|
||||
directives:
|
||||
|
||||
_Atomic_Fetch_add_int
|
||||
_Atomic_Fetch_add_long
|
||||
_Atomic_Fetch_add_ptr
|
||||
_Atomic_Fetch_add_32
|
||||
_Atomic_Fetch_add_64
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the atomic add operations listed above behave as defined.
|
||||
29
testsuites/smptests/smpatomic03/smpatomic03.scn
Normal file
29
testsuites/smptests/smpatomic03/smpatomic03.scn
Normal file
@@ -0,0 +1,29 @@
|
||||
*** SMPatomic03 TEST ***
|
||||
|
||||
CPU2 _Atomic_Fetch_add_int: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_add_int: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_add_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_add_long: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_add_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_add_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_add_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_add_ptr: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_add_32: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_add_ptr: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_add_32: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_add_32: SUCCESS
|
||||
|
||||
|
||||
*** END OF TEST SMPatomic03 ***
|
||||
|
||||
50
testsuites/smptests/smpatomic03/system.h
Normal file
50
testsuites/smptests/smpatomic03/system.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include "tmacros.h"
|
||||
#include "test_support.h"
|
||||
|
||||
/* functions */
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
|
||||
#define CONFIGURE_SMP_APPLICATION
|
||||
#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS \
|
||||
(1 + CONFIGURE_SMP_MAXIMUM_PROCESSORS)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
/* global variables */
|
||||
|
||||
/*
|
||||
* Keep the names and IDs in global variables so another task can use them.
|
||||
*/
|
||||
|
||||
TEST_EXTERN volatile bool TaskRan[ CONFIGURE_SMP_MAXIMUM_PROCESSORS ];
|
||||
|
||||
/*
|
||||
* Handy macros and static inline functions
|
||||
*/
|
||||
|
||||
/* end of include file */
|
||||
89
testsuites/smptests/smpatomic03/tasks.c
Normal file
89
testsuites/smptests/smpatomic03/tasks.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic add operation.
|
||||
*
|
||||
* 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 "system.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rtems/rtems/atomic.h>
|
||||
|
||||
#define TEST_REPEAT 200000
|
||||
|
||||
#define ATOMIC_FETCH_ADD_NO_BARRIER(NAME, TYPE, cpuid, mem_bar)\
|
||||
{ \
|
||||
Atomic_##TYPE t = 0, a = 0, b = 0; \
|
||||
unsigned int i; \
|
||||
for (i = 0; i < TEST_REPEAT; i++){ \
|
||||
a = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
b = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
t = a; \
|
||||
_Atomic_Fetch_add_##NAME(&t, b, mem_bar); \
|
||||
rtems_test_assert(t == (Atomic_##TYPE)(a + b)); \
|
||||
} \
|
||||
locked_printf("\nCPU%d _Atomic_Fetch_add_" #NAME ": SUCCESS\n", cpuid); \
|
||||
}
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int cpu_num;
|
||||
char name[5];
|
||||
char *p;
|
||||
|
||||
/* Get the task name */
|
||||
p = rtems_object_get_name( RTEMS_SELF, 5, name );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
/* Get the CPU Number */
|
||||
cpu_num = bsp_smp_processor_id();
|
||||
|
||||
/* Print that the task is up and running. */
|
||||
/* test relaxed barrier */
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
/* test acquire barrier */
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(int, Int, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(long, Long, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(32, Int32, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
/* test release barrier */
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_ADD_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
// ATOMIC_FETCH_ADD_NO_BARRIER(64, cpu_num);
|
||||
|
||||
/* Set the flag that the task is up and running */
|
||||
TaskRan[cpu_num] = true;
|
||||
|
||||
/* Drop into a loop which will keep this task on
|
||||
* running on the cpu.
|
||||
*/
|
||||
while(1);
|
||||
}
|
||||
22
testsuites/smptests/smpatomic04/Makefile.am
Normal file
22
testsuites/smptests/smpatomic04/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
rtems_tests_PROGRAMS = smpatomic04
|
||||
smpatomic04_SOURCES = init.c tasks.c system.h ../../support/src/locked_print.c
|
||||
|
||||
dist_rtems_tests_DATA = smpatomic04.scn
|
||||
dist_rtems_tests_DATA += smpatomic04.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 = $(smpatomic04_OBJECTS)
|
||||
LINK_LIBS = $(smpatomic04_LDLIBS)
|
||||
|
||||
smpatomic04$(EXEEXT): $(smpatomic04_OBJECTS) $(smpatomic04_DEPENDENCIES)
|
||||
@rm -f smpatomic04$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
72
testsuites/smptests/smpatomic04/init.c
Normal file
72
testsuites/smptests/smpatomic04/init.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic sub operation.
|
||||
*
|
||||
* 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
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int i;
|
||||
char ch;
|
||||
rtems_id id;
|
||||
rtems_status_code status;
|
||||
bool allDone;
|
||||
|
||||
/* XXX - Delay a bit to allow debug messages from
|
||||
* startup to print. This may need to go away when
|
||||
* debug messages go away.
|
||||
*/
|
||||
locked_print_initialize();
|
||||
|
||||
/* Put start of test message */
|
||||
locked_printf( "\n\n*** SMPatomic04 TEST ***\n" );
|
||||
|
||||
/* Initialize the TaskRan array */
|
||||
for ( i=0; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
TaskRan[i] = false;
|
||||
}
|
||||
|
||||
/* Create and start tasks for each processor */
|
||||
for ( i=1; i< rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
ch = '0' + i;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', ch, ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed( status, "task create" );
|
||||
|
||||
status = rtems_task_start( id, Test_task, i+1 );
|
||||
directive_failed( status, "task start" );
|
||||
}
|
||||
|
||||
/* Wait on the all tasks to run */
|
||||
while (1) {
|
||||
allDone = true;
|
||||
for ( i=1; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
if (TaskRan[i] == false)
|
||||
allDone = false;
|
||||
}
|
||||
if (allDone) {
|
||||
locked_printf( "\n\n*** END OF TEST SMPatomic04 ***\n" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
23
testsuites/smptests/smpatomic04/smpatomic04.doc
Normal file
23
testsuites/smptests/smpatomic04/smpatomic04.doc
Normal file
@@ -0,0 +1,23 @@
|
||||
# COPYRIGHT (c) 1989-2012.
|
||||
# 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.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: smpatomic04
|
||||
|
||||
directives:
|
||||
|
||||
_Atomic_Fetch_sub_int
|
||||
_Atomic_Fetch_sub_long
|
||||
_Atomic_Fetch_sub_ptr
|
||||
_Atomic_Fetch_sub_32
|
||||
_Atomic_Fetch_sub_64
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the atomic sub operations listed above behave as defined.
|
||||
29
testsuites/smptests/smpatomic04/smpatomic04.scn
Normal file
29
testsuites/smptests/smpatomic04/smpatomic04.scn
Normal file
@@ -0,0 +1,29 @@
|
||||
*** SMPatomic04 TEST ***
|
||||
|
||||
CPU2 _Atomic_Fetch_sub_int: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_sub_int: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_sub_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_sub_long: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_sub_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_sub_long: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_sub_ptr: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_sub_ptr: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_sub_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_sub_32: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_sub_32: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_sub_32: SUCCESS
|
||||
|
||||
|
||||
*** END OF TEST SMPatomic04 ***
|
||||
|
||||
50
testsuites/smptests/smpatomic04/system.h
Normal file
50
testsuites/smptests/smpatomic04/system.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include "tmacros.h"
|
||||
#include "test_support.h"
|
||||
|
||||
/* functions */
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
|
||||
#define CONFIGURE_SMP_APPLICATION
|
||||
#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS \
|
||||
(1 + CONFIGURE_SMP_MAXIMUM_PROCESSORS)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
/* global variables */
|
||||
|
||||
/*
|
||||
* Keep the names and IDs in global variables so another task can use them.
|
||||
*/
|
||||
|
||||
TEST_EXTERN volatile bool TaskRan[ CONFIGURE_SMP_MAXIMUM_PROCESSORS ];
|
||||
|
||||
/*
|
||||
* Handy macros and static inline functions
|
||||
*/
|
||||
|
||||
/* end of include file */
|
||||
89
testsuites/smptests/smpatomic04/tasks.c
Normal file
89
testsuites/smptests/smpatomic04/tasks.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic sub operation.
|
||||
*
|
||||
* 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 "system.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rtems/rtems/atomic.h>
|
||||
|
||||
#define TEST_REPEAT 200000
|
||||
|
||||
#define ATOMIC_FETCH_SUB_NO_BARRIER(NAME, TYPE, cpuid, mem_bar)\
|
||||
{ \
|
||||
Atomic_##TYPE t = 0, a = 0, b = 0; \
|
||||
unsigned int i; \
|
||||
for (i = 0; i < TEST_REPEAT; i++){ \
|
||||
a = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
b = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
t = a; \
|
||||
_Atomic_Fetch_sub_##NAME(&t, b, mem_bar); \
|
||||
rtems_test_assert(t == (Atomic_##TYPE)(a - b)); \
|
||||
} \
|
||||
locked_printf("\nCPU%d _Atomic_Fetch_sub_" #NAME ": SUCCESS\n", cpuid); \
|
||||
}
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int cpu_num;
|
||||
char name[5];
|
||||
char *p;
|
||||
|
||||
/* Get the task name */
|
||||
p = rtems_object_get_name( RTEMS_SELF, 5, name );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
/* Get the CPU Number */
|
||||
cpu_num = bsp_smp_processor_id();
|
||||
|
||||
/* Print that the task is up and running. */
|
||||
/* test relaxed barrier */
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
/* test acquire barrier */
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(int, Int, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(long, Long, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(32, Int32, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
/* test release barrier */
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_SUB_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
// ATOMIC_FETCH_SUB_NO_BARRIER(64, cpu_num);
|
||||
|
||||
/* Set the flag that the task is up and running */
|
||||
TaskRan[cpu_num] = true;
|
||||
|
||||
/* Drop into a loop which will keep this task on
|
||||
* running on the cpu.
|
||||
*/
|
||||
while(1);
|
||||
}
|
||||
22
testsuites/smptests/smpatomic05/Makefile.am
Normal file
22
testsuites/smptests/smpatomic05/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
rtems_tests_PROGRAMS = smpatomic05
|
||||
smpatomic05_SOURCES = init.c tasks.c system.h ../../support/src/locked_print.c
|
||||
|
||||
dist_rtems_tests_DATA = smpatomic05.scn
|
||||
dist_rtems_tests_DATA += smpatomic05.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 = $(smpatomic05_OBJECTS)
|
||||
LINK_LIBS = $(smpatomic05_LDLIBS)
|
||||
|
||||
smpatomic05$(EXEEXT): $(smpatomic05_OBJECTS) $(smpatomic05_DEPENDENCIES)
|
||||
@rm -f smpatomic05$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
72
testsuites/smptests/smpatomic05/init.c
Normal file
72
testsuites/smptests/smpatomic05/init.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic and operation.
|
||||
*
|
||||
* 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
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int i;
|
||||
char ch;
|
||||
rtems_id id;
|
||||
rtems_status_code status;
|
||||
bool allDone;
|
||||
|
||||
/* XXX - Delay a bit to allow debug messages from
|
||||
* startup to print. This may need to go away when
|
||||
* debug messages go away.
|
||||
*/
|
||||
locked_print_initialize();
|
||||
|
||||
/* Put start of test message */
|
||||
locked_printf( "\n\n*** SMPatomic05 TEST ***\n" );
|
||||
|
||||
/* Initialize the TaskRan array */
|
||||
for ( i=0; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
TaskRan[i] = false;
|
||||
}
|
||||
|
||||
/* Create and start tasks for each processor */
|
||||
for ( i=1; i< rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
ch = '0' + i;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', ch, ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed( status, "task create" );
|
||||
|
||||
status = rtems_task_start( id, Test_task, i+1 );
|
||||
directive_failed( status, "task start" );
|
||||
}
|
||||
|
||||
/* Wait on the all tasks to run */
|
||||
while (1) {
|
||||
allDone = true;
|
||||
for ( i=1; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
if (TaskRan[i] == false)
|
||||
allDone = false;
|
||||
}
|
||||
if (allDone) {
|
||||
locked_printf( "\n\n*** END OF TEST SMPatomic05 ***\n" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
23
testsuites/smptests/smpatomic05/smpatomic05.doc
Normal file
23
testsuites/smptests/smpatomic05/smpatomic05.doc
Normal file
@@ -0,0 +1,23 @@
|
||||
# COPYRIGHT (c) 1989-2012.
|
||||
# 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.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: smpatomic05
|
||||
|
||||
directives:
|
||||
|
||||
_Atomic_Fetch_and_int
|
||||
_Atomic_Fetch_and_long
|
||||
_Atomic_Fetch_and_ptr
|
||||
_Atomic_Fetch_and_32
|
||||
_Atomic_Fetch_and_64
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the atomic and operations listed above behave as defined.
|
||||
29
testsuites/smptests/smpatomic05/smpatomic05.scn
Normal file
29
testsuites/smptests/smpatomic05/smpatomic05.scn
Normal file
@@ -0,0 +1,29 @@
|
||||
*** SMPatomic05 TEST ***
|
||||
|
||||
CPU2 _Atomic_Fetch_and_int: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_and_int: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_and_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_and_long: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_and_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_and_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_and_long: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_and_32: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_and_ptr: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_and_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_and_32: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_and_32: SUCCESS
|
||||
|
||||
|
||||
*** END OF TEST SMPatomic05 ***
|
||||
|
||||
50
testsuites/smptests/smpatomic05/system.h
Normal file
50
testsuites/smptests/smpatomic05/system.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include "tmacros.h"
|
||||
#include "test_support.h"
|
||||
|
||||
/* functions */
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
|
||||
#define CONFIGURE_SMP_APPLICATION
|
||||
#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS \
|
||||
(1 + CONFIGURE_SMP_MAXIMUM_PROCESSORS)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
/* global variables */
|
||||
|
||||
/*
|
||||
* Keep the names and IDs in global variables so another task can use them.
|
||||
*/
|
||||
|
||||
TEST_EXTERN volatile bool TaskRan[ CONFIGURE_SMP_MAXIMUM_PROCESSORS ];
|
||||
|
||||
/*
|
||||
* Handy macros and static inline functions
|
||||
*/
|
||||
|
||||
/* end of include file */
|
||||
89
testsuites/smptests/smpatomic05/tasks.c
Normal file
89
testsuites/smptests/smpatomic05/tasks.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic and operation.
|
||||
*
|
||||
* 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 "system.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rtems/rtems/atomic.h>
|
||||
|
||||
#define TEST_REPEAT 200000
|
||||
|
||||
#define ATOMIC_FETCH_AND_NO_BARRIER(NAME, TYPE, cpuid, mem_bar)\
|
||||
{ \
|
||||
Atomic_##TYPE t = 0, a = 0, b = 0; \
|
||||
unsigned int i; \
|
||||
for (i = 0; i < TEST_REPEAT; i++){ \
|
||||
a = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
b = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
t = a; \
|
||||
_Atomic_Fetch_and_##NAME(&t, b, mem_bar); \
|
||||
rtems_test_assert(t == (Atomic_##TYPE)(a & b)); \
|
||||
} \
|
||||
locked_printf("\nCPU%d _Atomic_Fetch_and_" #NAME ": SUCCESS\n", cpuid); \
|
||||
}
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int cpu_num;
|
||||
char name[5];
|
||||
char *p;
|
||||
|
||||
/* Get the task name */
|
||||
p = rtems_object_get_name( RTEMS_SELF, 5, name );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
/* Get the CPU Number */
|
||||
cpu_num = bsp_smp_processor_id();
|
||||
|
||||
/* Print that the task is up and running. */
|
||||
/* test relaxed barrier */
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
/* test acquire barrier */
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(int, Int, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(long, Long, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(32, Int32, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
/* test release barrier */
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_AND_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
// ATOMIC_FETCH_AND_NO_BARRIER(64, cpu_num);
|
||||
|
||||
/* Set the flag that the task is up and running */
|
||||
TaskRan[cpu_num] = true;
|
||||
|
||||
/* Drop into a loop which will keep this task on
|
||||
* running on the cpu.
|
||||
*/
|
||||
while(1);
|
||||
}
|
||||
22
testsuites/smptests/smpatomic06/Makefile.am
Normal file
22
testsuites/smptests/smpatomic06/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
rtems_tests_PROGRAMS = smpatomic06
|
||||
smpatomic06_SOURCES = init.c tasks.c system.h ../../support/src/locked_print.c
|
||||
|
||||
dist_rtems_tests_DATA = smpatomic06.scn
|
||||
dist_rtems_tests_DATA += smpatomic06.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 = $(smpatomic06_OBJECTS)
|
||||
LINK_LIBS = $(smpatomic06_LDLIBS)
|
||||
|
||||
smpatomic06$(EXEEXT): $(smpatomic06_OBJECTS) $(smpatomic06_DEPENDENCIES)
|
||||
@rm -f smpatomic06$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
72
testsuites/smptests/smpatomic06/init.c
Normal file
72
testsuites/smptests/smpatomic06/init.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic or operation.
|
||||
*
|
||||
* 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
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int i;
|
||||
char ch;
|
||||
rtems_id id;
|
||||
rtems_status_code status;
|
||||
bool allDone;
|
||||
|
||||
/* XXX - Delay a bit to allow debug messages from
|
||||
* startup to print. This may need to go away when
|
||||
* debug messages go away.
|
||||
*/
|
||||
locked_print_initialize();
|
||||
|
||||
/* Put start of test message */
|
||||
locked_printf( "\n\n*** SMPatomic06 TEST ***\n" );
|
||||
|
||||
/* Initialize the TaskRan array */
|
||||
for ( i=0; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
TaskRan[i] = false;
|
||||
}
|
||||
|
||||
/* Create and start tasks for each processor */
|
||||
for ( i=1; i< rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
ch = '0' + i;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', ch, ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed( status, "task create" );
|
||||
|
||||
status = rtems_task_start( id, Test_task, i+1 );
|
||||
directive_failed( status, "task start" );
|
||||
}
|
||||
|
||||
/* Wait on the all tasks to run */
|
||||
while (1) {
|
||||
allDone = true;
|
||||
for ( i=1; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
if (TaskRan[i] == false)
|
||||
allDone = false;
|
||||
}
|
||||
if (allDone) {
|
||||
locked_printf( "\n\n*** END OF TEST SMPatomic06 ***\n" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
23
testsuites/smptests/smpatomic06/smpatomic06.doc
Normal file
23
testsuites/smptests/smpatomic06/smpatomic06.doc
Normal file
@@ -0,0 +1,23 @@
|
||||
# COPYRIGHT (c) 1989-2012.
|
||||
# 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.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: smpatomic06
|
||||
|
||||
directives:
|
||||
|
||||
_Atomic_Fetch_or_int
|
||||
_Atomic_Fetch_or_long
|
||||
_Atomic_Fetch_or_ptr
|
||||
_Atomic_Fetch_or_32
|
||||
_Atomic_Fetch_or_64
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the atomic or operations listed above behave as defined.
|
||||
29
testsuites/smptests/smpatomic06/smpatomic06.scn
Normal file
29
testsuites/smptests/smpatomic06/smpatomic06.scn
Normal file
@@ -0,0 +1,29 @@
|
||||
*** SMPatomic06 TEST ***
|
||||
|
||||
CPU2 _Atomic_Fetch_or_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_or_long: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_or_int: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_or_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_or_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_or_long: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Fetch_or_32: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_or_long: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_or_ptr: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_or_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Fetch_or_32: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Fetch_or_32: SUCCESS
|
||||
|
||||
|
||||
*** END OF TEST SMPatomic06 ***
|
||||
|
||||
50
testsuites/smptests/smpatomic06/system.h
Normal file
50
testsuites/smptests/smpatomic06/system.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include "tmacros.h"
|
||||
#include "test_support.h"
|
||||
|
||||
/* functions */
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
|
||||
#define CONFIGURE_SMP_APPLICATION
|
||||
#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS \
|
||||
(1 + CONFIGURE_SMP_MAXIMUM_PROCESSORS)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
/* global variables */
|
||||
|
||||
/*
|
||||
* Keep the names and IDs in global variables so another task can use them.
|
||||
*/
|
||||
|
||||
TEST_EXTERN volatile bool TaskRan[ CONFIGURE_SMP_MAXIMUM_PROCESSORS ];
|
||||
|
||||
/*
|
||||
* Handy macros and static inline functions
|
||||
*/
|
||||
|
||||
/* end of include file */
|
||||
89
testsuites/smptests/smpatomic06/tasks.c
Normal file
89
testsuites/smptests/smpatomic06/tasks.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic or operation.
|
||||
*
|
||||
* 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 "system.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rtems/rtems/atomic.h>
|
||||
|
||||
#define TEST_REPEAT 200000
|
||||
|
||||
#define ATOMIC_FETCH_OR_NO_BARRIER(NAME, TYPE, cpuid, mem_bar) \
|
||||
{ \
|
||||
Atomic_##TYPE t = 0, a = 0, b = 0; \
|
||||
unsigned int i; \
|
||||
for (i = 0; i < TEST_REPEAT; i++){ \
|
||||
a = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
b = (Atomic_##TYPE)(rand() % ((Atomic_##TYPE)-1 / 2)); \
|
||||
t = a; \
|
||||
_Atomic_Fetch_or_##NAME(&t, b, mem_bar); \
|
||||
rtems_test_assert(t == (Atomic_##TYPE)(a | b)); \
|
||||
} \
|
||||
locked_printf("\nCPU%d _Atomic_Fetch_or_" #NAME ": SUCCESS\n", cpuid); \
|
||||
}
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int cpu_num;
|
||||
char name[5];
|
||||
char *p;
|
||||
|
||||
/* Get the task name */
|
||||
p = rtems_object_get_name( RTEMS_SELF, 5, name );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
/* Get the CPU Number */
|
||||
cpu_num = bsp_smp_processor_id();
|
||||
|
||||
/* Print that the task is up and running. */
|
||||
/* test relaxed barrier */
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
/* test acquire barrier */
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(int, Int, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(long, Long, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(32, Int32, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
/* test release barrier */
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_FETCH_OR_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
// ATOMIC_FETCH_OR_NO_BARRIER(64, cpu_num);
|
||||
|
||||
/* Set the flag that the task is up and running */
|
||||
TaskRan[cpu_num] = true;
|
||||
|
||||
/* Drop into a loop which will keep this task on
|
||||
* running on the cpu.
|
||||
*/
|
||||
while(1);
|
||||
}
|
||||
22
testsuites/smptests/smpatomic07/Makefile.am
Normal file
22
testsuites/smptests/smpatomic07/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
rtems_tests_PROGRAMS = smpatomic07
|
||||
smpatomic07_SOURCES = init.c tasks.c system.h ../../support/src/locked_print.c
|
||||
|
||||
dist_rtems_tests_DATA = smpatomic07.scn
|
||||
dist_rtems_tests_DATA += smpatomic07.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 = $(smpatomic07_OBJECTS)
|
||||
LINK_LIBS = $(smpatomic07_LDLIBS)
|
||||
|
||||
smpatomic07$(EXEEXT): $(smpatomic07_OBJECTS) $(smpatomic07_DEPENDENCIES)
|
||||
@rm -f smpatomic07$(EXEEXT)
|
||||
$(make-exe)
|
||||
|
||||
include $(top_srcdir)/../automake/local.am
|
||||
72
testsuites/smptests/smpatomic07/init.c
Normal file
72
testsuites/smptests/smpatomic07/init.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic compare and exchange operation.
|
||||
*
|
||||
* 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
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
#include "system.h"
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int i;
|
||||
char ch;
|
||||
rtems_id id;
|
||||
rtems_status_code status;
|
||||
bool allDone;
|
||||
|
||||
/* XXX - Delay a bit to allow debug messages from
|
||||
* startup to print. This may need to go away when
|
||||
* debug messages go away.
|
||||
*/
|
||||
locked_print_initialize();
|
||||
|
||||
/* Put start of test message */
|
||||
locked_printf( "\n\n*** SMPatomic07 TEST ***\n" );
|
||||
|
||||
/* Initialize the TaskRan array */
|
||||
for ( i=0; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
TaskRan[i] = false;
|
||||
}
|
||||
|
||||
/* Create and start tasks for each processor */
|
||||
for ( i=1; i< rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
ch = '0' + i;
|
||||
|
||||
status = rtems_task_create(
|
||||
rtems_build_name( 'T', 'A', ch, ' ' ),
|
||||
1,
|
||||
RTEMS_MINIMUM_STACK_SIZE,
|
||||
RTEMS_DEFAULT_MODES,
|
||||
RTEMS_DEFAULT_ATTRIBUTES,
|
||||
&id
|
||||
);
|
||||
directive_failed( status, "task create" );
|
||||
|
||||
status = rtems_task_start( id, Test_task, i+1 );
|
||||
directive_failed( status, "task start" );
|
||||
}
|
||||
|
||||
/* Wait on the all tasks to run */
|
||||
while (1) {
|
||||
allDone = true;
|
||||
for ( i=1; i<rtems_smp_get_number_of_processors() ; i++ ) {
|
||||
if (TaskRan[i] == false)
|
||||
allDone = false;
|
||||
}
|
||||
if (allDone) {
|
||||
locked_printf( "\n\n*** END OF TEST SMPatomic07 ***\n" );
|
||||
rtems_test_exit( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
24
testsuites/smptests/smpatomic07/smpatomic07.doc
Normal file
24
testsuites/smptests/smpatomic07/smpatomic07.doc
Normal file
@@ -0,0 +1,24 @@
|
||||
# COPYRIGHT (c) 1989-2012.
|
||||
# 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.com/license/LICENSE.
|
||||
#
|
||||
|
||||
This file describes the directives and concepts tested by this test set.
|
||||
|
||||
test set name: smpatomic07
|
||||
|
||||
directives:
|
||||
|
||||
_Atomic_Compare_exchange_int
|
||||
_Atomic_Compare_exchange_long
|
||||
_Atomic_Compare_exchange_ptr
|
||||
_Atomic_Compare_exchange_32
|
||||
_Atomic_Compare_exchange_64
|
||||
|
||||
concepts:
|
||||
|
||||
+ Ensure that the atomic compare and exchange operations listed above behave
|
||||
as defined.
|
||||
29
testsuites/smptests/smpatomic07/smpatomic07.scn
Normal file
29
testsuites/smptests/smpatomic07/smpatomic07.scn
Normal file
@@ -0,0 +1,29 @@
|
||||
*** SMPatomic07 TEST ***
|
||||
|
||||
CPU1 _Atomic_Compare_exchange_int: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Compare_exchange_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Compare_exchange_int: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Compare_exchange_long: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Compare_exchange_ptr: SUCCESS
|
||||
|
||||
CPU2 _Atomic_Compare_exchange_32: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Compare_exchange_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Compare_exchange_long: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Compare_exchange_ptr: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Compare_exchange_ptr: SUCCESS
|
||||
|
||||
CPU1 _Atomic_Compare_exchange_32: SUCCESS
|
||||
|
||||
CPU3 _Atomic_Compare_exchange_32: SUCCESS
|
||||
|
||||
|
||||
*** END OF TEST SMPatomic07 ***
|
||||
|
||||
50
testsuites/smptests/smpatomic07/system.h
Normal file
50
testsuites/smptests/smpatomic07/system.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.com/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include "tmacros.h"
|
||||
#include "test_support.h"
|
||||
|
||||
/* functions */
|
||||
|
||||
rtems_task Init(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
);
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
|
||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||
|
||||
#define CONFIGURE_SMP_APPLICATION
|
||||
#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 4
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS \
|
||||
(1 + CONFIGURE_SMP_MAXIMUM_PROCESSORS)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
/* global variables */
|
||||
|
||||
/*
|
||||
* Keep the names and IDs in global variables so another task can use them.
|
||||
*/
|
||||
|
||||
TEST_EXTERN volatile bool TaskRan[ CONFIGURE_SMP_MAXIMUM_PROCESSORS ];
|
||||
|
||||
/*
|
||||
* Handy macros and static inline functions
|
||||
*/
|
||||
|
||||
/* end of include file */
|
||||
104
testsuites/smptests/smpatomic07/tasks.c
Normal file
104
testsuites/smptests/smpatomic07/tasks.c
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Deng Hengyi.
|
||||
*
|
||||
* This test case is to test atomic compare and exchange operation.
|
||||
*
|
||||
* 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 "system.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rtems/rtems/atomic.h>
|
||||
|
||||
#define TEST_REPEAT 200000
|
||||
|
||||
#define ATOMIC_CAS_NO_BARRIER(NAME, TYPE, cpuid, mem_bar) \
|
||||
{ \
|
||||
Atomic_##TYPE a = 0, b = 0; \
|
||||
unsigned int i; \
|
||||
int r; \
|
||||
for (i = 0; i < TEST_REPEAT; i++){ \
|
||||
a = rand() % (Atomic_##TYPE)-1; \
|
||||
b = a; \
|
||||
r = _Atomic_Compare_exchange_##NAME(&b, a + 1, a - 1, mem_bar); \
|
||||
if(r != 0){ \
|
||||
locked_printf("\nCPU%d _Atomic_Compare_exchange_" #NAME ": FAILED\n", cpuid); \
|
||||
rtems_test_exit( 0 ); \
|
||||
} \
|
||||
b = a; \
|
||||
r = _Atomic_Compare_exchange_##NAME(&b, a, a - 1, mem_bar); \
|
||||
if((r == 0) ||((r != 0) && ((a - 1) != b))){ \
|
||||
locked_printf("\nCPU%d _Atomic_Compare_exchange_" #NAME ": FAILED\n", cpuid); \
|
||||
rtems_test_exit( 0 ); \
|
||||
} \
|
||||
b = a; \
|
||||
r = _Atomic_Compare_exchange_##NAME(&b, a + 1, a, mem_bar); \
|
||||
if(r != 0){ \
|
||||
locked_printf("\nCPU%d _Atomic_Compare_exchange_" #NAME ": FAILED\n", cpuid); \
|
||||
rtems_test_exit( 0 ); \
|
||||
} \
|
||||
} \
|
||||
locked_printf("\nCPU%d _Atomic_Compare_exchange_" #NAME ": SUCCESS\n", cpuid); \
|
||||
}
|
||||
|
||||
rtems_task Test_task(
|
||||
rtems_task_argument argument
|
||||
)
|
||||
{
|
||||
int cpu_num;
|
||||
char name[5];
|
||||
char *p;
|
||||
|
||||
/* Get the task name */
|
||||
p = rtems_object_get_name( RTEMS_SELF, 5, name );
|
||||
rtems_test_assert( p != NULL );
|
||||
|
||||
/* Get the CPU Number */
|
||||
cpu_num = bsp_smp_processor_id();
|
||||
|
||||
/* Print that the task is up and running. */
|
||||
/* test relaxed barrier */
|
||||
ATOMIC_CAS_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELAXED_BARRIER);
|
||||
|
||||
/* test acquire barrier */
|
||||
ATOMIC_CAS_NO_BARRIER(int, Int, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(long, Long, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(32, Int32, cpu_num, ATOMIC_ACQUIRE_BARRIER);
|
||||
|
||||
/* test release barrier */
|
||||
ATOMIC_CAS_NO_BARRIER(int, Int, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(long, Long, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(ptr, Pointer, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
ATOMIC_CAS_NO_BARRIER(32, Int32, cpu_num, ATOMIC_RELEASE_BARRIER);
|
||||
|
||||
// ATOMIC_CAS_NO_BARRIER(64, cpu_num);
|
||||
|
||||
/* Set the flag that the task is up and running */
|
||||
TaskRan[cpu_num] = true;
|
||||
|
||||
/* Drop into a loop which will keep this task on
|
||||
* running on the cpu.
|
||||
*/
|
||||
while(1);
|
||||
}
|
||||
Reference in New Issue
Block a user