mirror of
https://github.com/apache/nuttx.git
synced 2026-06-04 14:53:47 +08:00
Move timespec calculations from sched into libc/sched
Allow using these functions also outside sched, where systick related calculations are performed Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
This commit is contained in:
committed by
Xiang Xiao
parent
2d125d33d3
commit
c79d2067c7
@@ -19,9 +19,9 @@
|
||||
############################################################################
|
||||
|
||||
CSRCS += clock_initialize.c clock_settime.c clock_gettime.c clock_getres.c
|
||||
CSRCS += clock_time2ticks.c clock_abstime2ticks.c clock_ticks2time.c
|
||||
CSRCS += clock_systime_ticks.c clock_systime_timespec.c clock_timespec_add.c
|
||||
CSRCS += clock_timespec_subtract.c clock.c
|
||||
CSRCS += clock_abstime2ticks.c
|
||||
CSRCS += clock_systime_ticks.c clock_systime_timespec.c
|
||||
CSRCS += clock.c
|
||||
|
||||
ifeq ($(CONFIG_CLOCK_TIMEKEEPING),y)
|
||||
CSRCS += clock_timekeeping.c
|
||||
|
||||
@@ -84,8 +84,5 @@ void weak_function clock_timer(void);
|
||||
int clock_abstime2ticks(clockid_t clockid,
|
||||
FAR const struct timespec *abstime,
|
||||
FAR sclock_t *ticks);
|
||||
int clock_time2ticks(FAR const struct timespec *reltime,
|
||||
FAR sclock_t *ticks);
|
||||
int clock_ticks2time(sclock_t ticks, FAR struct timespec *reltime);
|
||||
|
||||
#endif /* __SCHED_CLOCK_CLOCK_H */
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
/****************************************************************************
|
||||
* sched/clock/clock_ticks2time.c
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <time.h>
|
||||
#include "clock/clock.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: clock_ticks2time
|
||||
*
|
||||
* Description:
|
||||
* Convert the system time tick value to a relative time.
|
||||
*
|
||||
* Input Parameters:
|
||||
* ticks - The number of system time ticks to convert.
|
||||
* reltime - Return the converted system time here.
|
||||
*
|
||||
* Returned Value:
|
||||
* Always returns OK
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int clock_ticks2time(sclock_t ticks, FAR struct timespec *reltime)
|
||||
{
|
||||
sclock_t remainder;
|
||||
|
||||
reltime->tv_sec = ticks / TICK_PER_SEC;
|
||||
remainder = ticks - TICK_PER_SEC * reltime->tv_sec;
|
||||
reltime->tv_nsec = remainder * NSEC_PER_TICK;
|
||||
return OK;
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
/****************************************************************************
|
||||
* sched/clock/clock_time2ticks.c
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "clock/clock.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: clock_time2ticks
|
||||
*
|
||||
* Description:
|
||||
* Convert a timespec delay to system timer ticks. This function is
|
||||
* suitable for calculating relative time delays and does not depend on
|
||||
* the other clock_* logic.
|
||||
*
|
||||
* Input Parameters:
|
||||
* reltime - Convert this relative time to system clock ticks.
|
||||
* ticks - Return the converted number of ticks here.
|
||||
*
|
||||
* Returned Value:
|
||||
* Always returns OK
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int clock_time2ticks(FAR const struct timespec *reltime,
|
||||
FAR sclock_t *ticks)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_LONG_LONG
|
||||
int64_t relnsec;
|
||||
|
||||
/* Convert the relative time into nanoseconds. The range of the int64_t
|
||||
* is sufficiently large that there is no real need for range checking.
|
||||
*/
|
||||
|
||||
relnsec = (int64_t)reltime->tv_sec * NSEC_PER_SEC +
|
||||
(int64_t)reltime->tv_nsec;
|
||||
|
||||
/* Convert nanoseconds to clock ticks, rounding up to the smallest integer
|
||||
* that is greater than or equal to the exact number of tick.
|
||||
*/
|
||||
|
||||
*ticks = (sclock_t)((relnsec + NSEC_PER_TICK - 1) / NSEC_PER_TICK);
|
||||
return OK;
|
||||
#else
|
||||
int32_t relusec;
|
||||
|
||||
/* This function uses an int32_t to only the relative time in microseconds.
|
||||
* that means that the maximum supported relative time is 2,147,487.647
|
||||
* seconds
|
||||
*/
|
||||
|
||||
#if 0 // overkill
|
||||
DEBUGASSERT(reltime->tv_sec < 2147487 ||
|
||||
reltime->tv_sec == 2147487 &&
|
||||
reltime->tv_nsec <= 647 * NSEC_PER_MSEC);
|
||||
#endif
|
||||
|
||||
/* Convert the relative time into microseconds, rounding up to the smallest
|
||||
* value that is greater than or equal to the exact number of microseconds.
|
||||
*/
|
||||
|
||||
relusec = reltime->tv_sec * USEC_PER_SEC +
|
||||
(reltime->tv_nsec + NSEC_PER_USEC - 1) / NSEC_PER_USEC;
|
||||
|
||||
/* Convert microseconds to clock ticks, rounding up to the smallest integer
|
||||
* that is greater than or equal to the exact number of tick.
|
||||
*/
|
||||
|
||||
*ticks = (sclock_t)((relusec + USEC_PER_TICK - 1) / USEC_PER_TICK);
|
||||
return OK;
|
||||
#endif
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
/****************************************************************************
|
||||
* sched/clock/clock_timespec_add.c
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "clock/clock.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: clock_timespec_add
|
||||
*
|
||||
* Description:
|
||||
* Add timespec ts1 to to2 and return the result in ts3
|
||||
*
|
||||
* Input Parameters:
|
||||
* ts1 and ts2: The two timespecs to be added
|
||||
* ts3: The location to return the result (may be ts1 or ts2)
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void clock_timespec_add(FAR const struct timespec *ts1,
|
||||
FAR const struct timespec *ts2,
|
||||
FAR struct timespec *ts3)
|
||||
{
|
||||
time_t sec = ts1->tv_sec + ts2->tv_sec;
|
||||
long nsec = ts1->tv_nsec + ts2->tv_nsec;
|
||||
|
||||
if (nsec >= NSEC_PER_SEC)
|
||||
{
|
||||
nsec -= NSEC_PER_SEC;
|
||||
sec++;
|
||||
}
|
||||
|
||||
ts3->tv_sec = sec;
|
||||
ts3->tv_nsec = nsec;
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
/****************************************************************************
|
||||
* sched/clock/clock_timespec_subtract.c
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "clock/clock.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: clock_timespec_subtract
|
||||
*
|
||||
* Description:
|
||||
* Subtract timespec ts2 from to1 and return the result in ts3.
|
||||
* Zero is returned if the time difference is negative.
|
||||
*
|
||||
* Input Parameters:
|
||||
* ts1 and ts2: The two timespecs to be subtracted (ts1 - ts2)
|
||||
* ts3: The location to return the result (may be ts1 or ts2)
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void clock_timespec_subtract(FAR const struct timespec *ts1,
|
||||
FAR const struct timespec *ts2,
|
||||
FAR struct timespec *ts3)
|
||||
{
|
||||
time_t sec;
|
||||
long nsec;
|
||||
|
||||
if (ts1->tv_sec < ts2->tv_sec)
|
||||
{
|
||||
sec = 0;
|
||||
nsec = 0;
|
||||
}
|
||||
else if (ts1->tv_sec == ts2->tv_sec && ts1->tv_nsec <= ts2->tv_nsec)
|
||||
{
|
||||
sec = 0;
|
||||
nsec = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
sec = ts1->tv_sec - ts2->tv_sec;
|
||||
if (ts1->tv_nsec < ts2->tv_nsec)
|
||||
{
|
||||
nsec = (ts1->tv_nsec + NSEC_PER_SEC) - ts2->tv_nsec;
|
||||
sec--;
|
||||
}
|
||||
else
|
||||
{
|
||||
nsec = ts1->tv_nsec - ts2->tv_nsec;
|
||||
}
|
||||
}
|
||||
|
||||
ts3->tv_sec = sec;
|
||||
ts3->tv_nsec = nsec;
|
||||
}
|
||||
Reference in New Issue
Block a user