From 812da546889eea0b6dea7eb2954f46a4c43d1314 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 2 Apr 2007 18:23:59 +0000 Subject: 2007-04-02 Joel Sherrill * itron/src/itrontime.c, libcsupport/src/__gettod.c, posix/include/rtems/posix/time.h, posix/include/rtems/posix/timer.h, posix/src/clockgettime.c, posix/src/clocksettime.c, posix/src/nanosleep.c, posix/src/posixtimespecsubtract.c, posix/src/posixtimespectointerval.c, posix/src/ptimer1.c, posix/src/sleep.c, rtems/Makefile.am, rtems/include/rtems/rtems/clock.h, rtems/include/rtems/rtems/timer.h, rtems/include/rtems/rtems/types.h, rtems/src/clockget.c, rtems/src/clockset.c, rtems/src/clocktodtoseconds.c, rtems/src/clocktodvalidate.c, rtems/src/taskwakewhen.c, score/Makefile.am, score/include/rtems/score/tod.h, score/inline/rtems/score/tod.inl, score/src/coretod.c, score/src/coretodset.c: Convert from Classic API style TOD_Control as fundamental time structure to POSIX struct timespec. Add clock_get_uptime(). * rtems/src/clockgetuptime.c, score/src/coretodget.c, score/src/coretodgetuptime.c: New files. * score/src/coretodtickle.c, score/src/coretodtoseconds.c, score/src/coretodvalidate.c: Removed. --- cpukit/score/inline/rtems/score/tod.inl | 75 +++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) (limited to 'cpukit/score/inline') 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,11 +19,41 @@ #ifndef _RTEMS_SCORE_TOD_INL #define _RTEMS_SCORE_TOD_INL +#include + /** * @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. @@ -31,8 +61,26 @@ 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; } /**@}*/ -- cgit v1.2.3