diff options
author | Chris Johns <chrisj@rtems.org> | 2013-12-24 16:38:42 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2013-12-24 16:46:19 +1100 |
commit | 2d1bdc8f797db5ab6e3ba6945befaf73d9062798 (patch) | |
tree | e8a3eecc64c589a9d0495790e09092dc572f36cf /cpukit | |
parent | mips/shared: added new doxygen (diff) | |
download | rtems-2d1bdc8f797db5ab6e3ba6945befaf73d9062798.tar.bz2 |
cpukit/rtems: Add rtems_clock_get_uptime_nanoseconds to the RTEMS API.
Add Timestamp support in the score to return a timestamp in nanoseconds.
Add a test.
Update the RTEMS API documentation.
Diffstat (limited to '')
-rw-r--r-- | cpukit/rtems/Makefile.am | 1 | ||||
-rw-r--r-- | cpukit/rtems/include/rtems/rtems/clock.h | 7 | ||||
-rw-r--r-- | cpukit/rtems/src/clockgetuptimenanoseconds.c | 35 | ||||
-rw-r--r-- | cpukit/score/Makefile.am | 6 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/timespec.h | 15 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/timestamp.h | 17 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/timestamp64.h | 20 | ||||
-rw-r--r-- | cpukit/score/src/timespecgetasnanoseconds.c | 29 |
8 files changed, 127 insertions, 3 deletions
diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am index c8fcfa6bd2..fd5af5aaa1 100644 --- a/cpukit/rtems/Makefile.am +++ b/cpukit/rtems/Makefile.am @@ -151,6 +151,7 @@ librtems_a_SOURCES += src/clockgettodtimeval.c librtems_a_SOURCES += src/clockgetuptime.c librtems_a_SOURCES += src/clockgetuptimetimeval.c librtems_a_SOURCES += src/clockgetuptimeseconds.c +librtems_a_SOURCES += src/clockgetuptimenanoseconds.c librtems_a_SOURCES += src/clockset.c librtems_a_SOURCES += src/clocksetnsecshandler.c librtems_a_SOURCES += src/clocktick.c diff --git a/cpukit/rtems/include/rtems/rtems/clock.h b/cpukit/rtems/include/rtems/rtems/clock.h index e933a5e31a..dc5901ab0d 100644 --- a/cpukit/rtems/include/rtems/rtems/clock.h +++ b/cpukit/rtems/include/rtems/rtems/clock.h @@ -257,6 +257,13 @@ void rtems_clock_get_uptime_timeval( struct timeval *uptime ); time_t rtems_clock_get_uptime_seconds( void ); /** + * @brief Returns the system uptime in nanoseconds. + * + * @retval The system uptime in nanoseconds. + */ +uint64_t rtems_clock_get_uptime_nanoseconds( void ); + +/** * @brief TOD Validate * * This support function returns true if @a the_tod contains diff --git a/cpukit/rtems/src/clockgetuptimenanoseconds.c b/cpukit/rtems/src/clockgetuptimenanoseconds.c new file mode 100644 index 0000000000..c07a4305db --- /dev/null +++ b/cpukit/rtems/src/clockgetuptimenanoseconds.c @@ -0,0 +1,35 @@ +/** + * @file + * + * @brief Returns the system uptime in seconds. + * @ingroup ClassicClock Clocks + */ + +/* + * Copyright (c) 2013 Chris Johns <chrisj@rtems.org>. All rights reserved. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/rtems/clock.h> +#include <rtems/score/todimpl.h> + +uint64_t rtems_clock_get_uptime_nanoseconds( void ) +{ + Timestamp_Control snapshot_as_timestamp; + uint32_t nanoseconds; + ISR_Level level; + + _TOD_Acquire( &_TOD, level ); + snapshot_as_timestamp = _TOD.uptime; + nanoseconds = ( *_TOD.nanoseconds_since_last_tick )(); + _TOD_Release( &_TOD, level ); + + return _Timestamp_Get_As_nanoseconds( &snapshot_as_timestamp, nanoseconds ); +} diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index 4570ffd16a..4b221294d2 100644 --- a/cpukit/score/Makefile.am +++ b/cpukit/score/Makefile.am @@ -215,7 +215,7 @@ libscore_a_SOURCES += src/schedulersimple.c \ src/schedulersimplereadyqueueenqueuefirst.c \ src/schedulersimpleschedule.c \ src/schedulersimpleunblock.c \ - src/schedulersimpleyield.c + src/schedulersimpleyield.c ## SCHEDULEREDF_C_FILES libscore_a_SOURCES += src/scheduleredf.c \ @@ -275,7 +275,7 @@ libscore_a_SOURCES += src/thread.c src/threadchangepriority.c \ src/threadstackallocate.c src/threadstackfree.c src/threadstart.c \ src/threadstartmultitasking.c src/iterateoverthreads.c \ src/threadblockingoperationcancel.c - + if HAS_SMP libscore_a_SOURCES += src/threaddispatchdisablelevel.c endif @@ -294,7 +294,7 @@ libscore_a_SOURCES += src/threadq.c src/threadqdequeue.c \ libscore_a_SOURCES += src/timespecaddto.c src/timespecfromticks.c \ src/timespecisvalid.c src/timespeclessthan.c \ src/timespecsubtract.c src/timespectoticks.c src/timespecdivide.c \ - src/timespecdividebyinteger.c + src/timespecdividebyinteger.c src/timespecgetasnanoseconds.c ## TIMESTAMP_INT64_C_FILES libscore_a_SOURCES += src/ts64addto.c src/ts64dividebyinteger.c \ diff --git a/cpukit/score/include/rtems/score/timespec.h b/cpukit/score/include/rtems/score/timespec.h index e72ccb2b72..8dd1853511 100644 --- a/cpukit/score/include/rtems/score/timespec.h +++ b/cpukit/score/include/rtems/score/timespec.h @@ -89,6 +89,21 @@ extern "C" { ((_time)->tv_nsec) /** + * @brief Get the timestamp as nanoseconds. + * + * This method returns the timestamp as nanoseconds. + * + * @param[in] time points to the timestamp. + * @param[in] nanoseconds the nanoseconds since the last tick. + * + * @retval The time in nanoseconds. + */ +uint64_t _Timespec_Get_As_nanoseconds( + const struct timespec *time, + const uint32_t nanoseconds +); + +/** * @brief Check if timespec is valid. * * This method determines the validity of a timespec. diff --git a/cpukit/score/include/rtems/score/timestamp.h b/cpukit/score/include/rtems/score/timestamp.h index 638ae7bf52..b920e69d47 100644 --- a/cpukit/score/include/rtems/score/timestamp.h +++ b/cpukit/score/include/rtems/score/timestamp.h @@ -330,6 +330,23 @@ extern "C" { #endif /** + * @brief Get the timestamp as nanoseconds. + * + * This method returns the timestamp as nanoseconds. + * + * @param[in] _time points to the timestamp + * + * @retval The time in nanoseconds. + */ +#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE + #define _Timestamp_Get_As_nanoseconds( _timestamp, _nanoseconds ) \ + _Timespec_Get_As_nanoseconds( _timestamp, _nanoseconds ) +#else + #define _Timestamp_Get_As_nanoseconds( _timestamp, _nanoseconds ) \ + _Timestamp64_Get_As_nanoseconds( _timestamp, _nanoseconds ) +#endif + +/** * @brief Convert timestamp to struct timespec. * * This method returns the seconds portion of the specified @a _timestamp. diff --git a/cpukit/score/include/rtems/score/timestamp64.h b/cpukit/score/include/rtems/score/timestamp64.h index 306ee35fee..bd37ec23e4 100644 --- a/cpukit/score/include/rtems/score/timestamp64.h +++ b/cpukit/score/include/rtems/score/timestamp64.h @@ -367,6 +367,26 @@ static inline uint32_t _Timestamp64_implementation_Get_nanoseconds( ); #endif +static inline uint64_t _Timestamp64_implementation_Get_As_nanoseconds( + const Timestamp64_Control *_time, + const uint32_t nanoseconds +) +{ + return *_time + (uint64_t) nanoseconds; +} + +/** + * @brief Get the 64-bit timestamp as nanoseconds. + * + * This method returns the 64-bit timestamp as it is already in nanoseconds. + * + * @param[in] _time points to the timestamp + * + * @retval The nanoseconds portion of @a _time. + */ +#define _Timestamp64_Get_As_nanoseconds( _time, _nanoseconds ) \ + _Timestamp64_implementation_Get_As_nanoseconds( _time, _nanoseconds ) + static inline void _Timestamp64_implementation_To_timespec( const Timestamp64_Control *_timestamp, struct timespec *_timespec diff --git a/cpukit/score/src/timespecgetasnanoseconds.c b/cpukit/score/src/timespecgetasnanoseconds.c new file mode 100644 index 0000000000..4ef1af4f62 --- /dev/null +++ b/cpukit/score/src/timespecgetasnanoseconds.c @@ -0,0 +1,29 @@ +/** + * @file + * + * @brief Get As Nanoseconds + * @ingroup Timespec + */ + +/* + * COPYRIGHT (c) 2013 Chris Johns <chrisj@rtems.org> + * + * 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 HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/score/timespec.h> +#include <rtems/score/todimpl.h> + +uint64_t _Timespec_Get_As_nanoseconds( + const struct timespec *time, + const uint32_t nanoseconds +) +{ + return ( ((uint64_t) time->tv_sec) * 1000000000ULL ) + time->tv_nsec + nanoseconds; +} |