diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/inline/rtems/score/tod.inl | 75 |
1 files changed, 71 insertions, 4 deletions
diff --git a/cpukit/score/inline/rtems/score/tod.inl b/cpukit/score/inline/rtems/score/tod.inl index 428989b0f7..733c4e1ede 100644 --- a/cpukit/score/inline/rtems/score/tod.inl +++ b/cpukit/score/inline/rtems/score/tod.inl @@ -6,7 +6,7 @@ */ /* - * COPYRIGHT (c) 1989-2004. + * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -19,20 +19,68 @@ #ifndef _RTEMS_SCORE_TOD_INL #define _RTEMS_SCORE_TOD_INL +#include <rtems/score/isr.h> + /** * @addtogroup ScoreTOD * @{ */ /** + * + * This routines adds two timespecs. The second argument is added + * to the first. + */ + +RTEMS_INLINE_ROUTINE uint32_t _TOD_Add_timespec( + struct timespec *time, + struct timespec *add +) +{ + uint32_t seconds = 0; + + + /* Add the basics */ + time->tv_sec += add->tv_sec; + time->tv_nsec += add->tv_nsec; + + /* Now adjust it so nanoseconds is in range */ + while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { + time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND; + time->tv_sec++; + seconds++; + } + + return seconds; +} + +/** * This routine increments the ticks field of the current time of * day at each clock tick. */ RTEMS_INLINE_ROUTINE void _TOD_Tickle_ticks( void ) { - _TOD_Current.ticks += 1; + struct timespec tick; + uint32_t seconds; + + /* Convert the tick quantum to a timespec */ + tick.tv_nsec = _TOD_Microseconds_per_tick * 1000; + tick.tv_sec = 0; + + /* Update the counter of ticks since boot */ _Watchdog_Ticks_since_boot += 1; + + /* Update the timespec format uptime */ + (void) _TOD_Add_timespec( &_TOD_Uptime, &tick ); + /* we do not care how much the uptime changed */ + + /* Update the timespec format TOD */ + seconds = _TOD_Add_timespec( &_TOD_Now, &tick ); + while ( seconds ) { + _Watchdog_Tickle_seconds(); + seconds--; + } } /** @@ -41,7 +89,7 @@ RTEMS_INLINE_ROUTINE void _TOD_Tickle_ticks( void ) RTEMS_INLINE_ROUTINE void _TOD_Deactivate( void ) { - _Watchdog_Remove( &_TOD_Seconds_watchdog ); + /* XXX do we need something now that we are using timespec for TOD */ } /** @@ -52,7 +100,26 @@ RTEMS_INLINE_ROUTINE void _TOD_Activate( Watchdog_Interval ticks ) { - _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, ticks ); + /* XXX do we need something now that we are using timespec for TOD */ +} + +/** + * This routine returns a timeval based upon the internal timespec format TOD. + */ + +RTEMS_INLINE_ROUTINE void _TOD_Get_timeval( + struct timeval *time +) +{ + ISR_Level level; + struct timespec now; + + _ISR_Disable(level); + _TOD_Get( &now ); + _ISR_Enable(level); + + time->tv_sec = now.tv_sec; + time->tv_usec = now.tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND; } /**@}*/ |