From 73a117039f90122c1e9d14ca2be7c88a6f640892 Mon Sep 17 00:00:00 2001 From: "bernard.xiong@gmail.com" Date: Sat, 8 Oct 2011 13:02:22 +0000 Subject: [PATCH] add newlib compiler depend git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1742 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/libc/newlib/SConscript | 25 +- components/libc/newlib/libc.c | 64 +-- components/libc/newlib/math.c | 520 +++++++++++------------ 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 d8ce850d0..72f56838c 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 fcdc961f0..bd3797b6c 100644 --- a/components/libc/newlib/libc.c +++ b/components/libc/newlib/libc.c @@ -1,32 +1,32 @@ -#include -#include -#include -#include -#include -#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 +#include +#include +#include +#include +#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 70db15523..61418f25f 100644 --- a/components/libc/newlib/math.c +++ b/components/libc/newlib/math.c @@ -1,260 +1,260 @@ -#include - -/* - * 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 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 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<0) - { - for(i=0; x<0.7; i++) - { - x = sqrt(x); - } - return (1< 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 + +/* + * 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 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 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<0) + { + for(i=0; x<0.7; i++) + { + x = sqrt(x); + } + return (1< 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 f3c7b09e4..3baef8141 100644 --- a/components/libc/newlib/syscalls.c +++ b/components/libc/newlib/syscalls.c @@ -1,335 +1,335 @@ -#include -#include -#include -#include - -/* 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 -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 +#include +#include +#include + +/* 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 +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); +} -- GitLab