/* * Clock Manager * * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. * On-Line Applications Research Corporation (OAR). * All rights assigned to U.S. Government, 1994. * * This material may be reproduced by or for the U.S. Government pursuant * to the copyright license under the clause at DFARS 252.227-7013. This * notice must appear in all copies of this file and its derivatives. * * $Id$ */ #include #include #include #include #include #include #include /*PAGE * * rtems_clock_get * * This directive returns the current date and time. If the time has * not been set by a tm_set then an error is returned. * * Input parameters: * option - which value to return * time_buffer - pointer to output buffer (a time and date structure * or an interval) * * Output parameters: * time_buffer - output filled in * RTEMS_SUCCESSFUL - if successful * error code - if unsuccessful */ rtems_status_code rtems_clock_get( rtems_clock_get_options option, void *time_buffer ) { ISR_Level level; rtems_interval tmp; switch ( option ) { case RTEMS_CLOCK_GET_TOD: if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; *(rtems_time_of_day *)time_buffer = _TOD_Current; return RTEMS_SUCCESSFUL; case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH: if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; *(rtems_interval *)time_buffer = _TOD_Seconds_since_epoch; return RTEMS_SUCCESSFUL; case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT: *(rtems_interval *)time_buffer = _Watchdog_Ticks_since_boot; return RTEMS_SUCCESSFUL; case RTEMS_CLOCK_GET_TICKS_PER_SECOND: *(rtems_interval *)time_buffer = _TOD_Ticks_per_second; return RTEMS_SUCCESSFUL; case RTEMS_CLOCK_GET_TIME_VALUE: if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; _ISR_Disable( level ); ((rtems_clock_time_value *)time_buffer)->seconds = _TOD_Seconds_since_epoch; tmp = _TOD_Current.ticks; _ISR_Enable( level ); tmp *= _TOD_Microseconds_per_tick; ((rtems_clock_time_value *)time_buffer)->microseconds = tmp; return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* should never get here */ } /*PAGE * * rtems_clock_set * * This directive sets the date and time for this node. * * Input parameters: * time_buffer - pointer to the time and date structure * * Output parameters: * RTEMS_SUCCESSFUL - if successful * error code - if unsuccessful */ rtems_status_code rtems_clock_set( rtems_time_of_day *time_buffer ) { rtems_interval seconds; if ( _TOD_Validate( time_buffer ) ) { seconds = _TOD_To_seconds( time_buffer ); _Thread_Disable_dispatch(); _TOD_Set( time_buffer, seconds ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INVALID_CLOCK; } /*PAGE * * rtems_clock_tick * * This directive notifies the executve that a tick has occurred. * When the tick occurs the time manager updates and maintains * the calendar time, timeslicing, and any timeout delays. * * Input parameters: NONE * * Output parameters: * RTEMS_SUCCESSFUL - always succeeds * * NOTE: This routine only works for leap-years through 2099. */ rtems_status_code rtems_clock_tick( void ) { _TOD_Tickle_ticks(); _Watchdog_Tickle_ticks(); _Thread_Tickle_timeslice(); if ( _Thread_Is_context_switch_necessary() && _Thread_Is_dispatching_enabled() ) _Thread_Dispatch(); return RTEMS_SUCCESSFUL; }