/* * Based upon test code posted on the RTEMS User's Mailing List * by Sergio Faustino : * * http://www.rtems.org/pipermail/rtems-users/2009-June/005540.html * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. */ #if defined(USE_TIMER_SERVER) #define TEST_NUMBER "53" #define TSR_MODE "Server" #define FIRE_WHEN rtems_timer_server_fire_when #define FIRE_WHEN_STRING "rtems_timer_server_fire_when" #else #define TEST_NUMBER "52" #define TSR_MODE "Interrupt" #define FIRE_WHEN rtems_timer_fire_when #define FIRE_WHEN_STRING "rtems_timer_fire_when" #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include const char rtems_test_name[] = "SP " TEST_NUMBER; #define INITIAL_YEAR 2009 static bool _timer_passage; static rtems_time_of_day time_to_fire; /*timer Routine*/ static rtems_timer_service_routine TIMER_service_routine( rtems_id ignored_id, void *user_data ) { rtems_status_code status; rtems_time_of_day now; _timer_passage = true; memset( &now, 0, sizeof( now ) ); status = rtems_clock_get_tod( &now ); rtems_test_assert( status == RTEMS_SUCCESSFUL ); rtems_test_assert( memcmp( &now, &time_to_fire, sizeof( now ) ) == 0 ); } static rtems_task Init( rtems_task_argument argument ) { rtems_status_code status; rtems_id timer_id; rtems_name timer_name; rtems_time_of_day global_time; TEST_BEGIN(); /* build timer name*/ timer_name = rtems_build_name('T', 'M', '1', ' '); /* create Timer */ status = rtems_timer_create(timer_name, &timer_id); directive_failed( status, "rtems_timer_create" ); #if defined(USE_TIMER_SERVER) /* initiate timer server */ status = rtems_timer_initiate_server( RTEMS_MINIMUM_PRIORITY, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_ATTRIBUTES ); directive_failed( status, "rtems_timer_initiate_server" ); #endif /* Set system clock */ build_time(&global_time, 6, 8, INITIAL_YEAR, 16, 5, 13, 0); status = rtems_clock_set(&global_time); directive_failed( status, "rtems_clock_set" ); /* Set Timer to Fire */ /* build fire times */ time_to_fire = global_time; /* only diferent second */ time_to_fire.year = INITIAL_YEAR + 5; status = FIRE_WHEN( timer_id, &time_to_fire, TIMER_service_routine, (void*) NULL ); directive_failed( status, FIRE_WHEN_STRING ); /* Set system clock FORWARD */ global_time.year = time_to_fire.year; status = rtems_clock_set(&global_time); if (!_timer_passage) { puts( TSR_MODE " Timer FAILED to fire after setting time forward"); rtems_test_exit(0); } puts( TSR_MODE " Timer fired after setting time forward -- OK"); TEST_END(); rtems_test_exit(0); } /* configuration stuff */ #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER #define CONFIGURE_MICROSECONDS_PER_TICK 50000 #define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_TIMERS 1 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT_TASK_PRIORITY (RTEMS_MINIMUM_PRIORITY + 1) #define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES #define CONFIGURE_INIT #include