From ef70d9b652e75326f534d7e66bb3e0bcc55b3b58 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 29 Jan 2002 18:20:59 +0000 Subject: 2001-01-29 Joel Sherrill * Fixed bug where resetting a timer that was not at the head of one of the task timer chains resulted in the Timer Server task waking up too far in the future. * Added rtems_timer_get_information() directive to support testing. * sp31/init.c, sp31/system.h, sp31/task1.c: Modified to test for above condition. --- c/src/tests/sptests/ChangeLog | 9 +++++ c/src/tests/sptests/sp31/init.c | 7 +++- c/src/tests/sptests/sp31/system.h | 4 +-- c/src/tests/sptests/sp31/task1.c | 74 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 88 insertions(+), 6 deletions(-) (limited to 'c/src/tests') diff --git a/c/src/tests/sptests/ChangeLog b/c/src/tests/sptests/ChangeLog index f897d74e8b..8611d8a020 100644 --- a/c/src/tests/sptests/ChangeLog +++ b/c/src/tests/sptests/ChangeLog @@ -1,3 +1,12 @@ +2001-01-29 Joel Sherrill + + * Fixed bug where resetting a timer that was not at the head + of one of the task timer chains resulted in the Timer Server + task waking up too far in the future. + * Added rtems_timer_get_information() directive to support testing. + * sp31/init.c, sp31/system.h, sp31/task1.c: Modified to test for + above condition. + 2001-01-22 Joel Sherrill * sp09/screen14.c, sp09/sp09.scn, sp30/init.c, sp31/init.c: Modified diff --git a/c/src/tests/sptests/sp31/init.c b/c/src/tests/sptests/sp31/init.c index 3359d3294d..b2a87d5766 100644 --- a/c/src/tests/sptests/sp31/init.c +++ b/c/src/tests/sptests/sp31/init.c @@ -47,6 +47,7 @@ rtems_task Init( Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' ); Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' ); + Timer_name[ 2 ] = rtems_build_name( 'T', 'M', '2', ' ' ); status = rtems_task_create( Task_name[ 1 ], @@ -64,9 +65,13 @@ rtems_task Init( puts( "INIT - rtems_timer_create - creating timer 1" ); status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] ); directive_failed( status, "rtems_timer_create" ); - printf( "INIT - timer 1 has id (0x%x)\n", Timer_id[ 1 ] ); + puts( "INIT - rtems_timer_create - creating timer 2" ); + status = rtems_timer_create( Timer_name[ 2 ], &Timer_id[ 2 ] ); + directive_failed( status, "rtems_timer_create" ); + printf( "INIT - timer 2 has id (0x%x)\n", Timer_id[ 2 ] ); + status = rtems_task_delete( RTEMS_SELF ); directive_failed( status, "rtems_task_delete of RTEMS_SELF" ); } diff --git a/c/src/tests/sptests/sp31/system.h b/c/src/tests/sptests/sp31/system.h index dfda3ccc8a..e0f3640681 100644 --- a/c/src/tests/sptests/sp31/system.h +++ b/c/src/tests/sptests/sp31/system.h @@ -52,7 +52,7 @@ rtems_task Task_1( TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */ TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */ -TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */ -TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */ +TEST_EXTERN rtems_id Timer_id[ 3 ]; /* array of timer ids */ +TEST_EXTERN rtems_name Timer_name[ 3 ]; /* array of timer names */ /* end of include file */ diff --git a/c/src/tests/sptests/sp31/task1.c b/c/src/tests/sptests/sp31/task1.c index f66f0f2aa5..2e21b15dce 100644 --- a/c/src/tests/sptests/sp31/task1.c +++ b/c/src/tests/sptests/sp31/task1.c @@ -24,9 +24,11 @@ rtems_task Task_1( rtems_task_argument argument ) { - rtems_id tmid; - rtems_time_of_day time; - rtems_status_code status; + rtems_id tmid; + rtems_id tmid2; + rtems_time_of_day time; + rtems_status_code status; + rtems_timer_information info; /* Get id */ @@ -35,6 +37,72 @@ rtems_task Task_1( directive_failed( status, "rtems_timer_ident" ); printf( "TA1 - timer 1 has id (0x%x)\n", tmid ); + puts( "TA1 - rtems_timer_ident - identing timer 2" ); + status = rtems_timer_ident( Timer_name[ 2 ], &tmid2 ); + directive_failed( status, "rtems_timer_ident" ); + printf( "TA1 - timer 2 has id (0x%x)\n", tmid2 ); + +/* now check that rescheduling an active timer works OK. */ + puts( "TA1 - rtems_timer_server_fire_after - timer 1 in 30 seconds" ); + status = rtems_timer_server_fire_after( + tmid, 30 * TICKS_PER_SECOND, Delayed_resume, NULL ); + directive_failed( status, "rtems_timer_server_fire_after" ); + + puts( "TA1 - rtems_timer_server_fire_after - timer 2 in 60 seconds" ); + status = rtems_timer_server_fire_after( + tmid2, 60 * TICKS_PER_SECOND, Delayed_resume, NULL ); + directive_failed( status, "rtems_timer_server_fire_after" ); + + status = rtems_timer_get_information( tmid, &info ); + printf( "Timer 1 scheduled for %d ticks since boot\n", + info.start_time + info.initial ); + printf( "Timer Server scheduled for %d ticks since boot\n", + _Timer_Server->Timer.initial + _Timer_Server->Timer.start_time ); + + puts( "TA1 - rtems_task_wake_after - 1 second" ); + status = rtems_task_wake_after( 1 * TICKS_PER_SECOND ); + directive_failed( status, "rtems_timer_wake_after" ); + + puts( "TA1 - rtems_timer_server_fire_after - timer 2 in 60 seconds" ); + status = rtems_timer_server_fire_after( + tmid2, 60 * TICKS_PER_SECOND, Delayed_resume, NULL ); + directive_failed( status, "rtems_timer_server_fire_after" ); + + status = rtems_timer_get_information( tmid, &info ); + directive_failed( status, "rtems_timer_get_information" ); + printf( "Timer 1 scheduled for %d ticks since boot\n", + info.start_time + info.initial ); + printf( "Timer Server scheduled for %d ticks since boot\n", + _Timer_Server->Timer.initial + _Timer_Server->Timer.start_time ); + assert( (info.start_time + info.initial) == + (_Timer_Server->Timer.initial + _Timer_Server->Timer.start_time) ); + + puts( "TA1 - rtems_task_wake_after - 1 second" ); + status = rtems_task_wake_after( 1 * TICKS_PER_SECOND ); + directive_failed( status, "rtems_timer_wake_after" ); + + puts( "TA1 - rtems_timer_server_fire_after - timer 2 in 60 seconds" ); + status = rtems_timer_server_fire_after( + tmid2, 60 * TICKS_PER_SECOND, Delayed_resume, NULL ); + directive_failed( status, "rtems_timer_server_fire_after" ); + + status = rtems_timer_get_information( tmid, &info ); + directive_failed( status, "rtems_timer_get_information" ); + printf( "Timer 1 scheduled for %d ticks since boot\n", + info.start_time + info.initial ); + printf( "Timer Server scheduled for %d ticks since boot\n", + _Timer_Server->Timer.initial + _Timer_Server->Timer.start_time ); + assert( (info.start_time + info.initial) == + (_Timer_Server->Timer.initial + _Timer_Server->Timer.start_time) ); + + puts( "TA1 - rtems_timer_cancel - timer 1" ); + status = rtems_timer_cancel( tmid ); + directive_failed( status, "rtems_timer_cancel" ); + + puts( "TA1 - rtems_timer_cancel - timer 2" ); + status = rtems_timer_cancel( tmid2 ); + directive_failed( status, "rtems_timer_cancel" ); + /* after which is allowed to fire */ Print_time(); -- cgit v1.2.3