[libc] move clock_time to time.
This commit is contained in:
parent
1383a97737
commit
d3da3bd9b2
@ -225,25 +225,42 @@ _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef RT_USING_PTHREADS
|
#ifdef RT_USING_PTHREADS
|
||||||
|
|
||||||
|
#include <clock_time.h>
|
||||||
|
/* POSIX timer provides clock_gettime function */
|
||||||
|
#include <time.h>
|
||||||
|
int
|
||||||
|
_gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp)
|
||||||
|
{
|
||||||
|
struct timespec tp;
|
||||||
|
|
||||||
|
if (clock_gettime(CLOCK_REALTIME, &tp) == 0)
|
||||||
|
{
|
||||||
|
if (__tp != RT_NULL)
|
||||||
|
{
|
||||||
|
__tp->tv_sec = tp.tv_sec;
|
||||||
|
__tp->tv_usec = tp.tv_nsec / 1000UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tp.tv_sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return "not supported" */
|
||||||
|
ptr->_errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#ifndef MILLISECOND_PER_SECOND
|
|
||||||
#define MILLISECOND_PER_SECOND 1000UL
|
#define MILLISECOND_PER_SECOND 1000UL
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MICROSECOND_PER_SECOND
|
|
||||||
#define MICROSECOND_PER_SECOND 1000000UL
|
#define MICROSECOND_PER_SECOND 1000000UL
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NANOSECOND_PER_SECOND
|
|
||||||
#define NANOSECOND_PER_SECOND 1000000000UL
|
#define NANOSECOND_PER_SECOND 1000000000UL
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
||||||
#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
||||||
#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
||||||
|
|
||||||
|
|
||||||
struct timeval _timevalue = {0};
|
struct timeval _timevalue = {0};
|
||||||
#ifdef RT_USING_DEVICE
|
#ifdef RT_USING_DEVICE
|
||||||
static void libc_system_time_init(void)
|
static void libc_system_time_init(void)
|
||||||
@ -311,29 +328,6 @@ _gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp)
|
|||||||
ptr->_errno = ENOTSUP;
|
ptr->_errno = ENOTSUP;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
/* POSIX thread provides clock_gettime function */
|
|
||||||
#include <time.h>
|
|
||||||
int
|
|
||||||
_gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp)
|
|
||||||
{
|
|
||||||
struct timespec tp;
|
|
||||||
|
|
||||||
if (clock_gettime(CLOCK_REALTIME, &tp) == 0)
|
|
||||||
{
|
|
||||||
if (__tp != RT_NULL)
|
|
||||||
{
|
|
||||||
__tp->tv_sec = tp.tv_sec;
|
|
||||||
__tp->tv_usec = tp.tv_nsec / 1000UL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tp.tv_sec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return "not supported" */
|
|
||||||
ptr->_errno = ENOTSUP;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Memory routine */
|
/* Memory routine */
|
||||||
|
@ -27,9 +27,6 @@
|
|||||||
|
|
||||||
int pthread_system_init(void)
|
int pthread_system_init(void)
|
||||||
{
|
{
|
||||||
/* initialize clock and time */
|
|
||||||
clock_time_system_init();
|
|
||||||
|
|
||||||
/* initialize key area */
|
/* initialize key area */
|
||||||
pthread_key_system_init();
|
pthread_key_system_init();
|
||||||
/* initialize posix mqueue */
|
/* initialize posix mqueue */
|
||||||
|
@ -276,35 +276,4 @@ int pthread_barrier_init(pthread_barrier_t *barrier,
|
|||||||
|
|
||||||
int pthread_barrier_wait(pthread_barrier_t *barrier);
|
int pthread_barrier_wait(pthread_barrier_t *barrier);
|
||||||
|
|
||||||
/* posix clock and timer */
|
|
||||||
#define MILLISECOND_PER_SECOND 1000UL
|
|
||||||
#define MICROSECOND_PER_SECOND 1000000UL
|
|
||||||
#define NANOSECOND_PER_SECOND 1000000000UL
|
|
||||||
|
|
||||||
#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
|
||||||
#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
|
||||||
#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
|
||||||
|
|
||||||
#ifndef CLOCK_REALTIME
|
|
||||||
#define CLOCK_REALTIME 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CLOCK_CPUTIME_ID 2
|
|
||||||
|
|
||||||
#ifndef CLOCK_PROCESS_CPUTIME_ID
|
|
||||||
#define CLOCK_PROCESS_CPUTIME_ID CLOCK_CPUTIME_ID
|
|
||||||
#endif
|
|
||||||
#ifndef CLOCK_THREAD_CPUTIME_ID
|
|
||||||
#define CLOCK_THREAD_CPUTIME_ID CLOCK_CPUTIME_ID
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CLOCK_MONOTONIC
|
|
||||||
#define CLOCK_MONOTONIC 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int clock_getres (clockid_t clockid, struct timespec *res);
|
|
||||||
int clock_gettime (clockid_t clockid, struct timespec *tp);
|
|
||||||
int clock_settime (clockid_t clockid, const struct timespec *tp);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ rt_inline _pthread_data_t *_pthread_get_data(pthread_t thread)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int clock_time_to_tick(const struct timespec *time);
|
int clock_time_to_tick(const struct timespec *time);
|
||||||
void clock_time_system_init(void);
|
|
||||||
void posix_mq_system_init(void);
|
void posix_mq_system_init(void);
|
||||||
void posix_sem_system_init(void);
|
void posix_sem_system_init(void);
|
||||||
void pthread_key_system_init(void);
|
void pthread_key_system_init(void);
|
||||||
|
@ -6,7 +6,7 @@ cwd = GetCurrentDir()
|
|||||||
src = Glob('*.c') + Glob('*.cpp')
|
src = Glob('*.c') + Glob('*.cpp')
|
||||||
CPPPATH = [cwd]
|
CPPPATH = [cwd]
|
||||||
|
|
||||||
group = DefineGroup('libc', src,
|
group = DefineGroup('pthreads', src,
|
||||||
depend = ['RT_USING_LIBC', 'RT_USING_POSIX_TIMER'], CPPPATH = CPPPATH)
|
depend = ['RT_USING_PTHREADS'], CPPPATH = CPPPATH)
|
||||||
|
|
||||||
Return('group')
|
Return('group')
|
@ -24,10 +24,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
#include <rtdevice.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#include "clock_time.h"
|
||||||
|
|
||||||
struct timeval _timevalue;
|
struct timeval _timevalue;
|
||||||
void clock_time_system_init()
|
int clock_time_system_init()
|
||||||
{
|
{
|
||||||
time_t time;
|
time_t time;
|
||||||
rt_tick_t tick;
|
rt_tick_t tick;
|
||||||
@ -46,7 +49,10 @@ void clock_time_system_init()
|
|||||||
|
|
||||||
_timevalue.tv_usec = (tick%RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK;
|
_timevalue.tv_usec = (tick%RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK;
|
||||||
_timevalue.tv_sec = time - tick/RT_TICK_PER_SECOND - 1;
|
_timevalue.tv_sec = time - tick/RT_TICK_PER_SECOND - 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
INIT_COMPONENT_EXPORT(clock_time_system_init);
|
||||||
|
|
||||||
int clock_time_to_tick(const struct timespec *time)
|
int clock_time_to_tick(const struct timespec *time)
|
||||||
{
|
{
|
||||||
@ -83,38 +89,80 @@ RTM_EXPORT(clock_time_to_tick);
|
|||||||
|
|
||||||
int clock_getres(clockid_t clockid, struct timespec *res)
|
int clock_getres(clockid_t clockid, struct timespec *res)
|
||||||
{
|
{
|
||||||
if ((clockid != CLOCK_REALTIME) || (res == RT_NULL))
|
int ret = 0;
|
||||||
|
|
||||||
|
if (res == RT_NULL)
|
||||||
{
|
{
|
||||||
rt_set_errno(EINVAL);
|
rt_set_errno(EINVAL);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (clockid)
|
||||||
|
{
|
||||||
|
case CLOCK_REALTIME:
|
||||||
res->tv_sec = 0;
|
res->tv_sec = 0;
|
||||||
res->tv_nsec = NANOSECOND_PER_SECOND/RT_TICK_PER_SECOND;
|
res->tv_nsec = NANOSECOND_PER_SECOND/RT_TICK_PER_SECOND;
|
||||||
|
break;
|
||||||
|
|
||||||
return 0;
|
#ifdef RT_USING_CPUTIME
|
||||||
|
case CLOCK_CPUTIME_ID:
|
||||||
|
res->tv_sec = 0;
|
||||||
|
res->tv_nsec = clock_cpu_getres();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = -1;
|
||||||
|
rt_set_errno(EINVAL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
RTM_EXPORT(clock_getres);
|
RTM_EXPORT(clock_getres);
|
||||||
|
|
||||||
int clock_gettime(clockid_t clockid, struct timespec *tp)
|
int clock_gettime(clockid_t clockid, struct timespec *tp)
|
||||||
{
|
{
|
||||||
rt_tick_t tick;
|
int ret = 0;
|
||||||
|
|
||||||
if ((clockid != CLOCK_REALTIME) || (tp == RT_NULL))
|
if (tp == RT_NULL)
|
||||||
{
|
{
|
||||||
rt_set_errno(EINVAL);
|
rt_set_errno(EINVAL);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (clockid)
|
||||||
|
{
|
||||||
|
case CLOCK_REALTIME:
|
||||||
|
{
|
||||||
/* get tick */
|
/* get tick */
|
||||||
tick = rt_tick_get();
|
int tick = rt_tick_get();
|
||||||
|
|
||||||
tp->tv_sec = _timevalue.tv_sec + tick / RT_TICK_PER_SECOND;
|
tp->tv_sec = _timevalue.tv_sec + tick / RT_TICK_PER_SECOND;
|
||||||
tp->tv_nsec = (_timevalue.tv_usec + (tick % RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK) * 1000;
|
tp->tv_nsec = (_timevalue.tv_usec + (tick % RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK) * 1000;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
return 0;
|
#ifdef RT_USING_CPUTIME
|
||||||
|
case CLOCK_CPUTIME_ID:
|
||||||
|
{
|
||||||
|
float unit = 0;
|
||||||
|
long long cpu_tick;
|
||||||
|
|
||||||
|
unit = clock_cpu_getres();
|
||||||
|
cpu_tick = clock_cpu_gettime();
|
||||||
|
|
||||||
|
tp->tv_sec = ((int)(cpu_tick * unit)) / NANOSECOND_PER_SECOND;
|
||||||
|
tp->tv_nsec = ((int)(cpu_tick * unit)) % NANOSECOND_PER_SECOND;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
rt_set_errno(EINVAL);
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
RTM_EXPORT(clock_gettime);
|
RTM_EXPORT(clock_gettime);
|
||||||
|
|
58
components/libc/time/clock_time.h
Normal file
58
components/libc/time/clock_time.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* File : clock_time.h
|
||||||
|
* This file is part of RT-Thread RTOS
|
||||||
|
* COPYRIGHT (C) 2006 - 2017, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2017-12-31 Bernard the first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CLOCK_TIME_H__
|
||||||
|
#define CLOCK_TIME_H__
|
||||||
|
|
||||||
|
/* posix clock and timer */
|
||||||
|
#define MILLISECOND_PER_SECOND 1000UL
|
||||||
|
#define MICROSECOND_PER_SECOND 1000000UL
|
||||||
|
#define NANOSECOND_PER_SECOND 1000000000UL
|
||||||
|
|
||||||
|
#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
||||||
|
#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
||||||
|
#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
|
||||||
|
|
||||||
|
#ifndef CLOCK_REALTIME
|
||||||
|
#define CLOCK_REALTIME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CLOCK_CPUTIME_ID 2
|
||||||
|
|
||||||
|
#ifndef CLOCK_PROCESS_CPUTIME_ID
|
||||||
|
#define CLOCK_PROCESS_CPUTIME_ID CLOCK_CPUTIME_ID
|
||||||
|
#endif
|
||||||
|
#ifndef CLOCK_THREAD_CPUTIME_ID
|
||||||
|
#define CLOCK_THREAD_CPUTIME_ID CLOCK_CPUTIME_ID
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CLOCK_MONOTONIC
|
||||||
|
#define CLOCK_MONOTONIC 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int clock_getres (clockid_t clockid, struct timespec *res);
|
||||||
|
int clock_gettime (clockid_t clockid, struct timespec *tp);
|
||||||
|
int clock_settime (clockid_t clockid, const struct timespec *tp);
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user