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

PR 1897/testing
	* Makefile.am, configure.ac: Add tests for Earliest Deadline First
	(EDF) Scheduling Algorithm implementation.
	* spedfsched01/.cvsignore, spedfsched01/Makefile.am,
	spedfsched01/init.c, spedfsched01/spedfsched01.doc,
	spedfsched01/spedfsched01.scn, spedfsched01/system.h,
	spedfsched01/task1.c, spedfsched02/.cvsignore,
	spedfsched02/Makefile.am, spedfsched02/getall.c, spedfsched02/init.c,
	spedfsched02/spedfsched02.doc, spedfsched02/spedfsched02.scn,
	spedfsched02/system.h, spedfsched02/task1.c, spedfsched03/.cvsignore,
	spedfsched03/Makefile.am, spedfsched03/edfparams.h,
	spedfsched03/init.c, spedfsched03/spedfsched03.doc,
	spedfsched03/spedfsched03.scn, spedfsched03/system.h,
	spedfsched03/tasks_aperiodic.c, spedfsched03/tasks_periodic.c: New
	files.
This commit is contained in:
Joel Sherrill
2011-09-11 20:56:45 +00:00
parent 5472ad414f
commit 0d6aee4e35
27 changed files with 1270 additions and 1 deletions

View File

@@ -1,3 +1,21 @@
2011-09-11 Petr Benes <benesp16@fel.cvut.cz>
PR 1897/testing
* Makefile.am, configure.ac: Add tests for Earliest Deadline First
(EDF) Scheduling Algorithm implementation.
* spedfsched01/.cvsignore, spedfsched01/Makefile.am,
spedfsched01/init.c, spedfsched01/spedfsched01.doc,
spedfsched01/spedfsched01.scn, spedfsched01/system.h,
spedfsched01/task1.c, spedfsched02/.cvsignore,
spedfsched02/Makefile.am, spedfsched02/getall.c, spedfsched02/init.c,
spedfsched02/spedfsched02.doc, spedfsched02/spedfsched02.scn,
spedfsched02/system.h, spedfsched02/task1.c, spedfsched03/.cvsignore,
spedfsched03/Makefile.am, spedfsched03/edfparams.h,
spedfsched03/init.c, spedfsched03/spedfsched03.doc,
spedfsched03/spedfsched03.scn, spedfsched03/system.h,
spedfsched03/tasks_aperiodic.c, spedfsched03/tasks_periodic.c: New
files.
2011-09-09 Sebastian Huber <sebastian.huber@embedded-brains.de>
* sp03/sp03.scn, sp05/sp05.scn, sp23/sp23.scn, sp27/sp27.scn,

View File

@@ -29,7 +29,8 @@ SUBDIRS = \
spintrcritical09 spintrcritical10 spintrcritical11 spintrcritical12 \
spintrcritical13 spintrcritical14 spintrcritical15 spintrcritical16 \
spintrcritical17 spmkdir spmountmgr01 spheapprot \
spsimplesched01 spsimplesched02 spsimplesched03 spnsext01
spsimplesched01 spsimplesched02 spsimplesched03 spnsext01 \
spedfsched01 spedfsched02 spedfsched03
include $(top_srcdir)/../automake/subdirs.am
include $(top_srcdir)/../automake/local.am

View File

@@ -106,6 +106,9 @@ spassoc01/Makefile
spchain/Makefile
spclockget/Makefile
spcoverage/Makefile
spedfsched01/Makefile
spedfsched02/Makefile
spedfsched03/Makefile
sperror01/Makefile
sperror02/Makefile
sperror03/Makefile

View File

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

View File

@@ -0,0 +1,28 @@
##
## $Id$
##
MANAGERS = io semaphore clock
rtems_tests_PROGRAMS = spedfsched01
spedfsched01_SOURCES = init.c task1.c system.h
dist_rtems_tests_DATA = spedfsched01.scn
dist_rtems_tests_DATA += spedfsched01.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
spedfsched01_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(spedfsched01_OBJECTS) $(spedfsched01_LDADD)
LINK_LIBS = $(spedfsched01_LDLIBS)
spedfsched01$(EXEEXT): $(spedfsched01_OBJECTS) $(spedfsched01_DEPENDENCIES)
@rm -f spedfsched01$(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*** EDF 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: spedfsched01
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 EDF-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 @@
*** EDF 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 EDF 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_EDF
#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 EDF 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 = spedfsched02
spedfsched02_SOURCES = init.c getall.c task1.c system.h
dist_rtems_tests_DATA = spedfsched02.scn
dist_rtems_tests_DATA += spedfsched02.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
spedfsched02_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(spedfsched02_OBJECTS) $(spedfsched02_LDADD)
LINK_LIBS = $(spedfsched02_LDLIBS)
spedfsched02$(EXEEXT): $(spedfsched02_OBJECTS) $(spedfsched02_DEPENDENCIES)
@rm -f spedfsched02$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am

View File

@@ -0,0 +1,47 @@
/* Get_all_counters
*
* This routine allows TA5 to atomically obtain the iteration counters.
*
* Input parameters: NONE
*
* 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"
void Get_all_counters()
{
rtems_mode previous_mode;
rtems_status_code status;
status = rtems_task_mode(
RTEMS_NO_PREEMPT,
RTEMS_PREEMPT_MASK,
&previous_mode
);
directive_failed( status, "rtems_task_mode to RTEMS_NO_PREEMPT" );
Temporary_count = Count;
Count.count[ 1 ] = 0;
Count.count[ 2 ] = 0;
Count.count[ 3 ] = 0;
Count.count[ 4 ] = 0;
Count.count[ 5 ] = 0;
Count.count[ 6 ] = 0;
status = rtems_task_mode(
RTEMS_PREEMPT,
RTEMS_PREEMPT_MASK,
&previous_mode
);
directive_failed( status, "rtems_task_mode to RTEMS_PREEMPT" );
}

View File

@@ -0,0 +1,69 @@
/* 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
)
{
uint32_t index;
rtems_status_code status;
puts( "\n\n*** TEST EDF Scheduler 2 ***" );
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', ' ' );
Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
Task_name[ 6 ] = rtems_build_name( 'T', 'A', '6', ' ' );
for ( index = 1 ; index <= 6 ; 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" );
}
for ( index = 1 ; index <= 6 ; index++ ) {
status = rtems_task_start( Task_id[ index ], Task_1_through_6, index );
directive_failed( status, "rtems_task_start loop" );
}
Count.count[ 1 ] = 0;
Count.count[ 2 ] = 0;
Count.count[ 3 ] = 0;
Count.count[ 4 ] = 0;
Count.count[ 5 ] = 0;
Count.count[ 6 ] = 0;
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-2010.
# 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: spedfsched02
directives:
concepts:
a. Verifies EDF Scheduling behavior.

View File

@@ -0,0 +1,40 @@
*** TEST EDF Scheduler 2 ***
TA1 - rtems_rate_monotonic_create id = 0x42010001
TA1 - rtems_rate_monotonic_ident id = 0x42010001
TA1 - (0x42010001) period 2
TA2 - rtems_rate_monotonic_create id = 0x42010002
TA2 - rtems_rate_monotonic_ident id = 0x42010002
TA2 - (0x42010002) period 2
TA3 - rtems_rate_monotonic_create id = 0x42010003
TA3 - rtems_rate_monotonic_ident id = 0x42010003
TA3 - (0x42010003) period 2
TA4 - rtems_rate_monotonic_create id = 0x42010004
TA4 - rtems_rate_monotonic_ident id = 0x42010004
TA4 - (0x42010004) period 2
TA6 - rtems_rate_monotonic_create id = 0x42010005
TA6 - rtems_rate_monotonic_ident id = 0x42010005
TA6 - (0x42010005) period 0
TA5 - rtems_rate_monotonic_create id = 0x42010006
TA5 - rtems_rate_monotonic_ident id = 0x42010006
TA5 - (0x42010006) period 100
TA5 - PERIODS CHECK OK (1)
TA5 - PERIODS CHECK OK (2)
TA5 - PERIODS CHECK OK (3)
TA5 - PERIODS CHECK OK (4)
TA5 - PERIODS CHECK OK (5)
TA6 - Actual: 10 Expected: 10 - OK
TA6 - Actual: 20 Expected: 20 - OK
TA6 - Actual: 30 Expected: 30 - OK
TA6 - Actual: 40 Expected: 40 - OK
TA6 - Actual: 50 Expected: 50 - OK
TA6 - Actual: 60 Expected: 60 - OK
TA6 - Actual: 70 Expected: 70 - OK
TA6 - Actual: 80 Expected: 80 - OK
TA6 - Actual: 90 Expected: 90 - OK
TA6 - Actual: 100 Expected: 100 - OK
TA5 - PERIODS CHECK OK (6)
TA5 - PERIODS CHECK OK (7)
TA5 - PERIODS CHECK OK (8)
TA5 - PERIODS CHECK OK (9)
TA5 - PERIODS CHECK OK (10)
*** END OF TEST EDF SCHEDULER 2 ***

View File

@@ -0,0 +1,65 @@
/* 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>
/* types */
struct counters {
uint32_t count[7];
};
/* functions */
rtems_task Init(
rtems_task_argument argument
);
rtems_task Task_1_through_6(
rtems_task_argument argument
);
void Get_all_counters( void );
/* 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 10
#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_EDF
#include <rtems/confdefs.h>
/* global variables */
TEST_EXTERN rtems_id Task_id[ 7 ]; /* array of task ids */
TEST_EXTERN rtems_name Task_name[ 7 ]; /* array of task names */
TEST_EXTERN struct counters Count; /* iteration counters */
TEST_EXTERN struct counters Temporary_count;
extern rtems_task_priority Priorities[ 7 ];
/* end of include file */

View File

@@ -0,0 +1,158 @@
/* Task_1_through_6
*
* This routine serves as a test task for the EDF scheduling
*
* 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"
/*
runtime of TA6 should be shorter than TA5
*/
#define TA6_ITERATIONS 10
#define TA6_PERIOD_FACTOR 10
uint32_t Periods[7] = { 0, 2, 2, 2, 2, 100, 0 };
uint32_t Iterations[7] = { 0, 50, 50, 50, 50, 1, TA6_ITERATIONS };
rtems_task_priority Priorities[7] = { 0, 2, 2, 2, 2, 100, 1 };
rtems_task Task_1_through_6(
rtems_task_argument argument
)
{
rtems_id rmid;
rtems_id test_rmid;
int index;
int pass;
uint32_t failed;
rtems_status_code status;
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 );
directive_failed( status, "rtems_task_wake_after" );
switch ( argument ) {
case 1:
case 2:
case 3:
case 4:
while ( FOREVER ) {
status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
directive_failed( status, "rtems_rate_monotonic_period" );
Count.count[ argument ]++;
}
break;
case 5:
pass = 0;
failed = 0;
status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
directive_failed( status, "rtems_rate_monotonic_period 1 of TA5" );
Get_all_counters();
while ( FOREVER ) {
status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
directive_failed( status, "rtems_rate_monotonic_period 2 of TA5" );
Get_all_counters();
for( index = 1 ; index <= 4 ; index++ ) {
if ( Temporary_count.count[ index ] != Iterations[ index ] ) {
puts_nocr( "FAIL -- " );
put_name ( Task_name[ index ], FALSE );
printf ( " Actual=%" PRIu32 ", Expected=%" PRIu32 "\n",
Temporary_count.count[ index ],
Iterations[ index ]
);
failed += 1;
}
}
if ( failed == 5 )
rtems_test_exit( 0 );
pass += 1;
printf( "TA5 - PERIODS CHECK OK (%d)\n", pass );
fflush( stdout );
if ( pass == 10 ) {
puts( "*** END OF TEST EDF SCHEDULER 2 ***" );
rtems_test_exit( 0 );
}
}
break;
case 6:
/* test changing periods */
{
uint32_t time[TA6_ITERATIONS+1];
rtems_interval period;
period = 1*TA6_PERIOD_FACTOR;
status = rtems_rate_monotonic_period( rmid, period);
directive_failed( status, "rtems_rate_monotonic_period of TA6" );
time[0] = _Watchdog_Ticks_since_boot; /* timestamp */
/*printf("%d - %d\n", period, time[0]);*/
for (index = 1; index <= TA6_ITERATIONS; index++)
{
period = (index+1)*TA6_PERIOD_FACTOR;
status = rtems_rate_monotonic_period( rmid, period);
directive_failed( status, "rtems_rate_monotonic_period of TA6" );
time[index] = _Watchdog_Ticks_since_boot; /* timestamp */
/*printf("%d - %d\n", period, time[index]);*/
}
for (index = 1; index <= TA6_ITERATIONS; index++)
{
rtems_interval meas = time[index] - time[index-1];
period = index*TA6_PERIOD_FACTOR;
printf( "TA6 - Actual: %" PRIdrtems_interval " Expected: %"
PRIdrtems_interval, meas, period );
if (period == meas) printf(" - OK\n");
else printf(" - FAILED\n");
}
}
rtems_task_suspend(RTEMS_SELF);
break;
}
}

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 = spedfsched03
spedfsched03_SOURCES = init.c tasks_periodic.c tasks_aperiodic.c system.h edfparams.h
dist_rtems_tests_DATA = spedfsched03.scn
dist_rtems_tests_DATA += spedfsched03.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
spedfsched03_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
LINK_OBJS = $(spedfsched03_OBJECTS) $(spedfsched03_LDADD)
LINK_LIBS = $(spedfsched03_LDLIBS)
spedfsched03$(EXEEXT): $(spedfsched03_OBJECTS) $(spedfsched03_DEPENDENCIES)
@rm -f spedfsched03$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am

View File

@@ -0,0 +1,42 @@
/* edfparams.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 __EDFPARAMS_H_
#define __EDFPARAMS_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,61 @@
/* 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 "edfparams.h"
rtems_task Init(
rtems_task_argument argument
)
{
uint32_t index;
rtems_status_code status;
puts( "\n\n*** TEST EDF 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" );
}
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: spedfsched03
directives:
concepts:
a. Verifies EDF Scheduling behavior.

View File

@@ -0,0 +1,176 @@
*** TEST EDF 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
P4-F ticks:282
P3-S ticks:282
P3-F ticks:292
P2-S ticks:292
P2-F ticks:302
P1-S ticks:302
P1-F ticks:312
P5-F ticks:312
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
P3-F ticks:392
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-S ticks:432
P3-F ticks:442
P1-S ticks:452
P1-F ticks:462
P2-S ticks:462
P2-F ticks:472
P3-S ticks:472
P1-S ticks:482
P1-F ticks:492
P3-F ticks:492
P4-S ticks:492
P4-F ticks:502
P2-S ticks:502
P2-F ticks:512
P1-S ticks:512
P1-F ticks:522
P3-S ticks:522
P3-F ticks:532
P2-S ticks:532
P2-F ticks:542
P1-S ticks:542
P1-F ticks:552
P4-S ticks:552
P4-F ticks:562
P1-S ticks:572
P1-F ticks:582
P2-S ticks:582
P2-F ticks:592
P3-S ticks:592
P3-F ticks:602
P1-S ticks:602
P1-F ticks:612
P2-S ticks:612
P2-F ticks:622
P4-S ticks:622
P1-S ticks:632
P1-F ticks:642
P4-F ticks:642
P3-S ticks:642
P3-F ticks:652
P2-S ticks:652
P2-F ticks:662
P1-S ticks:662
P1-F ticks:672
P3-S ticks:672
P3-F ticks:682
P4-S ticks:682
P1-S ticks:692
P1-F ticks:702
P2-S ticks:702
P2-F ticks:712
P4-F ticks:712
P1-S ticks:722
P1-F ticks:732
P3-S ticks:732
P3-F ticks:742
P2-S ticks:742
P2-F ticks:752
P1-S ticks:752
P1-F ticks:762
P4-S ticks:762
P4-F ticks:772
P2-S ticks:772
P2-F ticks:782
P1-S ticks:782
P1-F ticks:792
P3-S ticks:792
P3-F ticks:802
P1-S ticks:812
P1-F ticks:822
P2-S ticks:822
P2-F ticks:832
P3-S ticks:832
P3-F ticks:842
P1-S ticks:842
P4-S ticks:842
*** END OF TEST EDF SCHEDULER 3 ***

View File

@@ -0,0 +1,71 @@
/* 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_EDF
#include <rtems/confdefs.h>
#include <rtems/rtems/clock.h>
#include <rtems/score/isr.h>
#include <rtems/rtems/intr.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];
/* end of include file */

View File

@@ -0,0 +1,50 @@
/* Tasks_Aperiodic
*
* This routine serves as a test task for the EDF 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;
int stop;
int 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,82 @@
/* Tasks_Periodic
*
* This routine serves as a test task for the EDF 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 Tasks_Periodic(
rtems_task_argument argument
)
{
rtems_id rmid;
rtems_id test_rmid;
rtems_status_code status;
int start, stop, now;
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 */
/* active computing */
/* using periodic statistics */
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 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 );
}
fflush(stdout);
puts( "*** END OF TEST EDF SCHEDULER 3 ***" );
rtems_test_exit( 0 );
}