提交 73a11703 编写于 作者: B bernard.xiong@gmail.com

add newlib compiler depend

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1742 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 0d262431
Import('RTT_ROOT')
from building import *
src = Glob('*.c')
CPPPATH = [RTT_ROOT + '/components/libc/newlib']
group = DefineGroup('newlib', src, depend = ['RT_USING_NEWLIB'], CPPPATH = CPPPATH)
Return('group')
Import('rtconfig')
from building import *
if rtconfig.CROSS_TOOL != 'gcc':
print '================ERROR============================'
print 'Please use GNU GCC compiler if using newlib'
print '================================================='
exit(0)
cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd]
group = DefineGroup('newlib', src, depend = ['RT_USING_NEWLIB'], CPPPATH = CPPPATH)
Return('group')
#include <rtthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/time.h>
#include "libc.h"
void libc_system_init(const char* tty_name)
{
int fd;
extern int pthread_system_init(void);
#ifndef RT_USING_DFS_DEVFS
#error Please enable devfs by defining RT_USING_DFS_DEVFS in rtconfig.h
#endif
/* init console device */
rt_console_init(tty_name);
/* open console as stdin/stdout/stderr */
fd = open("/dev/console", O_RDONLY, 0); /* for stdin */
fd = open("/dev/console", O_WRONLY, 0); /* for stdout */
fd = open("/dev/console", O_WRONLY, 0); /* for stderr */
/* set PATH and HOME */
putenv("PATH=/");
putenv("HOME=/");
#ifdef RT_USING_PTHREADS
pthread_system_init();
#endif
}
#include <rtthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/time.h>
#include "libc.h"
void libc_system_init(const char* tty_name)
{
int fd;
extern int pthread_system_init(void);
#ifndef RT_USING_DFS_DEVFS
#error Please enable devfs by defining RT_USING_DFS_DEVFS in rtconfig.h
#endif
/* init console device */
rt_console_init(tty_name);
/* open console as stdin/stdout/stderr */
fd = open("/dev/console", O_RDONLY, 0); /* for stdin */
fd = open("/dev/console", O_WRONLY, 0); /* for stdout */
fd = open("/dev/console", O_WRONLY, 0); /* for stderr */
/* set PATH and HOME */
putenv("PATH=/");
putenv("HOME=/");
#ifdef RT_USING_PTHREADS
pthread_system_init();
#endif
}
#include <math.h>
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS CRT
* FILE: lib/crt/math/cos.c
* PURPOSE: Generic C Implementation of cos
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
#define PRECISION 9
static double cos_off_tbl[] = {0.0, -M_PI/2., 0, -M_PI/2.};
static double cos_sign_tbl[] = {1,-1,-1,1};
static double sin_off_tbl[] = {0.0, -M_PI/2., 0, -M_PI/2.};
static double sin_sign_tbl[] = {1,-1,-1,1};
double sin(double x)
{
int quadrant;
double x2, result;
/* Calculate the quadrant */
quadrant = x * (2./M_PI);
/* Get offset inside quadrant */
x = x - quadrant * (M_PI/2.);
/* Normalize quadrant to [0..3] */
quadrant = (quadrant - 1) & 0x3;
/* Fixup value for the generic function */
x += sin_off_tbl[quadrant];
/* Calculate the negative of the square of x */
x2 = - (x * x);
/* This is an unrolled taylor series using <PRECISION> iterations
* Example with 4 iterations:
* result = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8!
* To save multiplications and to keep the precision high, it's performed
* like this:
* result = 1 - x^2 * (1/2! - x^2 * (1/4! - x^2 * (1/6! - x^2 * (1/8!))))
*/
/* Start with 0, compiler will optimize this away */
result = 0;
#if (PRECISION >= 10)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20);
result *= x2;
#endif
#if (PRECISION >= 9)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18);
result *= x2;
#endif
#if (PRECISION >= 8)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16);
result *= x2;
#endif
#if (PRECISION >= 7)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14);
result *= x2;
#endif
#if (PRECISION >= 6)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12);
result *= x2;
#endif
#if (PRECISION >= 5)
result += 1./(1.*2*3*4*5*6*7*8*9*10);
result *= x2;
#endif
result += 1./(1.*2*3*4*5*6*7*8);
result *= x2;
result += 1./(1.*2*3*4*5*6);
result *= x2;
result += 1./(1.*2*3*4);
result *= x2;
result += 1./(1.*2);
result *= x2;
result += 1;
/* Apply correct sign */
result *= sin_sign_tbl[quadrant];
return result;
}
double cos(double x)
{
int quadrant;
double x2, result;
/* Calculate the quadrant */
quadrant = x * (2./M_PI);
/* Get offset inside quadrant */
x = x - quadrant * (M_PI/2.);
/* Normalize quadrant to [0..3] */
quadrant = quadrant & 0x3;
/* Fixup value for the generic function */
x += cos_off_tbl[quadrant];
/* Calculate the negative of the square of x */
x2 = - (x * x);
/* This is an unrolled taylor series using <PRECISION> iterations
* Example with 4 iterations:
* result = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8!
* To save multiplications and to keep the precision high, it's performed
* like this:
* result = 1 - x^2 * (1/2! - x^2 * (1/4! - x^2 * (1/6! - x^2 * (1/8!))))
*/
/* Start with 0, compiler will optimize this away */
result = 0;
#if (PRECISION >= 10)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20);
result *= x2;
#endif
#if (PRECISION >= 9)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18);
result *= x2;
#endif
#if (PRECISION >= 8)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16);
result *= x2;
#endif
#if (PRECISION >= 7)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14);
result *= x2;
#endif
#if (PRECISION >= 6)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12);
result *= x2;
#endif
#if (PRECISION >= 5)
result += 1./(1.*2*3*4*5*6*7*8*9*10);
result *= x2;
#endif
result += 1./(1.*2*3*4*5*6*7*8);
result *= x2;
result += 1./(1.*2*3*4*5*6);
result *= x2;
result += 1./(1.*2*3*4);
result *= x2;
result += 1./(1.*2);
result *= x2;
result += 1;
/* Apply correct sign */
result *= cos_sign_tbl[quadrant];
return result;
}
static const int N = 100;
double coef(int n)
{
double t;
if (n == 0)
{
return 0;
}
t = 1.0/n;
if (n%2 == 0)
{
t = -t;
}
return t;
}
double horner(double x)
{
double u = coef(N);
int i;
for(i=N-1; i>=0; i--)
{
u = u*x + coef(i);
}
return u;
}
double sqrt(double b)
{
double x = 1;
int step = 0;
while ((x*x-b<-0.000000000000001 || x*x-b>0.000000000000001) && step<50)
{
x = (b/x+x)/2.0;
step++;
}
return x;
}
double ln(double x)
{
int i;
if (x > 1.5)
{
for(i=0; x>1.25; i++)
{
x = sqrt(x);
}
return (1<<i)*horner(x-1);
}
else if (x<0.7 && x>0)
{
for(i=0; x<0.7; i++)
{
x = sqrt(x);
}
return (1<<i)*horner(x-1);
}
else if(x > 0)
{
return horner(x-1);
}
}
double exp(double x)
{
double sum = 1;
int i;
for(i=N; i>0; i--)
{
sum /= i;
sum *= x;
sum += 1;
}
return sum;
}
double pow(double m, double n)
{
return exp(n*ln(m));
}
#include <math.h>
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS CRT
* FILE: lib/crt/math/cos.c
* PURPOSE: Generic C Implementation of cos
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
#define PRECISION 9
static double cos_off_tbl[] = {0.0, -M_PI/2., 0, -M_PI/2.};
static double cos_sign_tbl[] = {1,-1,-1,1};
static double sin_off_tbl[] = {0.0, -M_PI/2., 0, -M_PI/2.};
static double sin_sign_tbl[] = {1,-1,-1,1};
double sin(double x)
{
int quadrant;
double x2, result;
/* Calculate the quadrant */
quadrant = x * (2./M_PI);
/* Get offset inside quadrant */
x = x - quadrant * (M_PI/2.);
/* Normalize quadrant to [0..3] */
quadrant = (quadrant - 1) & 0x3;
/* Fixup value for the generic function */
x += sin_off_tbl[quadrant];
/* Calculate the negative of the square of x */
x2 = - (x * x);
/* This is an unrolled taylor series using <PRECISION> iterations
* Example with 4 iterations:
* result = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8!
* To save multiplications and to keep the precision high, it's performed
* like this:
* result = 1 - x^2 * (1/2! - x^2 * (1/4! - x^2 * (1/6! - x^2 * (1/8!))))
*/
/* Start with 0, compiler will optimize this away */
result = 0;
#if (PRECISION >= 10)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20);
result *= x2;
#endif
#if (PRECISION >= 9)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18);
result *= x2;
#endif
#if (PRECISION >= 8)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16);
result *= x2;
#endif
#if (PRECISION >= 7)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14);
result *= x2;
#endif
#if (PRECISION >= 6)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12);
result *= x2;
#endif
#if (PRECISION >= 5)
result += 1./(1.*2*3*4*5*6*7*8*9*10);
result *= x2;
#endif
result += 1./(1.*2*3*4*5*6*7*8);
result *= x2;
result += 1./(1.*2*3*4*5*6);
result *= x2;
result += 1./(1.*2*3*4);
result *= x2;
result += 1./(1.*2);
result *= x2;
result += 1;
/* Apply correct sign */
result *= sin_sign_tbl[quadrant];
return result;
}
double cos(double x)
{
int quadrant;
double x2, result;
/* Calculate the quadrant */
quadrant = x * (2./M_PI);
/* Get offset inside quadrant */
x = x - quadrant * (M_PI/2.);
/* Normalize quadrant to [0..3] */
quadrant = quadrant & 0x3;
/* Fixup value for the generic function */
x += cos_off_tbl[quadrant];
/* Calculate the negative of the square of x */
x2 = - (x * x);
/* This is an unrolled taylor series using <PRECISION> iterations
* Example with 4 iterations:
* result = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8!
* To save multiplications and to keep the precision high, it's performed
* like this:
* result = 1 - x^2 * (1/2! - x^2 * (1/4! - x^2 * (1/6! - x^2 * (1/8!))))
*/
/* Start with 0, compiler will optimize this away */
result = 0;
#if (PRECISION >= 10)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20);
result *= x2;
#endif
#if (PRECISION >= 9)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18);
result *= x2;
#endif
#if (PRECISION >= 8)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16);
result *= x2;
#endif
#if (PRECISION >= 7)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12*13*14);
result *= x2;
#endif
#if (PRECISION >= 6)
result += 1./(1.*2*3*4*5*6*7*8*9*10*11*12);
result *= x2;
#endif
#if (PRECISION >= 5)
result += 1./(1.*2*3*4*5*6*7*8*9*10);
result *= x2;
#endif
result += 1./(1.*2*3*4*5*6*7*8);
result *= x2;
result += 1./(1.*2*3*4*5*6);
result *= x2;
result += 1./(1.*2*3*4);
result *= x2;
result += 1./(1.*2);
result *= x2;
result += 1;
/* Apply correct sign */
result *= cos_sign_tbl[quadrant];
return result;
}
static const int N = 100;
double coef(int n)
{
double t;
if (n == 0)
{
return 0;
}
t = 1.0/n;
if (n%2 == 0)
{
t = -t;
}
return t;
}
double horner(double x)
{
double u = coef(N);
int i;
for(i=N-1; i>=0; i--)
{
u = u*x + coef(i);
}
return u;
}
double sqrt(double b)
{
double x = 1;
int step = 0;
while ((x*x-b<-0.000000000000001 || x*x-b>0.000000000000001) && step<50)
{
x = (b/x+x)/2.0;
step++;
}
return x;
}
double ln(double x)
{
int i;
if (x > 1.5)
{
for(i=0; x>1.25; i++)
{
x = sqrt(x);
}
return (1<<i)*horner(x-1);
}
else if (x<0.7 && x>0)
{
for(i=0; x<0.7; i++)
{
x = sqrt(x);
}
return (1<<i)*horner(x-1);
}
else if(x > 0)
{
return horner(x-1);
}
}
double exp(double x)
{
double sum = 1;
int i;
for(i=N; i>0; i--)
{
sum /= i;
sum *= x;
sum += 1;
}
return sum;
}
double pow(double m, double n)
{
return exp(n*ln(m));
}
#include <reent.h>
#include <sys/errno.h>
#include <sys/time.h>
#include <rtthread.h>
/* Reentrant versions of system calls. */
int
_close_r(struct _reent *ptr, int fd)
{
return close(fd);
}
int
_execve_r(struct _reent *ptr, const char * name, char *const *argv, char *const *env)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_fcntl_r(struct _reent *ptr, int fd, int cmd, int arg)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_fork_r(struct _reent *ptr)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_fstat_r(struct _reent *ptr, int fd, struct stat *pstat)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_getpid_r(struct _reent *ptr)
{
return 0;
}
int
_isatty_r(struct _reent *ptr, int fd)
{
if (fd >=0 && fd < 3) return 1;
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_kill_r(struct _reent *ptr, int pid, int sig)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_link_r(struct _reent *ptr, const char *old, const char *new)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
_off_t
_lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence)
{
_off_t rc;
rc = lseek(fd, pos, whence);
return rc;
}
int
_mkdir_r(struct _reent *ptr, const char *name, int mode)
{
int rc;
rc = mkdir(name, mode);
return rc;
}
int
_open_r(struct _reent *ptr, const char *file, int flags, int mode)
{
int rc;
rc = open(file, flags, mode);
return rc;
}
_ssize_t
_read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
{
_ssize_t rc;
rc = read(fd, buf, nbytes);
return rc;
}
int
_rename_r(struct _reent *ptr, const char *old, const char *new)
{
int rc;
rc = rename(old, new);
return rc;
}
void *
_sbrk_r(struct _reent *ptr, ptrdiff_t incr)
{
/* no use this routine to get memory */
return RT_NULL;
}
int
_stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
{
int rc;
rc = stat(file, pstat);
return rc;
}
_CLOCK_T_
_times_r(struct _reent *ptr, struct tms *ptms)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_unlink_r(struct _reent *ptr, const char *file)
{
int rc;
rc = unlink(file);
return rc;
}
int
_wait_r(struct _reent *ptr, int *status)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
_ssize_t
_write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
_ssize_t rc;
rc = write(fd, buf, nbytes);
return rc;
}
#ifndef RT_USING_PTHREADS
#ifndef MILLISECOND_PER_SECOND
#define MILLISECOND_PER_SECOND 1000UL
#endif
#ifndef MICROSECOND_PER_SECOND
#define MICROSECOND_PER_SECOND 1000000UL
#endif
#ifndef NANOSECOND_PER_SECOND
#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};
static void libc_system_time_init()
{
time_t time;
rt_tick_t tick;
rt_device_t device;
time = 0;
device = rt_device_find("rtc");
if (device != RT_NULL)
{
/* get realtime seconds */
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
}
/* get tick */
tick = rt_tick_get();
_timevalue.tv_usec = MICROSECOND_PER_SECOND - (tick%RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK;
_timevalue.tv_sec = time - tick/RT_TICK_PER_SECOND - 1;
}
int libc_get_time(struct timespec *time)
{
rt_tick_t tick;
static rt_bool_t inited = 0;
RT_ASSERT(time != RT_NULL);
/* initialize system time */
if (inited == 0)
{
libc_system_time_init();
inited = 1;
}
/* get tick */
tick = rt_tick_get();
time->tv_sec = _timevalue.tv_sec + tick / RT_TICK_PER_SECOND;
time->tv_nsec = (_timevalue.tv_usec + (tick % RT_TICK_PER_SECOND) * NANOSECOND_PER_TICK) * 1000;
return 0;
}
int
_gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp)
{
struct timespec tp;
if (libc_get_time(&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
/* 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 */
void *
_malloc_r (struct _reent *ptr, size_t size)
{
void* result;
result = (void*)rt_malloc (size);
if (result == RT_NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void *
_realloc_r (struct _reent *ptr, void *old, size_t newlen)
{
void* result;
result = (void*)rt_realloc (old, newlen);
if (result == RT_NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void *_calloc_r (struct _reent *ptr, size_t size, size_t len)
{
void* result;
result = (void*)rt_calloc (size, len);
if (result == RT_NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void
_free_r (struct _reent *ptr, void *addr)
{
rt_free (addr);
}
void
_exit (int status)
{
rt_kprintf("thread:%s exit with %d\n", rt_thread_self()->name, status);
RT_ASSERT(0);
}
#include <reent.h>
#include <sys/errno.h>
#include <sys/time.h>
#include <rtthread.h>
/* Reentrant versions of system calls. */
int
_close_r(struct _reent *ptr, int fd)
{
return close(fd);
}
int
_execve_r(struct _reent *ptr, const char * name, char *const *argv, char *const *env)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_fcntl_r(struct _reent *ptr, int fd, int cmd, int arg)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_fork_r(struct _reent *ptr)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_fstat_r(struct _reent *ptr, int fd, struct stat *pstat)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_getpid_r(struct _reent *ptr)
{
return 0;
}
int
_isatty_r(struct _reent *ptr, int fd)
{
if (fd >=0 && fd < 3) return 1;
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_kill_r(struct _reent *ptr, int pid, int sig)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_link_r(struct _reent *ptr, const char *old, const char *new)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
_off_t
_lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence)
{
_off_t rc;
rc = lseek(fd, pos, whence);
return rc;
}
int
_mkdir_r(struct _reent *ptr, const char *name, int mode)
{
int rc;
rc = mkdir(name, mode);
return rc;
}
int
_open_r(struct _reent *ptr, const char *file, int flags, int mode)
{
int rc;
rc = open(file, flags, mode);
return rc;
}
_ssize_t
_read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
{
_ssize_t rc;
rc = read(fd, buf, nbytes);
return rc;
}
int
_rename_r(struct _reent *ptr, const char *old, const char *new)
{
int rc;
rc = rename(old, new);
return rc;
}
void *
_sbrk_r(struct _reent *ptr, ptrdiff_t incr)
{
/* no use this routine to get memory */
return RT_NULL;
}
int
_stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
{
int rc;
rc = stat(file, pstat);
return rc;
}
_CLOCK_T_
_times_r(struct _reent *ptr, struct tms *ptms)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
int
_unlink_r(struct _reent *ptr, const char *file)
{
int rc;
rc = unlink(file);
return rc;
}
int
_wait_r(struct _reent *ptr, int *status)
{
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
}
_ssize_t
_write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
_ssize_t rc;
rc = write(fd, buf, nbytes);
return rc;
}
#ifndef RT_USING_PTHREADS
#ifndef MILLISECOND_PER_SECOND
#define MILLISECOND_PER_SECOND 1000UL
#endif
#ifndef MICROSECOND_PER_SECOND
#define MICROSECOND_PER_SECOND 1000000UL
#endif
#ifndef NANOSECOND_PER_SECOND
#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};
static void libc_system_time_init()
{
time_t time;
rt_tick_t tick;
rt_device_t device;
time = 0;
device = rt_device_find("rtc");
if (device != RT_NULL)
{
/* get realtime seconds */
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
}
/* get tick */
tick = rt_tick_get();
_timevalue.tv_usec = MICROSECOND_PER_SECOND - (tick%RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK;
_timevalue.tv_sec = time - tick/RT_TICK_PER_SECOND - 1;
}
int libc_get_time(struct timespec *time)
{
rt_tick_t tick;
static rt_bool_t inited = 0;
RT_ASSERT(time != RT_NULL);
/* initialize system time */
if (inited == 0)
{
libc_system_time_init();
inited = 1;
}
/* get tick */
tick = rt_tick_get();
time->tv_sec = _timevalue.tv_sec + tick / RT_TICK_PER_SECOND;
time->tv_nsec = (_timevalue.tv_usec + (tick % RT_TICK_PER_SECOND) * NANOSECOND_PER_TICK) * 1000;
return 0;
}
int
_gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp)
{
struct timespec tp;
if (libc_get_time(&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
/* 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 */
void *
_malloc_r (struct _reent *ptr, size_t size)
{
void* result;
result = (void*)rt_malloc (size);
if (result == RT_NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void *
_realloc_r (struct _reent *ptr, void *old, size_t newlen)
{
void* result;
result = (void*)rt_realloc (old, newlen);
if (result == RT_NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void *_calloc_r (struct _reent *ptr, size_t size, size_t len)
{
void* result;
result = (void*)rt_calloc (size, len);
if (result == RT_NULL)
{
ptr->_errno = ENOMEM;
}
return result;
}
void
_free_r (struct _reent *ptr, void *addr)
{
rt_free (addr);
}
void
_exit (int status)
{
rt_kprintf("thread:%s exit with %d\n", rt_thread_self()->name, status);
RT_ASSERT(0);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册