提交 d3da3bd9 编写于 作者: B BernardXiong

[libc] move clock_time to time.

上级 1383a977
......@@ -225,25 +225,42 @@ _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
}
#endif
#ifndef RT_USING_PTHREADS
#ifdef RT_USING_PTHREADS
#ifndef MILLISECOND_PER_SECOND
#define MILLISECOND_PER_SECOND 1000UL
#endif
#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;
#ifndef MICROSECOND_PER_SECOND
#define MICROSECOND_PER_SECOND 1000000UL
#endif
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 NANOSECOND_PER_SECOND
#define MILLISECOND_PER_SECOND 1000UL
#define MICROSECOND_PER_SECOND 1000000UL
#define NANOSECOND_PER_SECOND 1000000000UL
#endif
#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)
struct timeval _timevalue = {0};
#ifdef RT_USING_DEVICE
static void libc_system_time_init(void)
......@@ -311,29 +328,6 @@ _gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp)
ptr->_errno = ENOTSUP;
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
/* Memory routine */
......
......@@ -27,9 +27,6 @@
int pthread_system_init(void)
{
/* initialize clock and time */
clock_time_system_init();
/* initialize key area */
pthread_key_system_init();
/* initialize posix mqueue */
......
......@@ -276,35 +276,4 @@ int pthread_barrier_init(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
#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);
void clock_time_system_init(void);
void posix_mq_system_init(void);
void posix_sem_system_init(void);
void pthread_key_system_init(void);
......
......@@ -6,7 +6,7 @@ cwd = GetCurrentDir()
src = Glob('*.c') + Glob('*.cpp')
CPPPATH = [cwd]
group = DefineGroup('libc', src,
depend = ['RT_USING_LIBC', 'RT_USING_POSIX_TIMER'], CPPPATH = CPPPATH)
group = DefineGroup('pthreads', src,
depend = ['RT_USING_PTHREADS'], CPPPATH = CPPPATH)
Return('group')
......@@ -24,10 +24,13 @@
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <pthread.h>
#include "clock_time.h"
struct timeval _timevalue;
void clock_time_system_init()
int clock_time_system_init()
{
time_t time;
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_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)
{
......@@ -83,38 +89,80 @@ RTM_EXPORT(clock_time_to_tick);
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);
return -1;
}
switch (clockid)
{
case CLOCK_REALTIME:
res->tv_sec = 0;
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);
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);
return -1;
}
switch (clockid)
{
case CLOCK_REALTIME:
{
/* get tick */
tick = rt_tick_get();
int tick = rt_tick_get();
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;
}
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);
......
/*
* 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册