2011-09-15 Petr Benes <benesp16@fel.cvut.cz>

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.
This commit is contained in:
Joel Sherrill
2011-09-15 15:56:01 +00:00
parent 82db8e5675
commit bd1b8de265
26 changed files with 1416 additions and 1 deletions

View File

@@ -1,3 +1,21 @@
2011-09-15 Petr Benes <benesp16@fel.cvut.cz>
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 <sebastian.huber@embedded-brains.de>
* spnsext01/init.c: Use correct API.

View File

@@ -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

View File

@@ -103,6 +103,9 @@ sp74/Makefile
sp75/Makefile
sp76/Makefile
spassoc01/Makefile
spcbssched01/Makefile
spcbssched02/Makefile
spcbssched03/Makefile
spchain/Makefile
spclockget/Makefile
spcoverage/Makefile

View File

@@ -0,0 +1,2 @@
Makefile
Makefile.in

View File

@@ -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

View File

@@ -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" );
}

View File

@@ -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.

View File

@@ -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 ***

View File

@@ -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 <tmacros.h>
/* 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 <rtems/confdefs.h>
/* 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 */

View File

@@ -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" );
}
}

View File

@@ -0,0 +1,2 @@
Makefile
Makefile.in

View File

@@ -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

View File

@@ -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( &params1, NULL, &server_id ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_create_server( &params2, NULL, &server_id ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_create_server( &params3, NULL, &server_id ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_create_server( &params4, NULL, &server_id ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_create_server( &params, NULL, &server_id2 ) )
printf( "ERROR: CREATE SERVER FAILED\n" );
if ( rtems_cbs_create_server( &params, NULL, &server_id ) )
printf( "ERROR: CREATE SERVER FAILED\n" );
if ( rtems_cbs_create_server( &params, 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, &params ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_set_parameters( 5, &params ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_set_parameters( server_id, &params ) !=
SCHEDULER_CBS_ERROR_NOSERVER )
printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_get_parameters( -5, &params ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_get_parameters( 5, &params ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_get_parameters( server_id, &params ) !=
SCHEDULER_CBS_ERROR_NOSERVER )
printf( "ERROR: GET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_set_parameters( server_id, &params1 ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_set_parameters( server_id, &params2 ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_set_parameters( server_id, &params3 ) !=
SCHEDULER_CBS_ERROR_INVALID_PARAMETER )
printf( "ERROR: SET PARAMETERS PASSED UNEXPECTEDLY\n" );
if ( rtems_cbs_set_parameters( server_id, &params4 ) !=
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" );
}

View File

@@ -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.

View File

@@ -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 ***

View File

@@ -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 <tmacros.h>
/* 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 <rtems/confdefs.h>
#include <rtems/rtems/clock.h>
#include <rtems/score/isr.h>
#include <rtems/rtems/intr.h>
#include <rtems/cbs.h>
/* 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 */

View File

@@ -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( &params, 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( &params, 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, &params ) )
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, &params ) )
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 );
}

View File

@@ -0,0 +1,2 @@
Makefile
Makefile.in

View File

@@ -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

View File

@@ -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

View File

@@ -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" );
}

View File

@@ -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.

View File

@@ -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 ***

View File

@@ -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 <tmacros.h>
/* 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 <rtems/confdefs.h>
#include <rtems/rtems/clock.h>
#include <rtems/score/isr.h>
#include <rtems/rtems/intr.h>
#include <rtems/cbs.h>
#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 */

View File

@@ -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");
}

View File

@@ -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( &params, &overrun_handler_task_4, &server_id ))
printf( "ERROR: CREATE SERVER FAILED\n" );
}
else {
if ( rtems_cbs_create_server( &params, 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, &params) )
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 );
}