[PATCH 2/3] score: Use struct timespec for TOD
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri Oct 6 13:45:37 UTC 2017
Use the timestamps only for uptime based values. Use struct timespec
for the absolute time values (TOD).
Update #2740.
---
cpukit/posix/src/clockgettime.c | 2 +-
cpukit/posix/src/clocksettime.c | 7 +++-
cpukit/posix/src/timersettime.c | 4 +--
cpukit/score/include/rtems/score/todimpl.h | 54 +++++-------------------------
cpukit/score/src/coretodabsolutetimeout.c | 2 +-
cpukit/score/src/coretodadjust.c | 8 ++---
cpukit/score/src/coretodset.c | 12 +++----
7 files changed, 28 insertions(+), 61 deletions(-)
diff --git a/cpukit/posix/src/clockgettime.c b/cpukit/posix/src/clockgettime.c
index b3adbc4713..4f6c583ff1 100644
--- a/cpukit/posix/src/clockgettime.c
+++ b/cpukit/posix/src/clockgettime.c
@@ -37,7 +37,7 @@ int clock_gettime(
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
- _TOD_Get_as_timespec(tp);
+ _TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
diff --git a/cpukit/posix/src/clocksettime.c b/cpukit/posix/src/clocksettime.c
index 8eb616c8b5..a0fdd9109f 100644
--- a/cpukit/posix/src/clocksettime.c
+++ b/cpukit/posix/src/clocksettime.c
@@ -36,10 +36,15 @@ int clock_settime(
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
+ ISR_lock_Context lock_context;
+
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
rtems_set_errno_and_return_minus_one( EINVAL );
- _TOD_Set_with_timespec( tp );
+ _TOD_Lock();
+ _TOD_Acquire( &lock_context );
+ _TOD_Set( tp, &lock_context );
+ _TOD_Unlock();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME_ID )
diff --git a/cpukit/posix/src/timersettime.c b/cpukit/posix/src/timersettime.c
index 698a47a6b7..1f98a7a08c 100644
--- a/cpukit/posix/src/timersettime.c
+++ b/cpukit/posix/src/timersettime.c
@@ -39,7 +39,7 @@ static void _POSIX_Timer_Insert(
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
/* Store the time when the timer was started again */
- _TOD_Get_as_timespec( &ptimer->time );
+ _TOD_Get( &ptimer->time );
_Watchdog_Insert(
&cpu->Watchdog.Header[ PER_CPU_WATCHDOG_RELATIVE ],
@@ -132,7 +132,7 @@ int timer_settime(
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
struct timespec now;
- _TOD_Get_as_timespec( &now );
+ _TOD_Get( &now );
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
rtems_set_errno_and_return_minus_one( EINVAL );
diff --git a/cpukit/score/include/rtems/score/todimpl.h b/cpukit/score/include/rtems/score/todimpl.h
index 03f25b5ae0..f5dba85f8c 100644
--- a/cpukit/score/include/rtems/score/todimpl.h
+++ b/cpukit/score/include/rtems/score/todimpl.h
@@ -164,65 +164,27 @@ static inline void _TOD_Acquire( ISR_lock_Context *lock_context )
*
* The caller must be the owner of the TOD lock.
*
- * @param tod_as_timestamp The new time of day in timestamp format representing
+ * @param tod The new time of day in timespec format representing
* the time since UNIX Epoch.
* @param lock_context The ISR lock context used for the corresponding
* _TOD_Acquire(). The caller must be the owner of the TOD lock. This
* function will release the TOD lock.
*/
void _TOD_Set(
- const Timestamp_Control *tod_as_timestamp,
- ISR_lock_Context *lock_context
+ const struct timespec *tod,
+ ISR_lock_Context *lock_context
);
/**
- * @brief Sets the time of day with timespec format.
- *
- * @param tod_as_timespec The new time of day in timespec format.
- *
- * @see _TOD_Set().
- */
-static inline void _TOD_Set_with_timespec(
- const struct timespec *tod_as_timespec
-)
-{
- Timestamp_Control tod_as_timestamp;
- ISR_lock_Context lock_context;
-
- _Timestamp_Set(
- &tod_as_timestamp,
- tod_as_timespec->tv_sec,
- tod_as_timespec->tv_nsec
- );
-
- _TOD_Lock();
- _TOD_Acquire( &lock_context );
- _TOD_Set( &tod_as_timestamp, &lock_context );
- _TOD_Unlock();
-}
-
-/**
- * @brief Gets the current time in the bintime format.
- *
- * @param[out] time is the value gathered by the bintime request
- */
-static inline void _TOD_Get(
- Timestamp_Control *time
-)
-{
- _Timecounter_Bintime(time);
-}
-
-/**
* @brief Gets the current time in the timespec format.
*
- * @param[out] time is the value gathered by the nanotime request
+ * @param[out] time is the value gathered by the request
*/
-static inline void _TOD_Get_as_timespec(
- struct timespec *time
+static inline void _TOD_Get(
+ struct timespec *tod
)
{
- _Timecounter_Nanotime(time);
+ _Timecounter_Nanotime( tod );
}
/**
@@ -324,7 +286,7 @@ RTEMS_INLINE_ROUTINE void _TOD_Get_timeval(
* @param[in] delta is the amount to adjust
*/
void _TOD_Adjust(
- const Timestamp_Control *delta
+ const struct timespec *delta
);
/**
diff --git a/cpukit/score/src/coretodabsolutetimeout.c b/cpukit/score/src/coretodabsolutetimeout.c
index fe74a6bbf2..d67b7c33c7 100644
--- a/cpukit/score/src/coretodabsolutetimeout.c
+++ b/cpukit/score/src/coretodabsolutetimeout.c
@@ -47,7 +47,7 @@ TOD_Absolute_timeout_conversion_results _TOD_Absolute_timeout_to_ticks(
* Is the absolute time in the past?
*/
if ( clock == CLOCK_REALTIME ) {
- _TOD_Get_as_timespec( ¤t_time );
+ _TOD_Get( ¤t_time );
} else {
_Assert( clock == CLOCK_MONOTONIC );
_TOD_Get_zero_based_uptime_as_timespec( ¤t_time );
diff --git a/cpukit/score/src/coretodadjust.c b/cpukit/score/src/coretodadjust.c
index 5996565e5c..f493a40b9d 100644
--- a/cpukit/score/src/coretodadjust.c
+++ b/cpukit/score/src/coretodadjust.c
@@ -21,11 +21,11 @@
#include <rtems/score/todimpl.h>
void _TOD_Adjust(
- const Timestamp_Control *delta
+ const struct timespec *delta
)
{
- Timestamp_Control tod;
- ISR_lock_Context lock_context;
+ ISR_lock_Context lock_context;
+ struct timespec tod;
/*
* Currently, RTEMS does the adjustment in one movement.
@@ -38,7 +38,7 @@ void _TOD_Adjust(
_TOD_Lock();
_TOD_Acquire( &lock_context );
_TOD_Get( &tod );
- _Timestamp_Add_to( &tod, delta );
+ _Timespec_Add_to( &tod, delta );
_TOD_Set( &tod, &lock_context );
_TOD_Unlock();
}
diff --git a/cpukit/score/src/coretodset.c b/cpukit/score/src/coretodset.c
index f1d2e36eb0..80b0b762bd 100644
--- a/cpukit/score/src/coretodset.c
+++ b/cpukit/score/src/coretodset.c
@@ -23,21 +23,21 @@
#include <rtems/score/watchdogimpl.h>
void _TOD_Set(
- const Timestamp_Control *tod_as_timestamp,
- ISR_lock_Context *lock_context
+ const struct timespec *tod,
+ ISR_lock_Context *lock_context
)
{
- struct timespec tod_as_timespec;
+ struct bintime tod_as_bintime;
uint64_t tod_as_ticks;
uint32_t cpu_count;
uint32_t cpu_index;
_Assert( _API_Mutex_Is_owner( _Once_Mutex ) );
- _Timecounter_Set_clock( tod_as_timestamp, lock_context );
+ timespec2bintime( tod, &tod_as_bintime );
+ _Timecounter_Set_clock( &tod_as_bintime, lock_context );
- _Timestamp_To_timespec( tod_as_timestamp, &tod_as_timespec );
- tod_as_ticks = _Watchdog_Ticks_from_timespec( &tod_as_timespec );
+ tod_as_ticks = _Watchdog_Ticks_from_timespec( tod );
cpu_count = _SMP_Get_processor_count();
for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
--
2.12.3
More information about the devel
mailing list