diff options
| author | [email protected] <[email protected]> | 2011-10-08 13:02:22 +0000 |
|---|---|---|
| committer | [email protected] <[email protected]> | 2011-10-08 13:02:22 +0000 |
| commit | 73a117039f90122c1e9d14ca2be7c88a6f640892 (patch) | |
| tree | 6d493c3bdb981d37d2677dd078032a4bdaad9352 /components/libc | |
| parent | 0d2624313a32529dd401ae841df4ea22472c2d7b (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')
| -rw-r--r-- | components/libc/newlib/SConscript | 25 | ||||
| -rw-r--r-- | components/libc/newlib/libc.c | 64 | ||||
| -rw-r--r-- | components/libc/newlib/math.c | 520 | ||||
| -rw-r--r-- | components/libc/newlib/syscalls.c | 670 |
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); +} |
