summaryrefslogtreecommitdiff
path: root/components/libc/newlib
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-10-08 13:02:22 +0000
committer[email protected] <[email protected]>2011-10-08 13:02:22 +0000
commit73a117039f90122c1e9d14ca2be7c88a6f640892 (patch)
tree6d493c3bdb981d37d2677dd078032a4bdaad9352 /components/libc/newlib
parent0d2624313a32529dd401ae841df4ea22472c2d7b (diff)
add newlib compiler depend
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1742 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/libc/newlib')
-rw-r--r--components/libc/newlib/SConscript25
-rw-r--r--components/libc/newlib/libc.c64
-rw-r--r--components/libc/newlib/math.c520
-rw-r--r--components/libc/newlib/syscalls.c670
4 files changed, 644 insertions, 635 deletions
diff --git a/components/libc/newlib/SConscript b/components/libc/newlib/SConscript
index d8ce850d0f..72f56838ce 100644
--- a/components/libc/newlib/SConscript
+++ b/components/libc/newlib/SConscript
@@ -1,8 +1,17 @@
-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')
diff --git a/components/libc/newlib/libc.c b/components/libc/newlib/libc.c
index fcdc961f08..bd3797b6c4 100644
--- a/components/libc/newlib/libc.c
+++ b/components/libc/newlib/libc.c
@@ -1,32 +1,32 @@
-#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
+}
diff --git a/components/libc/newlib/math.c b/components/libc/newlib/math.c
index 70db155236..61418f25f3 100644
--- a/components/libc/newlib/math.c
+++ b/components/libc/newlib/math.c
@@ -1,260 +1,260 @@
-#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 ([email protected])
- */
-
-#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 ([email protected])
+ */
+
+#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));
+}
+
diff --git a/components/libc/newlib/syscalls.c b/components/libc/newlib/syscalls.c
index f3c7b09e43..3baef81419 100644
--- a/components/libc/newlib/syscalls.c
+++ b/components/libc/newlib/syscalls.c
@@ -1,335 +1,335 @@
-#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);
+}