ソースを参照

add newlib compiler depend

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1742 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong@gmail.com 13 年 前
コミット
73a117039f

+ 17 - 8
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')

+ 32 - 32
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
+}

+ 260 - 260
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 (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));
+}
+

+ 335 - 335
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);
+}