From bd1b8de26546f0e86d76bec2e407a08245560f83 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 15 Sep 2011 15:56:01 +0000 Subject: 2011-09-15 Petr Benes PR 1907/testing * Makefile.am, configure.ac: Add tests for the CBS (Constant Bandwidth Server) scheduler. * spcbssched01/.cvsignore, spcbssched01/Makefile.am, spcbssched01/init.c, spcbssched01/spcbssched01.doc, spcbssched01/spcbssched01.scn, spcbssched01/system.h, spcbssched01/task1.c, spcbssched02/.cvsignore, spcbssched02/Makefile.am, spcbssched02/init.c, spcbssched02/spcbssched02.doc, spcbssched02/spcbssched02.scn, spcbssched02/system.h, spcbssched02/task_periodic.c, spcbssched03/.cvsignore, spcbssched03/Makefile.am, spcbssched03/cbsparams.h, spcbssched03/init.c, spcbssched03/spcbssched03.doc, spcbssched03/spcbssched03.scn, spcbssched03/system.h, spcbssched03/tasks_aperiodic.c, spcbssched03/tasks_periodic.c: New files. --- testsuites/sptests/ChangeLog | 18 ++ testsuites/sptests/Makefile.am | 3 +- testsuites/sptests/configure.ac | 3 + testsuites/sptests/spcbssched01/.cvsignore | 2 + testsuites/sptests/spcbssched01/Makefile.am | 28 +++ testsuites/sptests/spcbssched01/init.c | 85 ++++++++ testsuites/sptests/spcbssched01/spcbssched01.doc | 47 +++++ testsuites/sptests/spcbssched01/spcbssched01.scn | 16 ++ testsuites/sptests/spcbssched01/system.h | 47 +++++ testsuites/sptests/spcbssched01/task1.c | 57 ++++++ testsuites/sptests/spcbssched02/.cvsignore | 2 + testsuites/sptests/spcbssched02/Makefile.am | 28 +++ testsuites/sptests/spcbssched02/init.c | 227 ++++++++++++++++++++++ testsuites/sptests/spcbssched02/spcbssched02.doc | 22 +++ testsuites/sptests/spcbssched02/spcbssched02.scn | 30 +++ testsuites/sptests/spcbssched02/system.h | 62 ++++++ testsuites/sptests/spcbssched02/task_periodic.c | 138 +++++++++++++ testsuites/sptests/spcbssched03/.cvsignore | 2 + testsuites/sptests/spcbssched03/Makefile.am | 28 +++ testsuites/sptests/spcbssched03/cbsparams.h | 42 ++++ testsuites/sptests/spcbssched03/init.c | 63 ++++++ testsuites/sptests/spcbssched03/spcbssched03.doc | 22 +++ testsuites/sptests/spcbssched03/spcbssched03.scn | 170 ++++++++++++++++ testsuites/sptests/spcbssched03/system.h | 73 +++++++ testsuites/sptests/spcbssched03/tasks_aperiodic.c | 48 +++++ testsuites/sptests/spcbssched03/tasks_periodic.c | 154 +++++++++++++++ 26 files changed, 1416 insertions(+), 1 deletion(-) create mode 100644 testsuites/sptests/spcbssched01/.cvsignore create mode 100644 testsuites/sptests/spcbssched01/Makefile.am create mode 100644 testsuites/sptests/spcbssched01/init.c create mode 100644 testsuites/sptests/spcbssched01/spcbssched01.doc create mode 100644 testsuites/sptests/spcbssched01/spcbssched01.scn create mode 100644 testsuites/sptests/spcbssched01/system.h create mode 100644 testsuites/sptests/spcbssched01/task1.c create mode 100644 testsuites/sptests/spcbssched02/.cvsignore create mode 100644 testsuites/sptests/spcbssched02/Makefile.am create mode 100644 testsuites/sptests/spcbssched02/init.c create mode 100644 testsuites/sptests/spcbssched02/spcbssched02.doc create mode 100644 testsuites/sptests/spcbssched02/spcbssched02.scn create mode 100644 testsuites/sptests/spcbssched02/system.h create mode 100644 testsuites/sptests/spcbssched02/task_periodic.c create mode 100644 testsuites/sptests/spcbssched03/.cvsignore create mode 100644 testsuites/sptests/spcbssched03/Makefile.am create mode 100644 testsuites/sptests/spcbssched03/cbsparams.h create mode 100644 testsuites/sptests/spcbssched03/init.c create mode 100644 testsuites/sptests/spcbssched03/spcbssched03.doc create mode 100644 testsuites/sptests/spcbssched03/spcbssched03.scn create mode 100644 testsuites/sptests/spcbssched03/system.h create mode 100644 testsuites/sptests/spcbssched03/tasks_aperiodic.c create mode 100644 testsuites/sptests/spcbssched03/tasks_periodic.c diff --git a/testsuites/sptests/ChangeLog b/testsuites/sptests/ChangeLog index 0bb4e23ee9..8b9ac7887a 100644 --- a/testsuites/sptests/ChangeLog +++ b/testsuites/sptests/ChangeLog @@ -1,3 +1,21 @@ +2011-09-15 Petr Benes + + PR 1907/testing + * Makefile.am, configure.ac: Add tests for the CBS (Constant Bandwidth + Server) scheduler. + * spcbssched01/.cvsignore, spcbssched01/Makefile.am, + spcbssched01/init.c, spcbssched01/spcbssched01.doc, + spcbssched01/spcbssched01.scn, spcbssched01/system.h, + spcbssched01/task1.c, spcbssched02/.cvsignore, + spcbssched02/Makefile.am, spcbssched02/init.c, + spcbssched02/spcbssched02.doc, spcbssched02/spcbssched02.scn, + spcbssched02/system.h, spcbssched02/task_periodic.c, + spcbssched03/.cvsignore, spcbssched03/Makefile.am, + spcbssched03/cbsparams.h, spcbssched03/init.c, + spcbssched03/spcbssched03.doc, spcbssched03/spcbssched03.scn, + spcbssched03/system.h, spcbssched03/tasks_aperiodic.c, + spcbssched03/tasks_periodic.c: New files. + 2011-09-14 Sebastian Huber * spnsext01/init.c: Use correct API. diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am index 1a44cc3d6e..a67dffec39 100644 --- a/testsuites/sptests/Makefile.am +++ b/testsuites/sptests/Makefile.am @@ -30,7 +30,8 @@ SUBDIRS = \ spintrcritical13 spintrcritical14 spintrcritical15 spintrcritical16 \ spintrcritical17 spmkdir spmountmgr01 spheapprot \ spsimplesched01 spsimplesched02 spsimplesched03 spnsext01 \ - spedfsched01 spedfsched02 spedfsched03 + spedfsched01 spedfsched02 spedfsched03 \ + spcbssched01 spcbssched02 spcbssched03 include $(top_srcdir)/../automake/subdirs.am include $(top_srcdir)/../automake/local.am diff --git a/testsuites/sptests/configure.ac b/testsuites/sptests/configure.ac index a880de5e7e..3e25ca5f56 100644 --- a/testsuites/sptests/configure.ac +++ b/testsuites/sptests/configure.ac @@ -103,6 +103,9 @@ sp74/Makefile sp75/Makefile sp76/Makefile spassoc01/Makefile +spcbssched01/Makefile +spcbssched02/Makefile +spcbssched03/Makefile spchain/Makefile spclockget/Makefile spcoverage/Makefile diff --git a/testsuites/sptests/spcbssched01/.cvsignore b/testsuites/sptests/spcbssched01/.cvsignore new file mode 100644 index 0000000000..282522db03 --- /dev/null +++ b/testsuites/sptests/spcbssched01/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/testsuites/sptests/spcbssched01/Makefile.am b/testsuites/sptests/spcbssched01/Makefile.am new file mode 100644 index 0000000000..bc0b3e6587 --- /dev/null +++ b/testsuites/sptests/spcbssched01/Makefile.am @@ -0,0 +1,28 @@ +## +## $Id$ +## + +MANAGERS = io semaphore clock + +rtems_tests_PROGRAMS = spcbssched01 +spcbssched01_SOURCES = init.c task1.c system.h + +dist_rtems_tests_DATA = spcbssched01.scn +dist_rtems_tests_DATA += spcbssched01.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +spcbssched01_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel) + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(spcbssched01_OBJECTS) $(spcbssched01_LDADD) +LINK_LIBS = $(spcbssched01_LDLIBS) + +spcbssched01$(EXEEXT): $(spcbssched01_OBJECTS) $(spcbssched01_DEPENDENCIES) + @rm -f spcbssched01$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/sptests/spcbssched01/init.c b/testsuites/sptests/spcbssched01/init.c new file mode 100644 index 0000000000..a87e2cf13c --- /dev/null +++ b/testsuites/sptests/spcbssched01/init.c @@ -0,0 +1,85 @@ +/* Init + * + * This routine is the initialization task for this test program. + * It is a user initialization task and has the responsibility for creating + * and starting the tasks that make up the test. If the time of day + * clock is required for the test, it should also be set to a known + * value by this function. + * + * Input parameters: + * argument - task argument + * + * Output parameters: NONE + * + * COPYRIGHT (c) 1989-1999. + * 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. + * + * $Id$ + */ + +#define CONFIGURE_INIT +#include "system.h" + +rtems_task Init( + rtems_task_argument argument +) +{ + rtems_time_of_day time; + rtems_status_code status; + + puts( "\n\n*** CBS SCHEDULER TEST 1 ***" ); + + build_time( &time, 12, 31, 1988, 9, 0, 0, 0 ); + status = rtems_clock_set( &time ); + directive_failed( status, "rtems_clock_set" ); + + Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' ); + Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' ); + Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' ); + + status = rtems_task_create( + Task_name[ 1 ], + 1, + RTEMS_MINIMUM_STACK_SIZE * 2, + RTEMS_INTERRUPT_LEVEL(31), + RTEMS_DEFAULT_ATTRIBUTES, + &Task_id[ 1 ] + ); + directive_failed( status, "rtems_task_create of TA1" ); + + status = rtems_task_create( + Task_name[ 2 ], + 1, + RTEMS_MINIMUM_STACK_SIZE * 2, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &Task_id[ 2 ] + ); + directive_failed( status, "rtems_task_create of TA2" ); + + status = rtems_task_create( + Task_name[ 3 ], + 1, + RTEMS_MINIMUM_STACK_SIZE * 3, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &Task_id[ 3 ] + ); + directive_failed( status, "rtems_task_create of TA3" ); + + status = rtems_task_start( Task_id[ 1 ], Task_1_through_3, 0 ); + directive_failed( status, "rtems_task_start of TA1" ); + + status = rtems_task_start( Task_id[ 2 ], Task_1_through_3, 0 ); + directive_failed( status, "rtems_task_start of TA2" ); + + status = rtems_task_start( Task_id[ 3 ], Task_1_through_3, 0 ); + directive_failed( status, "rtems_task_start of TA3" ); + + status = rtems_task_delete( RTEMS_SELF ); + directive_failed( status, "rtems_task_delete of RTEMS_SELF" ); +} diff --git a/testsuites/sptests/spcbssched01/spcbssched01.doc b/testsuites/sptests/spcbssched01/spcbssched01.doc new file mode 100644 index 0000000000..7c5ab0d832 --- /dev/null +++ b/testsuites/sptests/spcbssched01/spcbssched01.doc @@ -0,0 +1,47 @@ +# +# $Id$ +# +# COPYRIGHT (c) 1989-1999. +# 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: spcbssched01 + +directives: + ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident, + tm_set, tm_get, tm_wkafter + +concepts: + +This test is identical to sp01 but for CBS-based scheduling: + + a. Verifies system can create and start both the executive's system + initialization and idle task. + + b. Verifies executive can swap between three application tasks at the + same priority and the executive's internal idle task. + + c. Verifies can print strings to the CRT on port 2 of the mvme136 board + using Print and Println in the board support package. + + d. Verifies interrupt handler can handle a task switch from an interrupt + as specified with the i_return directive. + + e. Verifies executive initialization performed correctly. + + f. Verifies the executive trap handler except for the halt function. + + g. Verifies that a task can get the task identification number of itself. + + h. Verifies implementation of SuperCore TOD_MILLISECONDS_TO_TICKS. Normal + computation in applications is via a macro at the Classic API level. + +output: + "TA1" is printed once every 5 seconds. "TA2" is printed once + every 10 seconds. "TA3" is printed once every 15 seconds. diff --git a/testsuites/sptests/spcbssched01/spcbssched01.scn b/testsuites/sptests/spcbssched01/spcbssched01.scn new file mode 100644 index 0000000000..f53dbb5406 --- /dev/null +++ b/testsuites/sptests/spcbssched01/spcbssched01.scn @@ -0,0 +1,16 @@ +*** CBS SCHEDULER TEST 1 *** +TA1 - rtems_clock_get_tod - 09:00:00 12/31/1988 +TA2 - rtems_clock_get_tod - 09:00:00 12/31/1988 +TA3 - rtems_clock_get_tod - 09:00:00 12/31/1988 +TA1 - rtems_clock_get_tod - 09:00:05 12/31/1988 +TA1 - rtems_clock_get_tod - 09:00:10 12/31/1988 +TA2 - rtems_clock_get_tod - 09:00:10 12/31/1988 +TA1 - rtems_clock_get_tod - 09:00:15 12/31/1988 +TA3 - rtems_clock_get_tod - 09:00:15 12/31/1988 +TA1 - rtems_clock_get_tod - 09:00:20 12/31/1988 +TA2 - rtems_clock_get_tod - 09:00:20 12/31/1988 +TA1 - rtems_clock_get_tod - 09:00:25 12/31/1988 +TA1 - rtems_clock_get_tod - 09:00:30 12/31/1988 +TA3 - rtems_clock_get_tod - 09:00:30 12/31/1988 +TA2 - rtems_clock_get_tod - 09:00:30 12/31/1988 +*** END OF CBS SCHEDULER TEST 1 *** diff --git a/testsuites/sptests/spcbssched01/system.h b/testsuites/sptests/spcbssched01/system.h new file mode 100644 index 0000000000..b42384a0e8 --- /dev/null +++ b/testsuites/sptests/spcbssched01/system.h @@ -0,0 +1,47 @@ +/* system.h + * + * This include file contains information that is included in every + * function in the test set. + * + * COPYRIGHT (c) 1989-1999. + * 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. + * + * $Id$ + */ + +#include + +/* functions */ + +rtems_task Init( + rtems_task_argument argument +); + +rtems_task Task_1_through_3( + rtems_task_argument argument +); + +/* configuration information */ + +#define CONFIGURE_SCHEDULER_CBS + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_EXTRA_TASK_STACKS (4 * RTEMS_MINIMUM_STACK_SIZE) +#define CONFIGURE_MAXIMUM_TASKS 4 + +#include + +/* global variables */ + +TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */ +TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */ + +/* end of include file */ diff --git a/testsuites/sptests/spcbssched01/task1.c b/testsuites/sptests/spcbssched01/task1.c new file mode 100644 index 0000000000..3d9e1e59c9 --- /dev/null +++ b/testsuites/sptests/spcbssched01/task1.c @@ -0,0 +1,57 @@ +/* Task_1_through_3 + * + * This routine serves as a test task. It verifies the basic task + * switching capabilities of the executive. + * + * Input parameters: + * argument - task argument + * + * Output parameters: NONE + * + * COPYRIGHT (c) 1989-1999. + * 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. + * + * $Id$ + */ + +#include "system.h" + +rtems_task Task_1_through_3( + rtems_task_argument argument +) +{ + rtems_id tid; + rtems_time_of_day time; + rtems_status_code status; + rtems_interval ticks; + + status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid ); + directive_failed( status, "rtems_task_ident" ); + + /* + * Use TOD_MILLISECONDS_TO_TICKS not RTEMS_MILLISECONDS_TO_TICKS to + * test C implementation in SuperCore -- not macro version used + * everywhere else. + */ + ticks = TOD_MILLISECONDS_TO_TICKS( task_number( tid ) * 5 * 1000 ); + + while( FOREVER ) { + status = rtems_clock_get_tod( &time ); + directive_failed( status, "rtems_clock_get_tod" ); + + if ( time.second >= 35 ) { + puts( "*** END OF CBS SCHEDULER TEST 1 ***" ); + rtems_test_exit( 0 ); + } + + put_name( Task_name[ task_number( tid ) ], FALSE ); + print_time( " - rtems_clock_get_tod - ", &time, "\n" ); + + status = rtems_task_wake_after( ticks ); + directive_failed( status, "rtems_task_wake_after" ); + } +} diff --git a/testsuites/sptests/spcbssched02/.cvsignore b/testsuites/sptests/spcbssched02/.cvsignore new file mode 100644 index 0000000000..282522db03 --- /dev/null +++ b/testsuites/sptests/spcbssched02/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/testsuites/sptests/spcbssched02/Makefile.am b/testsuites/sptests/spcbssched02/Makefile.am new file mode 100644 index 0000000000..664978c91c --- /dev/null +++ b/testsuites/sptests/spcbssched02/Makefile.am @@ -0,0 +1,28 @@ +## +## $Id$ +## + +MANAGERS = io rate_monotonic semaphore clock + +rtems_tests_PROGRAMS = spcbssched02 +spcbssched02_SOURCES = init.c task_periodic.c system.h + +dist_rtems_tests_DATA = spcbssched02.scn +dist_rtems_tests_DATA += spcbssched02.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +spcbssched02_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel) + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(spcbssched02_OBJECTS) $(spcbssched02_LDADD) +LINK_LIBS = $(spcbssched02_LDLIBS) + +spcbssched02$(EXEEXT): $(spcbssched02_OBJECTS) $(spcbssched02_DEPENDENCIES) + @rm -f spcbssched02$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/sptests/spcbssched02/init.c b/testsuites/sptests/spcbssched02/init.c new file mode 100644 index 0000000000..7cb305cd74 --- /dev/null +++ b/testsuites/sptests/spcbssched02/init.c @@ -0,0 +1,227 @@ +/* Init + * + * This routine is the initialization task for this test program. + * It is a user initialization task and has the responsibility for creating + * and starting the tasks that make up the test. If the time of day + * clock is required for the test, it should also be set to a known + * value by this function. + * + * Input parameters: + * argument - task argument + * + * Output parameters: NONE + * + * 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. + * + * $Id$ + */ + +#define CONFIGURE_INIT +#include "system.h" + +rtems_task Init( + rtems_task_argument argument +) +{ + rtems_status_code status; + rtems_cbs_server_id server_id, server_id2; + time_t approved_budget, exec_time, abs_time, remaining_budget; + rtems_cbs_parameters params, params1, params2, params3, params4; + + Priority = 30; + Period = 30; + Execution = 10; + Phase = 0; + + params.deadline = 1; + params.budget = 1; + + params1 = params2 = params3 = params4 = params; + params1.budget = -1; + params2.budget = SCHEDULER_EDF_PRIO_MSB + 1; + params3.deadline = -1; + params4.deadline = SCHEDULER_EDF_PRIO_MSB + 1; + + puts( "\n\n*** TEST CBS SCHEDULER 2 ***" ); + + Task_name = rtems_build_name( 'P', 'T', '1', ' ' ); + + status = rtems_task_create( + Task_name, + Priority, + RTEMS_MINIMUM_STACK_SIZE * 4, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &Task_id + ); + directive_failed( status, "rtems_task_create loop" ); + + printf( "Init: Initializing the CBS\n" ); + if ( rtems_cbs_initialize() ) + printf( "ERROR: CBS INITIALIZATION FAILED\n" ); + + /* Error checks for Create server and Destroy server */ + printf( "Init: Create server and Destroy server\n" ); + if ( rtems_cbs_destroy_server( -5 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_destroy_server( 5 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_destroy_server( 0 ) != SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_create_server( ¶ms1, NULL, &server_id ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_create_server( ¶ms2, NULL, &server_id ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_create_server( ¶ms3, NULL, &server_id ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_create_server( ¶ms4, NULL, &server_id ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_create_server( ¶ms, NULL, &server_id2 ) ) + printf( "ERROR: CREATE SERVER FAILED\n" ); + if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) ) + printf( "ERROR: CREATE SERVER FAILED\n" ); + if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) != + SCHEDULER_CBS_ERROR_FULL ) + printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" ); + + /* Error checks for Attach thread and Detach thread */ + printf( "Init: Attach thread\n" ); + if ( rtems_cbs_attach_thread( -5, RTEMS_SELF ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_attach_thread( 5, RTEMS_SELF ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_attach_thread( server_id, 1234 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_attach_thread( server_id, RTEMS_SELF ) ) + printf( "ERROR: ATTACH THREAD FAILED\n" ); + if ( rtems_cbs_attach_thread( server_id, RTEMS_SELF ) != + SCHEDULER_CBS_ERROR_FULL ) + printf( "ERROR: ATTACH THREAD AGAIN PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_attach_thread( server_id, Task_id ) != + SCHEDULER_CBS_ERROR_FULL ) + printf( "ERROR: ATTACH THREAD TO FULL SERVER PASSED UNEXPECTEDLY \n" ); + if ( rtems_cbs_destroy_server( server_id ) ) + printf( "ERROR: DESTROY SERVER WITH THREAD ATTACHED FAILED\n" ); + if ( rtems_cbs_attach_thread( server_id, RTEMS_SELF ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" ); + + printf( "Init: Detach thread\n" ); + if ( rtems_cbs_detach_thread( -5, RTEMS_SELF ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_detach_thread( 5, RTEMS_SELF ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_detach_thread( server_id2, 1234 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY \n" ); + if ( rtems_cbs_detach_thread( server_id, RTEMS_SELF ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY4\n" ); + rtems_cbs_destroy_server( server_id2 ); + + /* Error checks for Set parameters and Get parameters */ + printf( "Init: Set parameters and Get parameters\n" ); + if ( rtems_cbs_set_parameters( -5, ¶ms ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_set_parameters( 5, ¶ms ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_set_parameters( server_id, ¶ms ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" ); + + if ( rtems_cbs_get_parameters( -5, ¶ms ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_parameters( 5, ¶ms ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_parameters( server_id, ¶ms ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" ); + + if ( rtems_cbs_set_parameters( server_id, ¶ms1 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_set_parameters( server_id, ¶ms2 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_set_parameters( server_id, ¶ms3 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_set_parameters( server_id, ¶ms4 ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" ); + + /* Error checks for Get server id */ + printf( "Init: Get server id\n" ); + if ( rtems_cbs_get_server_id( RTEMS_SELF, &server_id ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: GET SERVER ID PASSED UNEXPECTEDLY\n" ); + + /* Error checks for Get approved budget */ + printf( "Init: Get approved budget\n" ); + if ( rtems_cbs_get_approved_budget( -5, &approved_budget ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_approved_budget( 5, &approved_budget ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_approved_budget( server_id, &approved_budget ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" ); + + /* Error checks for Get remaining budget */ + printf( "Init: Get remaining budget\n" ); + if ( rtems_cbs_get_remaining_budget( -5, &remaining_budget ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_remaining_budget( 5, &remaining_budget ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" ); + + /* Error checks for Get execution time */ + printf( "Init: Get execution time\n" ); + if ( rtems_cbs_get_execution_time( -5, &exec_time, &abs_time ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_execution_time( 5, &exec_time, &abs_time ) != + SCHEDULER_CBS_ERROR_INVALID_PARAMETER ) + printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" ); + if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) != + SCHEDULER_CBS_ERROR_NOSERVER ) + printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" ); + + /* Restart CBS library */ + printf( "Init: Cleaning up CBS\n" ); + if ( rtems_cbs_cleanup() ) + printf( "ERROR: CBS CLEANUP FAILED\n" ); + printf( "Init: Initializing the CBS\n" ); + if ( rtems_cbs_initialize() ) + printf( "ERROR: CBS INITIALIZATION FAILED\n" ); + + /* Start periodic task */ + printf( "Init: Starting periodic task\n" ); + status = rtems_task_start( Task_id, Task_Periodic, 1 ); + directive_failed( status, "rtems_task_start periodic" ); + + status = rtems_task_delete( RTEMS_SELF ); + directive_failed( status, "rtems_task_delete of RTEMS_SELF" ); +} diff --git a/testsuites/sptests/spcbssched02/spcbssched02.doc b/testsuites/sptests/spcbssched02/spcbssched02.doc new file mode 100644 index 0000000000..6a2934c282 --- /dev/null +++ b/testsuites/sptests/spcbssched02/spcbssched02.doc @@ -0,0 +1,22 @@ +# +# $Id$ +# +# COPYRIGHT (c) 1989-1999. +# 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: spcbssched02 + +directives: + + +concepts: + + a. Verifies CBS library functionality. diff --git a/testsuites/sptests/spcbssched02/spcbssched02.scn b/testsuites/sptests/spcbssched02/spcbssched02.scn new file mode 100644 index 0000000000..0a38bd8dbb --- /dev/null +++ b/testsuites/sptests/spcbssched02/spcbssched02.scn @@ -0,0 +1,30 @@ +*** TEST CBS SCHEDULER 2 *** +Init: Initializing the CBS +Init: Create server and Destroy server +Init: Attach thread +Init: Detach thread +Init: Set parameters and Get parameters +Init: Get server id +Init: Get approved budget +Init: Get remaining budget +Init: Get execution time +Init: Cleaning up CBS +Init: Initializing the CBS +Init: Starting periodic task +Periodic task: Create server and Attach thread +Periodic task: ID and Get parameters +Periodic task: Detach thread and Destroy server +Periodic task: Remaining budget and Execution time +Periodic task: Set parameters +Periodic task: Approved budget +Periodic task: Starting periodic behavior +P1-S ticks:1 +P1-F ticks:11 +P1-S ticks:31 +P1-F ticks:41 +P1-S ticks:61 +P1-F ticks:71 +P1-S ticks:91 +P1-F ticks:101 +P1-S ticks:121 +*** END OF TEST CBS SCHEDULER 2 *** diff --git a/testsuites/sptests/spcbssched02/system.h b/testsuites/sptests/spcbssched02/system.h new file mode 100644 index 0000000000..01191431b7 --- /dev/null +++ b/testsuites/sptests/spcbssched02/system.h @@ -0,0 +1,62 @@ +/* system.h + * + * This include file contains information that is included in every + * function in the test set. + * + * COPYRIGHT (c) 1989-1999. + * 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. + * + * $Id$ + */ + +#include + +/* functions */ + +rtems_task Init( + rtems_task_argument argument +); + +rtems_task Task_Periodic( + rtems_task_argument argument +); + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_MICROSECONDS_PER_TICK 100000 + +#define CONFIGURE_MAXIMUM_TASKS 2 +#define CONFIGURE_MAXIMUM_PERIODS 10 + +#define CONFIGURE_INIT_TASK_PRIORITY 100 +#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_EXTRA_TASK_STACKS (6 * 4 * RTEMS_MINIMUM_STACK_SIZE) + +#define CONFIGURE_SCHEDULER_CBS + +#include + +#include +#include +#include +#include + +/* global variables */ + +rtems_id Task_id; +rtems_name Task_name; +rtems_task_priority Priority; +time_t Period; +time_t Execution; +time_t Phase; + +/* end of include file */ diff --git a/testsuites/sptests/spcbssched02/task_periodic.c b/testsuites/sptests/spcbssched02/task_periodic.c new file mode 100644 index 0000000000..c59a514782 --- /dev/null +++ b/testsuites/sptests/spcbssched02/task_periodic.c @@ -0,0 +1,138 @@ +/* Tasks_Periodic + * + * This routine serves as a test task for the CBS scheduler + * implementation. + * + * Input parameters: + * argument - task argument + * + * Output parameters: NONE + * + * 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. + * + * $Id$ + */ + +#include "system.h" + +rtems_task Task_Periodic( + rtems_task_argument argument +) +{ + rtems_id rmid; + rtems_status_code status; + + time_t approved_budget, exec_time, abs_time, remaining_budget; + + int start, stop, now; + + rtems_cbs_server_id server_id, tsid; + rtems_cbs_parameters params, tparams; + + params.deadline = Period; + params.budget = Execution+1; + + printf( "Periodic task: Create server and Attach thread\n" ); + if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) ) + printf( "ERROR: CREATE SERVER FAILED\n" ); + if ( rtems_cbs_attach_thread( server_id, Task_id ) ) + printf( "ERROR: ATTACH THREAD FAILED\n" ); + + printf( "Periodic task: ID and Get parameters\n" ); + if ( rtems_cbs_get_server_id( Task_id, &tsid ) ) + printf( "ERROR: GET SERVER ID FAILED\n" ); + if ( tsid != server_id ) + printf( "ERROR: SERVER ID MISMATCH\n" ); + if ( rtems_cbs_get_parameters( server_id, &tparams ) ) + printf( "ERROR: GET PARAMETERS FAILED\n" ); + if ( params.deadline != tparams.deadline || + params.budget != tparams.budget ) + printf( "ERROR: PARAMETERS MISMATCH\n" ); + + printf( "Periodic task: Detach thread and Destroy server\n" ); + if ( rtems_cbs_detach_thread( server_id, Task_id ) ) + printf( "ERROR: DETACH THREAD FAILED\n" ); + if ( rtems_cbs_destroy_server( server_id ) ) + printf( "ERROR: DESTROY SERVER FAILED\n" ); + if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) ) + printf( "ERROR: CREATE SERVER FAILED\n" ); + + printf( "Periodic task: Remaining budget and Execution time\n" ); + if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget ) ) + printf( "ERROR: GET REMAINING BUDGET FAILED\n" ); + if ( remaining_budget != params.budget ) + printf( "ERROR: REMAINING BUDGET MISMATCH\n" ); + if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) ) + printf( "ERROR: GET EXECUTION TIME FAILED\n" ); + + printf( "Periodic task: Set parameters\n" ); + if ( rtems_cbs_attach_thread( server_id, Task_id ) ) + printf( "ERROR: ATTACH THREAD FAILED\n" ); + params.deadline = Period * 2; + params.budget = Execution * 2 +1; + if ( rtems_cbs_set_parameters( server_id, ¶ms ) ) + printf( "ERROR: SET PARAMS FAILED\n" ); + if ( rtems_cbs_get_parameters( server_id, &tparams ) ) + printf( "ERROR: GET PARAMS FAILED\n" ); + if ( params.deadline != tparams.deadline || + params.budget != tparams.budget ) + printf( "ERROR: PARAMS MISMATCH\n" ); + params.deadline = Period; + params.budget = Execution+1; + if ( rtems_cbs_set_parameters( server_id, ¶ms ) ) + printf( "ERROR: SET PARAMS FAILED\n" ); + if ( rtems_cbs_get_approved_budget( server_id, &approved_budget ) ) + printf( "ERROR: GET APPROVED BUDGET FAILED\n" ); + + printf( "Periodic task: Approved budget\n" ); + if ( approved_budget != params.budget ) + printf( "ERROR: APPROVED BUDGET MISMATCH\n" ); + + status = rtems_rate_monotonic_create( argument, &rmid ); + directive_failed( status, "rtems_rate_monotonic_create" ); + + /* Starting periodic behavior of the task */ + printf( "Periodic task: Starting periodic behavior\n" ); + status = rtems_task_wake_after( 1 + Phase ); + directive_failed( status, "rtems_task_wake_after" ); + + while ( FOREVER ) { + if ( rtems_rate_monotonic_period(rmid, Period) == RTEMS_TIMEOUT ) + printf( "P%" PRIdPTR " - Deadline miss\n", argument ); + + rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &start ); + printf( "P%" PRIdPTR "-S ticks:%d\n", argument, start ); + if ( start > 4*Period+Phase ) break; /* stop */ + /* active computing */ + while(FOREVER) { + rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now ); + if ( now >= start + Execution ) break; + + if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) ) + printf( "ERROR: GET EXECUTION TIME FAILED\n" ); + if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget) ) + printf( "ERROR: GET REMAINING BUDGET FAILED\n" ); + if ( (remaining_budget + exec_time) > (Execution + 1) ) { + printf( "ERROR: REMAINING BUDGET AND EXECUTION TIME MISMATCH\n" ); + rtems_test_exit( 0 ); + } + } + rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &stop ); + printf( "P%" PRIdPTR "-F ticks:%d\n", argument, stop ); + } + + /* delete period and SELF */ + status = rtems_rate_monotonic_delete( rmid ); + if ( status != RTEMS_SUCCESSFUL ) { + printf("rtems_rate_monotonic_delete failed with status of %d.\n", status); + rtems_test_exit( 0 ); + } + if ( rtems_cbs_cleanup() ) + printf( "ERROR: CBS CLEANUP\n" ); + + fflush(stdout); + puts( "*** END OF TEST CBS SCHEDULER 2 ***" ); + rtems_test_exit( 0 ); +} diff --git a/testsuites/sptests/spcbssched03/.cvsignore b/testsuites/sptests/spcbssched03/.cvsignore new file mode 100644 index 0000000000..282522db03 --- /dev/null +++ b/testsuites/sptests/spcbssched03/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/testsuites/sptests/spcbssched03/Makefile.am b/testsuites/sptests/spcbssched03/Makefile.am new file mode 100644 index 0000000000..5b884a2dd5 --- /dev/null +++ b/testsuites/sptests/spcbssched03/Makefile.am @@ -0,0 +1,28 @@ +## +## $Id$ +## + +MANAGERS = io rate_monotonic semaphore clock + +rtems_tests_PROGRAMS = spcbssched03 +spcbssched03_SOURCES = init.c tasks_periodic.c tasks_aperiodic.c system.h cbsparams.h + +dist_rtems_tests_DATA = spcbssched03.scn +dist_rtems_tests_DATA += spcbssched03.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +spcbssched03_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel) + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(spcbssched03_OBJECTS) $(spcbssched03_LDADD) +LINK_LIBS = $(spcbssched03_LDLIBS) + +spcbssched03$(EXEEXT): $(spcbssched03_OBJECTS) $(spcbssched03_DEPENDENCIES) + @rm -f spcbssched03$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/sptests/spcbssched03/cbsparams.h b/testsuites/sptests/spcbssched03/cbsparams.h new file mode 100644 index 0000000000..a77bc93413 --- /dev/null +++ b/testsuites/sptests/spcbssched03/cbsparams.h @@ -0,0 +1,42 @@ +/* cbsparams.h + * + * This include file contains information that is included in every + * function in the test set. + * + * COPYRIGHT (c) 1989-1999. + * 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. + * + * $Id$ + */ + +/* This file was generated with the following parameters: +-T 30,10,0 -T 40,10,0 -T 50,10,0 -T 70,10,0 -A 1,100,7 -A 100,5,4 +*/ + +#ifndef __CBSPARAMS_H_ +#define __CBSPARAMS_H_ + +#include "system.h" + +rtems_task_priority Priorities[1+NUM_TASKS]= { 0, 30, 40, 50, 70, 254, 254 }; + +uint32_t Periods[1+NUM_PERIODIC_TASKS] = { 0, 30, 40, 50, 70 }; + +uint32_t Execution[1+NUM_TASKS] = { 0, 10, 10, 10, 10, 100, 5 }; + +uint32_t Phases[1+NUM_TASKS] = { 0, 0, 0, 0, 0, 7, 4 }; + +#define build_task_name() do { \ +Task_name[ 1 ] = rtems_build_name( 'P', 'T', '1', ' ' );\ +Task_name[ 2 ] = rtems_build_name( 'P', 'T', '2', ' ' );\ +Task_name[ 3 ] = rtems_build_name( 'P', 'T', '3', ' ' );\ +Task_name[ 4 ] = rtems_build_name( 'P', 'T', '4', ' ' );\ +Task_name[ 5 ] = rtems_build_name( 'A', 'T', '5', ' ' );\ +Task_name[ 6 ] = rtems_build_name( 'A', 'T', '6', ' ' );\ +} while(0) + +#endif diff --git a/testsuites/sptests/spcbssched03/init.c b/testsuites/sptests/spcbssched03/init.c new file mode 100644 index 0000000000..7774794aab --- /dev/null +++ b/testsuites/sptests/spcbssched03/init.c @@ -0,0 +1,63 @@ +/* Init + * + * This routine is the initialization task for this test program. + * It is a user initialization task and has the responsibility for creating + * and starting the tasks that make up the test. If the time of day + * clock is required for the test, it should also be set to a known + * value by this function. + * + * Input parameters: + * argument - task argument + * + * Output parameters: NONE + * + * 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. + * + * $Id$ + */ + +#define CONFIGURE_INIT +#include "system.h" + +#include "cbsparams.h" + +rtems_task Init( + rtems_task_argument argument +) +{ + uint32_t index; + rtems_status_code status; + + puts( "\n\n*** TEST CBS SCHEDULER 3 ***" ); + + build_task_name(); + + for ( index = 1 ; index <= NUM_TASKS ; index++ ) { + status = rtems_task_create( + Task_name[ index ], + Priorities[ index ], + RTEMS_MINIMUM_STACK_SIZE * 4, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &Task_id[ index ] + ); + directive_failed( status, "rtems_task_create loop" ); + } + + rtems_cbs_initialize(); + + for ( index = 1 ; index <= NUM_PERIODIC_TASKS ; index++ ) { + status = rtems_task_start( Task_id[ index ], Tasks_Periodic, index ); + directive_failed( status, "rtems_task_start loop" ); + } + + for ( index = NUM_PERIODIC_TASKS+1 ; index <= NUM_TASKS ; index++ ) { + status = rtems_task_start( Task_id[ index ], Tasks_Aperiodic, index ); + directive_failed( status, "rtems_task_start loop" ); + } + + status = rtems_task_delete( RTEMS_SELF ); + directive_failed( status, "rtems_task_delete of RTEMS_SELF" ); +} diff --git a/testsuites/sptests/spcbssched03/spcbssched03.doc b/testsuites/sptests/spcbssched03/spcbssched03.doc new file mode 100644 index 0000000000..67781485dc --- /dev/null +++ b/testsuites/sptests/spcbssched03/spcbssched03.doc @@ -0,0 +1,22 @@ +# +# $Id$ +# +# COPYRIGHT (c) 1989-1999. +# 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: spcbssched03 + +directives: + + +concepts: + + a. Verifies CBS Scheduling behavior. diff --git a/testsuites/sptests/spcbssched03/spcbssched03.scn b/testsuites/sptests/spcbssched03/spcbssched03.scn new file mode 100644 index 0000000000..63b79d1e2c --- /dev/null +++ b/testsuites/sptests/spcbssched03/spcbssched03.scn @@ -0,0 +1,170 @@ +*** TEST CBS SCHEDULER 3 *** +PT1 - rtems_rate_monotonic_create id = 0x42010001 +PT1 - rtems_rate_monotonic_ident id = 0x42010001 +PT1 - (0x42010001) period 30 +PT2 - rtems_rate_monotonic_create id = 0x42010002 +PT2 - rtems_rate_monotonic_ident id = 0x42010002 +PT2 - (0x42010002) period 40 +PT3 - rtems_rate_monotonic_create id = 0x42010003 +PT3 - rtems_rate_monotonic_ident id = 0x42010003 +PT3 - (0x42010003) period 50 +PT4 - rtems_rate_monotonic_create id = 0x42010004 +PT4 - rtems_rate_monotonic_ident id = 0x42010004 +PT4 - (0x42010004) period 70 +AT5 AT6 P1-S ticks:2 +P1-F ticks:12 +P2-S ticks:12 +P2-F ticks:22 +P3-S ticks:22 +P1-S ticks:32 +P1-F ticks:42 +P3-F ticks:42 +P4-S ticks:42 +P2-S ticks:52 +P2-F ticks:62 +P1-S ticks:62 +P1-F ticks:72 +P4-F ticks:72 +P3-S ticks:72 +P3-F ticks:82 +AT6-S ticks:82 +P6-F ticks:87 +Killing task 6 +AT5-S ticks:87 +P1-S ticks:92 +P1-F ticks:102 +P2-S ticks:102 +P2-F ticks:112 +P4-S ticks:112 +P1-S ticks:122 +P1-F ticks:132 +P3-S ticks:132 +P3-F ticks:142 +P2-S ticks:142 +P2-F ticks:152 +P4-F ticks:152 +P1-S ticks:152 +P1-F ticks:162 +P2-S ticks:172 +P2-F ticks:182 +P1-S ticks:182 +P1-F ticks:192 +P3-S ticks:192 +P3-F ticks:202 +P4-S ticks:202 +P1-S ticks:212 +P1-F ticks:222 +P4-F ticks:222 +P2-S ticks:222 +P2-F ticks:232 +P3-S ticks:232 +P3-F ticks:242 +P1-S ticks:242 +P1-F ticks:252 +P2-S ticks:252 +P2-F ticks:262 +P4-S ticks:262 +P1-S ticks:272 +P1-F ticks:282 +P3-S ticks:283 +P3-F ticks:293 +P2-S ticks:293 +P2-F ticks:303 +P1-S ticks:303 +P1-F ticks:313 +Signal overrun, fixing the task +P4-F ticks:313 +P5-F ticks:313 +Killing task 5 +P3-S ticks:322 +P1-S ticks:332 +P1-F ticks:342 +P3-F ticks:342 +P2-S ticks:342 +P2-F ticks:352 +P4-S ticks:352 +P4-F ticks:362 +P1-S ticks:362 +P1-F ticks:372 +P2-S ticks:372 +P2-F ticks:382 +P3-S ticks:382 +P1-S ticks:392 +P1-F ticks:402 +P4-S ticks:402 +P2-S ticks:412 +P2-F ticks:422 +P1-S ticks:422 +P1-F ticks:432 +P4-F ticks:432 +P3-F ticks:432 +P1-S ticks:452 +P1-F ticks:462 +P2-S ticks:462 +P2-F ticks:472 +P4-S ticks:472 +P1-S ticks:482 +P1-F ticks:492 +P4-F ticks:492 +P2-S ticks:492 +P2-F ticks:502 +P3-S ticks:502 +P1-S ticks:512 +P1-F ticks:522 +P3-F ticks:522 +P2-S ticks:532 +P4-S ticks:532 +P1-S ticks:542 +P1-F ticks:552 +P4-F ticks:552 +P2-F ticks:552 +P1-S ticks:572 +P1-F ticks:582 +P2-S ticks:582 +P3-S ticks:582 +P1-S ticks:602 +P1-F ticks:612 +P3-F ticks:612 +P4-S ticks:612 +P4-F ticks:622 +P2-F ticks:622 +P2 - Deadline miss +P2-S ticks:622 +P1-S ticks:632 +P1-F ticks:642 +P2-F ticks:642 +P1-S ticks:662 +P1-F ticks:672 +P2-S ticks:672 +P4-S ticks:672 +P4-F ticks:682 +P3-S ticks:682 +P1-S ticks:692 +P1-F ticks:702 +P3-F ticks:702 +P2-F ticks:702 +P2 - Deadline miss +P2-S ticks:702 +P2-F ticks:712 +P1-S ticks:722 +P1-F ticks:732 +P2-S ticks:742 +P4-S ticks:742 +P1-S ticks:752 +P1-F ticks:762 +P4-F ticks:762 +P2-F ticks:762 +P3-S ticks:772 +P1-S ticks:782 +P1-F ticks:792 +P2-S ticks:792 +P3-F ticks:792 +P2-F ticks:802 +P1-S ticks:812 +P1-F ticks:822 +P2-S ticks:822 +P4-S ticks:822 +P4-F ticks:832 +P2-F ticks:832 +P1-S ticks:842 +*** END OF TEST CBS SCHEDULER 3 *** diff --git a/testsuites/sptests/spcbssched03/system.h b/testsuites/sptests/spcbssched03/system.h new file mode 100644 index 0000000000..0fccc8136d --- /dev/null +++ b/testsuites/sptests/spcbssched03/system.h @@ -0,0 +1,73 @@ +/* system.h + * + * This include file contains information that is included in every + * function in the test set. + * + * COPYRIGHT (c) 1989-1999. + * 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. + * + * $Id$ + */ + +#include + +/* functions */ + +rtems_task Init( + rtems_task_argument argument +); + +rtems_task Tasks_Periodic( + rtems_task_argument argument +); + +rtems_task Tasks_Aperiodic( + rtems_task_argument argument +); + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_MICROSECONDS_PER_TICK 100000 + +#define CONFIGURE_MAXIMUM_TASKS 7 +#define CONFIGURE_MAXIMUM_PERIODS 10 + +#define CONFIGURE_INIT_TASK_PRIORITY 100 +#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_EXTRA_TASK_STACKS (6 * 4 * RTEMS_MINIMUM_STACK_SIZE) + +#define CONFIGURE_SCHEDULER_CBS + +#include + +#include +#include +#include +#include + +#define JOBS_PER_HP (389) +#define HP_LENGTH (420) +#define NUM_PERIODIC_TASKS (4) +#define NUM_APERIODIC_TASKS (2) +#define NUM_TASKS ( NUM_PERIODIC_TASKS + NUM_APERIODIC_TASKS ) + +/* global variables */ + +TEST_EXTERN rtems_id Task_id[ 1+NUM_TASKS ]; /* array of task ids */ +TEST_EXTERN rtems_name Task_name[ 1+NUM_TASKS ]; /* array of task names */ +extern rtems_task_priority Priorities[ 1+NUM_TASKS ]; +extern uint32_t Periods[ 1 + NUM_PERIODIC_TASKS ]; +extern uint32_t Phases[1 + NUM_TASKS]; +extern uint32_t Execution[1 + NUM_TASKS]; +bool Violating_task[1 + NUM_PERIODIC_TASKS]; + +/* end of include file */ diff --git a/testsuites/sptests/spcbssched03/tasks_aperiodic.c b/testsuites/sptests/spcbssched03/tasks_aperiodic.c new file mode 100644 index 0000000000..f8c302745a --- /dev/null +++ b/testsuites/sptests/spcbssched03/tasks_aperiodic.c @@ -0,0 +1,48 @@ +/* Tasks_Aperiodic + * + * This routine serves as a test task for the CBS scheduler + * implementation. This is for aperiodic task execution. + * + * Input parameters: + * argument - task argument + * + * Output parameters: NONE + * + * 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. + * + * $Id$ + */ + +#include "system.h" + +rtems_task Tasks_Aperiodic( + rtems_task_argument argument +) +{ + rtems_status_code status; + int start, stop, now; + + put_name( Task_name[ argument ], FALSE ); + + status = rtems_task_wake_after( 2 + Phases[argument] ); + directive_failed( status, "rtems_task_wake_after" ); + + rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &start); + printf("AT%" PRIdPTR "-S ticks:%d\n", argument, start); + /* active computing */ + + while(FOREVER) { + rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now); + if (now >= start + Execution[argument]) break; + } + rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &stop); + printf("P%" PRIdPTR "-F ticks:%d\n", argument, stop); + + /* delete SELF */ + fflush(stdout); + printf( "Killing task %" PRIdPTR "\n", argument); + status = rtems_task_delete(RTEMS_SELF); + directive_failed(status, "rtems_task_delete of RTEMS_SELF"); +} diff --git a/testsuites/sptests/spcbssched03/tasks_periodic.c b/testsuites/sptests/spcbssched03/tasks_periodic.c new file mode 100644 index 0000000000..0fa6df0b54 --- /dev/null +++ b/testsuites/sptests/spcbssched03/tasks_periodic.c @@ -0,0 +1,154 @@ +/* Tasks_Periodic + * + * This routine serves as a test task for the CBS scheduler + * implementation. + * + * Input parameters: + * argument - task argument + * + * Output parameters: NONE + * + * 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. + * + * $Id$ + */ + +#include "system.h" + +void overrun_handler_task_4 ( + rtems_cbs_server_id server_id +) +{ + printk( "Signal overrun, fixing the task\n" ); + Violating_task[ 4 ] = 0; + /* rtems_task_restart( RTEMS_SELF, 4 ); might be also possible*/ + return; +} + +rtems_task Tasks_Periodic( + rtems_task_argument argument +) +{ + rtems_id rmid; + rtems_id test_rmid; + rtems_status_code status; + bool scenario_done = 0; + + int start, stop, now; + + rtems_cbs_server_id server_id, tsid; + rtems_cbs_parameters params, tparams; + + params.deadline = Periods[ argument ]; + params.budget = Execution[ argument ]+1; + + if ( argument == 4 ) { + if ( rtems_cbs_create_server( ¶ms, &overrun_handler_task_4, &server_id )) + printf( "ERROR: CREATE SERVER FAILED\n" ); + } + else { + if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) ) + printf( "ERROR: CREATE SERVER FAILED\n" ); + } + if ( rtems_cbs_attach_thread( server_id, Task_id[ argument ] ) ) + printf( "ERROR: ATTACH THREAD FAILED\n" ); + if ( rtems_cbs_get_server_id( Task_id[ argument ], &tsid ) ) + printf( "ERROR: GET SERVER ID FAILED\n" ); + if ( tsid != server_id ) + printf( "ERROR: SERVER ID MISMATCH\n" ); + if ( rtems_cbs_get_parameters( server_id, &tparams ) ) + printf( "ERROR: GET PARAMETERS FAILED\n" ); + if ( params.deadline != tparams.deadline || + params.budget != tparams.budget ) + printf( "ERROR: PARAMETERS MISMATCH\n" ); + + status = rtems_rate_monotonic_create( argument, &rmid ); + directive_failed( status, "rtems_rate_monotonic_create" ); + put_name( Task_name[ argument ], FALSE ); + printf( "- rtems_rate_monotonic_create id = 0x%08" PRIxrtems_id "\n", + rmid ); + + status = rtems_rate_monotonic_ident( argument, &test_rmid ); + directive_failed( status, "rtems_rate_monotonic_ident" ); + put_name( Task_name[ argument ], FALSE ); + printf( "- rtems_rate_monotonic_ident id = 0x%08" PRIxrtems_id "\n", + test_rmid ); + + if ( rmid != test_rmid ) { + printf( "RMID's DO NOT MATCH (0x%" PRIxrtems_id " and 0x%" + PRIxrtems_id ")\n", rmid, test_rmid ); + rtems_test_exit( 0 ); + } + + put_name( Task_name[ argument ], FALSE ); + printf( "- (0x%08" PRIxrtems_id ") period %" PRIu32 "\n", + rmid, Periods[ argument ] ); + + status = rtems_task_wake_after( 2 + Phases[argument] ); + directive_failed( status, "rtems_task_wake_after" ); + + while (FOREVER) { + if (rtems_rate_monotonic_period(rmid, Periods[argument])==RTEMS_TIMEOUT) + printf("P%" PRIdPTR " - Deadline miss\n", argument); + + rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &start); + printf("P%" PRIdPTR "-S ticks:%d\n", argument, start); + if ( start >= 2*HP_LENGTH ) break; /* stop */ + + /* Specific scenario for task 4: tries to exceed announced budget, + the task priority has to be pulled down to background. */ + if ( !scenario_done && argument == 4 && now >= 200 ) { + Violating_task[ argument ] = 1; + scenario_done = 1; + } + /* Specific scenario for task 3: changes scheduling parameters. */ + if ( !scenario_done && argument == 3 && now >= 250 ) { + Periods[ argument ] = Periods[ argument ] * 2; + Execution[ argument ] = Execution[ argument ] * 2; + params.deadline = Periods[ argument ]; + params.budget = Execution[ argument ]+1; + if ( rtems_cbs_set_parameters( server_id, ¶ms) ) + printf( "ERROR: SET PARAMETERS FAILED\n" ); + if ( rtems_cbs_get_parameters( server_id, &tparams ) ) + printf( "ERROR: GET PARAMETERS FAILED\n" ); + if ( params.deadline != tparams.deadline || + params.budget != tparams.budget ) + printf( "ERROR: PARAMETERS MISMATCH\n" ); + scenario_done = 1; + } + /* Specific scenario for task 2: late unblock after being blocked by + itself, the task priority has to be pulled down to background. */ + if ( !scenario_done && argument == 2 && now >= 500 ) { + Violating_task[ argument ] = 1; + scenario_done = 1; + } + if (argument == 2 && Violating_task[ argument ]) + rtems_task_wake_after( 10 ); + + /* active computing */ + while(FOREVER) { + rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now); + if ( argument == 4 && !Violating_task[ argument ] && + (now >= start + Execution[argument])) + break; + if ( argument != 4 && (now >= start + Execution[argument]) ) + break; + } + rtems_clock_get(RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &stop); + printf("P%" PRIdPTR "-F ticks:%d\n", argument, stop); + } + + /* delete period and SELF */ + status = rtems_rate_monotonic_delete( rmid ); + if ( status != RTEMS_SUCCESSFUL ) { + printf("rtems_rate_monotonic_delete failed with status of %d.\n",status); + rtems_test_exit( 0 ); + } + if ( rtems_cbs_cleanup() ) + printf( "ERROR: CBS CLEANUP\n" ); + fflush(stdout); + puts( "*** END OF TEST CBS SCHEDULER 3 ***" ); + rtems_test_exit( 0 ); +} -- cgit v1.2.3