summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2013-12-24 16:38:42 +1100
committerChris Johns <chrisj@rtems.org>2013-12-24 16:46:19 +1100
commit2d1bdc8f797db5ab6e3ba6945befaf73d9062798 (patch)
treee8a3eecc64c589a9d0495790e09092dc572f36cf /cpukit
parentmips/shared: added new doxygen (diff)
downloadrtems-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.am1
-rw-r--r--cpukit/rtems/include/rtems/rtems/clock.h7
-rw-r--r--cpukit/rtems/src/clockgetuptimenanoseconds.c35
-rw-r--r--cpukit/score/Makefile.am6
-rw-r--r--cpukit/score/include/rtems/score/timespec.h15
-rw-r--r--cpukit/score/include/rtems/score/timestamp.h17
-rw-r--r--cpukit/score/include/rtems/score/timestamp64.h20
-rw-r--r--cpukit/score/src/timespecgetasnanoseconds.c29
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;
+}