summaryrefslogtreecommitdiff
path: root/components/libc/compilers
diff options
context:
space:
mode:
authorxph <[email protected]>2020-04-09 16:35:28 +0800
committerGitHub <[email protected]>2020-04-09 16:35:28 +0800
commitca7f01d79b3e0a997c771cec298e4ebd65b75809 (patch)
tree3d2c48aae7203b14038ba7b98b500b5343ed7f2a /components/libc/compilers
parentf763f8e7284b0492c5a65ad0abf94ee1963d7dcc (diff)
parentbaa3145bfe61b3330b6a160523cc5470fa5db3a7 (diff)
Merge pull request #1 from RT-Thread/master
sync rtt
Diffstat (limited to 'components/libc/compilers')
-rw-r--r--components/libc/compilers/armlibc/SConscript2
-rw-r--r--components/libc/compilers/armlibc/libc.h10
-rw-r--r--components/libc/compilers/armlibc/stubs.c17
-rw-r--r--components/libc/compilers/armlibc/sys/time.h53
-rw-r--r--components/libc/compilers/armlibc/sys/types.h6
-rw-r--r--components/libc/compilers/armlibc/time.c85
-rw-r--r--components/libc/compilers/common/SConscript19
-rw-r--r--components/libc/compilers/common/sys/time.h (renamed from components/libc/compilers/dlib/sys/time.h)2
-rw-r--r--components/libc/compilers/common/time.c291
-rw-r--r--components/libc/compilers/dlib/libc.h10
-rw-r--r--components/libc/compilers/dlib/sys/errno.h5
-rw-r--r--components/libc/compilers/dlib/sys/signal.h16
-rw-r--r--components/libc/compilers/dlib/sys/types.h6
-rw-r--r--components/libc/compilers/dlib/sys/unistd.h8
-rw-r--r--components/libc/compilers/dlib/time.c84
-rw-r--r--components/libc/compilers/minilibc/math.h3
-rw-r--r--components/libc/compilers/minilibc/signal.h20
-rw-r--r--components/libc/compilers/minilibc/sys/types.h11
-rw-r--r--components/libc/compilers/minilibc/time.c305
-rw-r--r--components/libc/compilers/newlib/libc.c2
-rw-r--r--components/libc/compilers/newlib/libc.h12
-rw-r--r--components/libc/compilers/newlib/syscalls.c27
-rw-r--r--components/libc/compilers/newlib/time.c17
23 files changed, 598 insertions, 413 deletions
diff --git a/components/libc/compilers/armlibc/SConscript b/components/libc/compilers/armlibc/SConscript
index 081efa7358..52f7a6d93a 100644
--- a/components/libc/compilers/armlibc/SConscript
+++ b/components/libc/compilers/armlibc/SConscript
@@ -14,7 +14,7 @@ if GetDepend('RT_USING_DFS') == False:
if GetDepend('RT_USING_MODULE') == False:
SrcRemove(src, ['libc_syms.c'])
-if rtconfig.PLATFORM == 'armcc':
+if rtconfig.PLATFORM == 'armcc' or rtconfig.PLATFORM == 'armclang':
group = DefineGroup('libc', src, depend = ['RT_USING_LIBC'],
CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
diff --git a/components/libc/compilers/armlibc/libc.h b/components/libc/compilers/armlibc/libc.h
index 158fe06c3e..b9b1b6212d 100644
--- a/components/libc/compilers/armlibc/libc.h
+++ b/components/libc/compilers/armlibc/libc.h
@@ -12,11 +12,17 @@
#include <stddef.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
int libc_system_init(void);
int libc_stdio_set_console(const char* device_name, int mode);
int libc_stdio_get_console(void);
-int libc_stdio_read (void *buffer, size_t size);
-int libc_stdio_write(const void *buffer, size_t size);
+int libc_stdio_read(void* buffer, size_t size);
+int libc_stdio_write(const void* buffer, size_t size);
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/components/libc/compilers/armlibc/stubs.c b/components/libc/compilers/armlibc/stubs.c
index 6e9f13d143..b6ffb37b0f 100644
--- a/components/libc/compilers/armlibc/stubs.c
+++ b/components/libc/compilers/armlibc/stubs.c
@@ -251,7 +251,7 @@ void _ttywrch(int ch)
#endif
}
-void _sys_exit(int return_code)
+RT_WEAK void _sys_exit(int return_code)
{
/* TODO: perhaps exit the thread which is invoking this function */
while (1);
@@ -265,12 +265,25 @@ void _sys_exit(int return_code)
*/
long _sys_flen(FILEHANDLE fh)
{
+ struct stat stat;
+
+ if (fh < STDERR)
+ return -1;
+
+#ifndef RT_USING_DFS
return -1;
+#else
+ fstat(fh, &stat);
+ return stat.st_size;
+#endif
}
int _sys_istty(FILEHANDLE fh)
{
- return 0;
+ if((STDIN <= fh) && (fh <= STDERR))
+ return 1;
+ else
+ return 0;
}
int remove(const char *filename)
diff --git a/components/libc/compilers/armlibc/sys/time.h b/components/libc/compilers/armlibc/sys/time.h
deleted file mode 100644
index e5751cfa3d..0000000000
--- a/components/libc/compilers/armlibc/sys/time.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- */
-#ifndef _SYS_TIME_H_
-#define _SYS_TIME_H_
-
-#include <time.h>
-#include <sys/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef _TIMEVAL_DEFINED
-#define _TIMEVAL_DEFINED
-/*
- * Structure returned by gettimeofday(2) system call,
- * and used in other calls.
- */
-struct timeval {
- long tv_sec; /* seconds */
- long tv_usec; /* and microseconds */
-};
-#endif /* _TIMEVAL_DEFINED */
-
-#ifndef _TIMESPEC_DEFINED
-#define _TIMESPEC_DEFINED
-/*
- * Structure defined by POSIX.1b to be like a timeval.
- */
-struct timespec {
- time_t tv_sec; /* seconds */
- long tv_nsec; /* and nanoseconds */
-};
-#endif /* _TIMESPEC_DEFINED */
-
-struct timezone {
- int tz_minuteswest; /* minutes west of Greenwich */
- int tz_dsttime; /* type of dst correction */
-};
-
-int gettimeofday(struct timeval *tp, void *ignore);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_TIME_H_ */
diff --git a/components/libc/compilers/armlibc/sys/types.h b/components/libc/compilers/armlibc/sys/types.h
index 4c76dfc429..001ace4dd2 100644
--- a/components/libc/compilers/armlibc/sys/types.h
+++ b/components/libc/compilers/armlibc/sys/types.h
@@ -15,6 +15,10 @@
typedef rt_int32_t clockid_t;
typedef rt_int32_t key_t; /* Used for interprocess communication. */
typedef rt_int32_t pid_t; /* Used for process IDs and process group IDs. */
-typedef signed long ssize_t; /* Used for a count of bytes or an error indication. */
+#ifndef ARCH_CPU_64BIT
+typedef signed int ssize_t; /* Used for a count of bytes or an error indication. */
+#else
+typedef long signed int ssize_t; /* Used for a count of bytes or an error indication. */
+#endif
#endif
diff --git a/components/libc/compilers/armlibc/time.c b/components/libc/compilers/armlibc/time.c
deleted file mode 100644
index 29c5c6cdd2..0000000000
--- a/components/libc/compilers/armlibc/time.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- */
-#include <sys/time.h>
-#include <rtthread.h>
-
-#ifdef RT_USING_DEVICE
-int gettimeofday(struct timeval *tp, void *ignore)
-{
- time_t time;
- rt_device_t device;
-
- device = rt_device_find("rtc");
- if (device != RT_NULL)
- {
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
- if (tp != RT_NULL)
- {
- tp->tv_sec = time;
- tp->tv_usec = 0;
- }
-
- return time;
- }
-
- return 0;
-}
-#endif
-
-/**
- * Returns the current time.
- *
- * @param time_t * t the timestamp pointer, if not used, keep NULL.
- *
- * @return time_t return timestamp current.
- *
- */
-/* for IAR 6.2 later Compiler */
-#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000
-#pragma module_name = "?time"
-time_t (__time32)(time_t *t) /* Only supports 32-bit timestamp */
-#else
-time_t time(time_t *t)
-#endif
-{
- time_t time_now = 0;
-
-#ifdef RT_USING_RTC
- static rt_device_t device = RT_NULL;
-
- /* optimization: find rtc device only first. */
- if (device == RT_NULL)
- {
- device = rt_device_find("rtc");
- }
-
- /* read timestamp from RTC device. */
- if (device != RT_NULL)
- {
- if (rt_device_open(device, 0) == RT_EOK)
- {
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
- rt_device_close(device);
- }
- }
-#endif /* RT_USING_RTC */
-
- /* if t is not NULL, write timestamp to *t */
- if (t != RT_NULL)
- {
- *t = time_now;
- }
-
- return time_now;
-}
-
-RT_WEAK clock_t clock(void)
-{
- return rt_tick_get();
-}
diff --git a/components/libc/compilers/common/SConscript b/components/libc/compilers/common/SConscript
new file mode 100644
index 0000000000..a8d2606820
--- /dev/null
+++ b/components/libc/compilers/common/SConscript
@@ -0,0 +1,19 @@
+from building import *
+
+Import('rtconfig')
+
+src = []
+cwd = GetCurrentDir()
+group = []
+CPPPATH = [cwd]
+
+if GetDepend('RT_USING_LIBC'):
+ src += Glob('*.c')
+else:
+ if GetDepend('RT_LIBC_USING_TIME'):
+ src += ['time.c']
+
+if (rtconfig.PLATFORM == 'armcc' or rtconfig.PLATFORM == 'iar') and rtconfig.ARCH != 'sim' :
+ group = DefineGroup('libc', src, depend = [''], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/components/libc/compilers/dlib/sys/time.h b/components/libc/compilers/common/sys/time.h
index 766d219faf..1d68eeafa3 100644
--- a/components/libc/compilers/dlib/sys/time.h
+++ b/components/libc/compilers/common/sys/time.h
@@ -10,7 +10,6 @@
#define _SYS_TIME_H_
#include <time.h>
-#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
@@ -52,6 +51,7 @@ struct timezone {
};
int gettimeofday(struct timeval *tp, void *ignore);
+struct tm *gmtime_r(const time_t *timep, struct tm *r);
#ifdef __cplusplus
}
diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c
new file mode 100644
index 0000000000..50a800b259
--- /dev/null
+++ b/components/libc/compilers/common/time.c
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-08-21 zhangjun copy from minilibc
+ */
+
+#include <sys/time.h>
+#include <rtthread.h>
+
+#if !defined (__IAR_SYSTEMS_ICC__)
+
+/* days per month -- nonleap! */
+const short __spm[13] =
+{
+ 0,
+ (31),
+ (31 + 28),
+ (31 + 28 + 31),
+ (31 + 28 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31),
+};
+static const char days[] = "Sun Mon Tue Wed Thu Fri Sat ";
+static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ";
+
+/* seconds per day */
+#define SPD 24*60*60
+
+int __isleap(int year)
+{
+ /* every fourth year is a leap year except for century years that are
+ * not divisible by 400. */
+ /* return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); */
+ return (!(year % 4) && ((year % 100) || !(year % 400)));
+}
+
+struct tm *gmtime_r(const time_t *timep, struct tm *r)
+{
+ time_t i;
+ register time_t work = *timep % (SPD);
+ r->tm_sec = work % 60;
+ work /= 60;
+ r->tm_min = work % 60;
+ r->tm_hour = work / 60;
+ work = *timep / (SPD);
+ r->tm_wday = (4 + work) % 7;
+ for (i = 1970;; ++i)
+ {
+ register time_t k = __isleap(i) ? 366 : 365;
+ if (work >= k)
+ work -= k;
+ else
+ break;
+ }
+ r->tm_year = i - 1900;
+ r->tm_yday = work;
+
+ r->tm_mday = 1;
+ if (__isleap(i) && (work > 58))
+ {
+ if (work == 59)
+ r->tm_mday = 2; /* 29.2. */
+ work -= 1;
+ }
+
+ for (i = 11; i && (__spm[i] > work); --i)
+ ;
+ r->tm_mon = i;
+ r->tm_mday += work - __spm[i];
+ return r;
+}
+
+struct tm* gmtime(const time_t* t)
+{
+ static struct tm tmp;
+ return gmtime_r(t, &tmp);
+}
+
+/*TODO timezone is not supprt now */
+struct tm* localtime_r(const time_t* t, struct tm* r)
+{
+ return gmtime_r(t, r);
+}
+
+struct tm* localtime(const time_t* t)
+{
+ static struct tm tmp;
+ return localtime_r(t, &tmp);
+}
+
+time_t mktime(struct tm * const t)
+{
+ register time_t day;
+ register time_t i;
+ register time_t years = t->tm_year - 70;
+
+ if (t->tm_sec > 60)
+ {
+ t->tm_min += t->tm_sec / 60;
+ t->tm_sec %= 60;
+ }
+ if (t->tm_min > 60)
+ {
+ t->tm_hour += t->tm_min / 60;
+ t->tm_min %= 60;
+ }
+ if (t->tm_hour > 24)
+ {
+ t->tm_mday += t->tm_hour / 24;
+ t->tm_hour %= 24;
+ }
+ if (t->tm_mon > 12)
+ {
+ t->tm_year += t->tm_mon / 12;
+ t->tm_mon %= 12;
+ }
+ while (t->tm_mday > __spm[1 + t->tm_mon])
+ {
+ if (t->tm_mon == 1 && __isleap(t->tm_year + 1900))
+ {
+ --t->tm_mday;
+ }
+ t->tm_mday -= __spm[t->tm_mon];
+ ++t->tm_mon;
+ if (t->tm_mon > 11)
+ {
+ t->tm_mon = 0;
+ ++t->tm_year;
+ }
+ }
+
+ if (t->tm_year < 70)
+ return (time_t) - 1;
+
+ /* Days since 1970 is 365 * number of years + number of leap years since 1970 */
+ day = years * 365 + (years + 1) / 4;
+
+ /* After 2100 we have to substract 3 leap years for every 400 years
+ This is not intuitive. Most mktime implementations do not support
+ dates after 2059, anyway, so we might leave this out for it's
+ bloat. */
+ if (years >= 131)
+ {
+ years -= 131;
+ years /= 100;
+ day -= (years >> 2) * 3 + 1;
+ if ((years &= 3) == 3)
+ years--;
+ day -= years;
+ }
+
+ day += t->tm_yday = __spm[t->tm_mon] + t->tm_mday - 1 +
+ (__isleap(t->tm_year + 1900) & (t->tm_mon > 1));
+
+ /* day is now the number of days since 'Jan 1 1970' */
+ i = 7;
+ t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */
+
+ i = 24;
+ day *= i;
+ i = 60;
+ return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
+}
+
+static void num2str(char *c, int i)
+{
+ c[0] = i / 10 + '0';
+ c[1] = i % 10 + '0';
+}
+
+char* asctime_r(const struct tm *t, char *buf)
+{
+ /* "Wed Jun 30 21:49:08 1993\n" */
+ *(int*) buf = *(int*) (days + (t->tm_wday << 2));
+ *(int*) (buf + 4) = *(int*) (months + (t->tm_mon << 2));
+ num2str(buf + 8, t->tm_mday);
+ if (buf[8] == '0')
+ buf[8] = ' ';
+ buf[10] = ' ';
+ num2str(buf + 11, t->tm_hour);
+ buf[13] = ':';
+ num2str(buf + 14, t->tm_min);
+ buf[16] = ':';
+ num2str(buf + 17, t->tm_sec);
+ buf[19] = ' ';
+ num2str(buf + 20, (t->tm_year + 1900) / 100);
+ num2str(buf + 22, (t->tm_year + 1900) % 100);
+ buf[24] = '\n';
+ return buf;
+}
+
+char* asctime(const struct tm *timeptr)
+{
+ static char buf[25];
+ return asctime_r(timeptr, buf);
+}
+
+char* ctime(const time_t *timep)
+{
+ return asctime(localtime(timep));
+}
+
+#endif /* __IAR_SYSTEMS_ICC__ */
+
+int gettimeofday(struct timeval *tp, void *ignore)
+{
+ time_t time = 0;
+#ifdef RT_USING_DEVICE
+ rt_device_t device;
+ device = rt_device_find("rtc");
+ RT_ASSERT(device != RT_NULL);
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
+ if (tp != RT_NULL)
+ {
+ tp->tv_sec = time;
+ tp->tv_usec = 0;
+ }
+#else
+ tv->tv_sec = 0;
+ tv->tv_usec = 0;
+#endif
+
+ return time;
+}
+
+
+/**
+ * Returns the current time.
+ *
+ * @param time_t * t the timestamp pointer, if not used, keep NULL.
+ *
+ * @return time_t return timestamp current.
+ *
+ */
+/* for IAR 6.2 later Compiler */
+#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000
+#pragma module_name = "?time"
+#if _DLIB_TIME_USES_64
+time_t __time64(time_t *t)
+#else
+time_t __time32(time_t *t)
+#endif
+#else
+time_t time(time_t *t)
+#endif
+{
+ time_t time_now = 0;
+
+#ifdef RT_USING_RTC
+ static rt_device_t device = RT_NULL;
+
+ /* optimization: find rtc device only first. */
+ if (device == RT_NULL)
+ {
+ device = rt_device_find("rtc");
+ }
+
+ /* read timestamp from RTC device. */
+ if (device != RT_NULL)
+ {
+ if (rt_device_open(device, 0) == RT_EOK)
+ {
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
+ rt_device_close(device);
+ }
+ }
+#endif /* RT_USING_RTC */
+
+ /* if t is not NULL, write timestamp to *t */
+ if (t != RT_NULL)
+ {
+ *t = time_now;
+ }
+
+ return time_now;
+}
+
+RT_WEAK clock_t clock(void)
+{
+ return rt_tick_get();
+}
diff --git a/components/libc/compilers/dlib/libc.h b/components/libc/compilers/dlib/libc.h
index 7b2665c32b..5b46bee0c8 100644
--- a/components/libc/compilers/dlib/libc.h
+++ b/components/libc/compilers/dlib/libc.h
@@ -13,11 +13,17 @@
#include <stddef.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
int libc_system_init(void);
int libc_stdio_set_console(const char* device_name, int mode);
int libc_stdio_get_console(void);
-int libc_stdio_read (void *buffer, size_t size);
-int libc_stdio_write(const void *buffer, size_t size);
+int libc_stdio_read(void* buffer, size_t size);
+int libc_stdio_write(const void* buffer, size_t size);
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/components/libc/compilers/dlib/sys/errno.h b/components/libc/compilers/dlib/sys/errno.h
index 1ecb58b74c..1ad4c8acc0 100644
--- a/components/libc/compilers/dlib/sys/errno.h
+++ b/components/libc/compilers/dlib/sys/errno.h
@@ -5,11 +5,12 @@
*
* Change Logs:
* Date Author Notes
+ * 2019-07-08 Bernard The first version
*/
+
#ifndef SYS_ERRNO_H__
#define SYS_ERRNO_H__
-#include <rtthread.h>
-
+#include <errno.h>
#endif
diff --git a/components/libc/compilers/dlib/sys/signal.h b/components/libc/compilers/dlib/sys/signal.h
new file mode 100644
index 0000000000..22adb1228b
--- /dev/null
+++ b/components/libc/compilers/dlib/sys/signal.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-07-08 Bernard The first version
+ */
+
+#ifndef SYS_SIGNAL_H__
+#define SYS_SIGNAL_H__
+
+#include <libc/libc_signal.h>
+
+#endif
diff --git a/components/libc/compilers/dlib/sys/types.h b/components/libc/compilers/dlib/sys/types.h
index 4c76dfc429..001ace4dd2 100644
--- a/components/libc/compilers/dlib/sys/types.h
+++ b/components/libc/compilers/dlib/sys/types.h
@@ -15,6 +15,10 @@
typedef rt_int32_t clockid_t;
typedef rt_int32_t key_t; /* Used for interprocess communication. */
typedef rt_int32_t pid_t; /* Used for process IDs and process group IDs. */
-typedef signed long ssize_t; /* Used for a count of bytes or an error indication. */
+#ifndef ARCH_CPU_64BIT
+typedef signed int ssize_t; /* Used for a count of bytes or an error indication. */
+#else
+typedef long signed int ssize_t; /* Used for a count of bytes or an error indication. */
+#endif
#endif
diff --git a/components/libc/compilers/dlib/sys/unistd.h b/components/libc/compilers/dlib/sys/unistd.h
index 5985a42996..29f68f24f8 100644
--- a/components/libc/compilers/dlib/sys/unistd.h
+++ b/components/libc/compilers/dlib/sys/unistd.h
@@ -34,14 +34,6 @@
#define _FNDELAY _FNONBLOCK /* non blocking I/O (4.2 style) */
#define _FNOCTTY 0x8000 /* don't assign a ctty on this open */
-#define O_RDONLY 0 /* +1 == FREAD */
-#define O_WRONLY 1 /* +1 == FWRITE */
-#define O_RDWR 2 /* +1 == FREAD|FWRITE */
-#define O_APPEND _FAPPEND
-#define O_CREAT _FCREAT
-#define O_TRUNC _FTRUNC
-#define O_EXCL _FEXCL
-#define O_SYNC _FSYNC
#endif
#endif /* _SYS_UNISTD_H */
diff --git a/components/libc/compilers/dlib/time.c b/components/libc/compilers/dlib/time.c
deleted file mode 100644
index bea01e90e5..0000000000
--- a/components/libc/compilers/dlib/time.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- */
-#include <sys/time.h>
-#include <rtthread.h>
-
-#ifdef RT_USING_DEVICE
-int gettimeofday(struct timeval *tp, void *ignore)
-{
- time_t time;
- rt_device_t device;
-
- device = rt_device_find("rtc");
- if (device != RT_NULL)
- {
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
- if (tp != RT_NULL)
- {
- tp->tv_sec = time;
- tp->tv_usec = 0;
- }
-
- return time;
- }
-
- return 0;
-}
-#endif
-
-/**
- * Returns the current time.
- *
- * @param time_t * t the timestamp pointer, if not used, keep NULL.
- *
- * @return time_t return timestamp current.
- *
- */
-#pragma module_name = "?time"
-#if _DLIB_TIME_ALLOW_64
-time_t __time64(time_t *t)
-#else
-time_t __time32(time_t *t)
-#endif
-{
- time_t time_now = 0;
-
-#ifdef RT_USING_RTC
- static rt_device_t device = RT_NULL;
-
- /* optimization: find rtc device only first. */
- if (device == RT_NULL)
- {
- device = rt_device_find("rtc");
- }
-
- /* read timestamp from RTC device. */
- if (device != RT_NULL)
- {
- if (rt_device_open(device, 0) == RT_EOK)
- {
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
- rt_device_close(device);
- }
- }
-#endif /* RT_USING_RTC */
-
- /* if t is not NULL, write timestamp to *t */
- if (t != RT_NULL)
- {
- *t = time_now;
- }
-
- return time_now;
-}
-
-RT_WEAK clock_t clock(void)
-{
- return rt_tick_get();
-}
diff --git a/components/libc/compilers/minilibc/math.h b/components/libc/compilers/minilibc/math.h
index 9ddb9c859b..49b80d8219 100644
--- a/components/libc/compilers/minilibc/math.h
+++ b/components/libc/compilers/minilibc/math.h
@@ -14,4 +14,7 @@
double sin(double x);
double cos(double x);
+typedef float float_t;
+typedef double double_t;
+
#endif
diff --git a/components/libc/compilers/minilibc/signal.h b/components/libc/compilers/minilibc/signal.h
new file mode 100644
index 0000000000..f52f1e1009
--- /dev/null
+++ b/components/libc/compilers/minilibc/signal.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017-09-12 Bernard The first version
+ */
+
+#ifndef SIGNAL_H__
+#define SIGNAL_H__
+
+#include <libc/libc_signal.h>
+
+#define SIG_DFL ((_sig_func_ptr)0) /* Default action */
+#define SIG_IGN ((_sig_func_ptr)1) /* Ignore action */
+#define SIG_ERR ((_sig_func_ptr)-1) /* Error return */
+
+#endif
diff --git a/components/libc/compilers/minilibc/sys/types.h b/components/libc/compilers/minilibc/sys/types.h
index 0c00a79d1e..d3abc6bb38 100644
--- a/components/libc/compilers/minilibc/sys/types.h
+++ b/components/libc/compilers/minilibc/sys/types.h
@@ -8,10 +8,17 @@
*/
#ifndef __TYPES_H__
#define __TYPES_H__
+#include <rtconfig.h>
typedef long off_t;
-typedef unsigned long size_t;
-typedef signed long ssize_t; /* Used for a count of bytes or an error indication. */
+
+#ifndef ARCH_CPU_64BIT
+typedef unsigned int size_t;
+typedef signed int ssize_t; /* Used for a count of bytes or an error indication. */
+#else
+typedef long unsigned int size_t;
+typedef long signed int ssize_t; /* Used for a count of bytes or an error indication. */
+#endif
typedef unsigned char u_char;
typedef unsigned short u_short;
diff --git a/components/libc/compilers/minilibc/time.c b/components/libc/compilers/minilibc/time.c
index 508558bafc..25e8f0e310 100644
--- a/components/libc/compilers/minilibc/time.c
+++ b/components/libc/compilers/minilibc/time.c
@@ -11,20 +11,20 @@
/* days per month -- nonleap! */
const short __spm[13] =
- { 0,
+{ 0,
(31),
- (31+28),
- (31+28+31),
- (31+28+31+30),
- (31+28+31+30+31),
- (31+28+31+30+31+30),
- (31+28+31+30+31+30+31),
- (31+28+31+30+31+30+31+31),
- (31+28+31+30+31+30+31+31+30),
- (31+28+31+30+31+30+31+31+30+31),
- (31+28+31+30+31+30+31+31+30+31+30),
- (31+28+31+30+31+30+31+31+30+31+30+31),
- };
+ (31 + 28),
+ (31 + 28 + 31),
+ (31 + 28 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30),
+ (31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31),
+};
static long int timezone;
static const char days[] = "Sun Mon Tue Wed Thu Fri Sat ";
static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ";
@@ -34,196 +34,193 @@ static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ";
int __isleap(int year)
{
- /* every fourth year is a leap year except for century years that are
- * not divisible by 400. */
- /* return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); */
- return (!(year % 4) && ((year % 100) || !(year % 400)));
+ /* every fourth year is a leap year except for century years that are
+ * not divisible by 400. */
+ /* return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); */
+ return (!(year % 4) && ((year % 100) || !(year % 400)));
}
struct tm *gmtime_r(const time_t *timep, struct tm *r)
{
- time_t i;
- register time_t work = *timep % (SPD);
- r->tm_sec = work % 60;
- work /= 60;
- r->tm_min = work % 60;
- r->tm_hour = work / 60;
- work = *timep / (SPD);
- r->tm_wday = (4 + work) % 7;
- for (i = 1970;; ++i)
- {
- register time_t k = __isleap(i) ? 366 : 365;
- if (work >= k)
- work -= k;
- else
- break;
- }
- r->tm_year = i - 1900;
- r->tm_yday = work;
+ time_t i;
+ register time_t work = *timep % (SPD);
+ r->tm_sec = work % 60;
+ work /= 60;
+ r->tm_min = work % 60;
+ r->tm_hour = work / 60;
+ work = *timep / (SPD);
+ r->tm_wday = (4 + work) % 7;
+ for (i = 1970;; ++i)
+ {
+ register time_t k = __isleap(i) ? 366 : 365;
+ if (work >= k)
+ work -= k;
+ else
+ break;
+ }
+ r->tm_year = i - 1900;
+ r->tm_yday = work;
- r->tm_mday = 1;
- if (__isleap(i) && (work > 58))
- {
- if (work == 59)
- r->tm_mday = 2; /* 29.2. */
- work -= 1;
- }
+ r->tm_mday = 1;
+ if (__isleap(i) && (work > 58))
+ {
+ if (work == 59)
+ r->tm_mday = 2; /* 29.2. */
+ work -= 1;
+ }
- for (i = 11; i && (__spm[i] > work); --i)
- ;
- r->tm_mon = i;
- r->tm_mday += work - __spm[i];
- return r;
+ for (i = 11; i && (__spm[i] > work); --i)
+ ;
+ r->tm_mon = i;
+ r->tm_mday += work - __spm[i];
+ return r;
}
struct tm* localtime_r(const time_t* t, struct tm* r)
{
- time_t tmp;
- struct timezone tz = {0};
- gettimeofday(0, &tz);
- timezone = tz.tz_minuteswest * 60L;
- tmp = *t + timezone;
- return gmtime_r(&tmp, r);
+ time_t tmp;
+ struct timezone tz = {0};
+ gettimeofday(0, &tz);
+ timezone = tz.tz_minuteswest * 60L;
+ tmp = *t + timezone;
+ return gmtime_r(&tmp, r);
}
struct tm* localtime(const time_t* t)
{
- static struct tm tmp;
- return localtime_r(t, &tmp);
+ static struct tm tmp;
+ return localtime_r(t, &tmp);
}
time_t mktime(struct tm * const t)
{
- register time_t day;
- register time_t i;
- register time_t years = t->tm_year - 70;
+ register time_t day;
+ register time_t i;
+ register time_t years = t->tm_year - 70;
- if (t->tm_sec > 60)
- {
- t->tm_min += t->tm_sec / 60;
- t->tm_sec %= 60;
- }
- if (t->tm_min > 60)
- {
- t->tm_hour += t->tm_min / 60;
- t->tm_min %= 60;
- }
- if (t->tm_hour > 24)
- {
- t->tm_mday += t->tm_hour / 24;
- t->tm_hour %= 24;
- }
- if (t->tm_mon > 12)
- {
- t->tm_year += t->tm_mon / 12;
- t->tm_mon %= 12;
- }
- while (t->tm_mday > __spm[1 + t->tm_mon])
- {
- if (t->tm_mon == 1 && __isleap(t->tm_year + 1900))
- {
- --t->tm_mday;
- }
- t->tm_mday -= __spm[t->tm_mon];
- ++t->tm_mon;
- if (t->tm_mon > 11)
- {
- t->tm_mon = 0;
- ++t->tm_year;
- }
- }
+ if (t->tm_sec > 60)
+ {
+ t->tm_min += t->tm_sec / 60;
+ t->tm_sec %= 60;
+ }
+ if (t->tm_min > 60)
+ {
+ t->tm_hour += t->tm_min / 60;
+ t->tm_min %= 60;
+ }
+ if (t->tm_hour > 24)
+ {
+ t->tm_mday += t->tm_hour / 24;
+ t->tm_hour %= 24;
+ }
+ if (t->tm_mon > 12)
+ {
+ t->tm_year += t->tm_mon / 12;
+ t->tm_mon %= 12;
+ }
+ while (t->tm_mday > __spm[1 + t->tm_mon])
+ {
+ if (t->tm_mon == 1 && __isleap(t->tm_year + 1900))
+ {
+ --t->tm_mday;
+ }
+ t->tm_mday -= __spm[t->tm_mon];
+ ++t->tm_mon;
+ if (t->tm_mon > 11)
+ {
+ t->tm_mon = 0;
+ ++t->tm_year;
+ }
+ }
- if (t->tm_year < 70)
- return (time_t) -1;
+ if (t->tm_year < 70)
+ return (time_t) - 1;
- /* Days since 1970 is 365 * number of years + number of leap years since 1970 */
- day = years * 365 + (years + 1) / 4;
+ /* Days since 1970 is 365 * number of years + number of leap years since 1970 */
+ day = years * 365 + (years + 1) / 4;
- /* After 2100 we have to substract 3 leap years for every 400 years
- This is not intuitive. Most mktime implementations do not support
- dates after 2059, anyway, so we might leave this out for it's
- bloat. */
- if (years >= 131)
- {
- years -= 131;
- years /= 100;
- day -= (years >> 2) * 3 + 1;
- if ((years &= 3) == 3)
- years--;
- day -= years;
- }
+ /* After 2100 we have to substract 3 leap years for every 400 years
+ This is not intuitive. Most mktime implementations do not support
+ dates after 2059, anyway, so we might leave this out for it's
+ bloat. */
+ if (years >= 131)
+ {
+ years -= 131;
+ years /= 100;
+ day -= (years >> 2) * 3 + 1;
+ if ((years &= 3) == 3)
+ years--;
+ day -= years;
+ }
- day += t->tm_yday = __spm[t->tm_mon] + t->tm_mday - 1 +
- (__isleap(t->tm_year + 1900) & (t->tm_mon > 1));
+ day += t->tm_yday = __spm[t->tm_mon] + t->tm_mday - 1 +
+ (__isleap(t->tm_year + 1900) & (t->tm_mon > 1));
- /* day is now the number of days since 'Jan 1 1970' */
- i = 7;
- t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */
+ /* day is now the number of days since 'Jan 1 1970' */
+ i = 7;
+ t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */
- i = 24;
- day *= i;
- i = 60;
- return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
+ i = 24;
+ day *= i;
+ i = 60;
+ return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
}
static void num2str(char *c, int i)
{
- c[0] = i / 10 + '0';
- c[1] = i % 10 + '0';
+ c[0] = i / 10 + '0';
+ c[1] = i % 10 + '0';
}
char *asctime_r(const struct tm *t, char *buf)
{
- /* "Wed Jun 30 21:49:08 1993\n" */
- *(int*) buf = *(int*) (days + (t->tm_wday << 2));
- *(int*) (buf + 4) = *(int*) (months + (t->tm_mon << 2));
- num2str(buf + 8, t->tm_mday);
- if (buf[8] == '0')
- buf[8] = ' ';
- buf[10] = ' ';
- num2str(buf + 11, t->tm_hour);
- buf[13] = ':';
- num2str(buf + 14, t->tm_min);
- buf[16] = ':';
- num2str(buf + 17, t->tm_sec);
- buf[19] = ' ';
- num2str(buf + 20, (t->tm_year + 1900) / 100);
- num2str(buf + 22, (t->tm_year + 1900) % 100);
- buf[24] = '\n';
- return buf;
+ /* "Wed Jun 30 21:49:08 1993\n" */
+ *(int*) buf = *(int*) (days + (t->tm_wday << 2));
+ *(int*) (buf + 4) = *(int*) (months + (t->tm_mon << 2));
+ num2str(buf + 8, t->tm_mday);
+ if (buf[8] == '0')
+ buf[8] = ' ';
+ buf[10] = ' ';
+ num2str(buf + 11, t->tm_hour);
+ buf[13] = ':';
+ num2str(buf + 14, t->tm_min);
+ buf[16] = ':';
+ num2str(buf + 17, t->tm_sec);
+ buf[19] = ' ';
+ num2str(buf + 20, (t->tm_year + 1900) / 100);
+ num2str(buf + 22, (t->tm_year + 1900) % 100);
+ buf[24] = '\n';
+ return buf;
}
char *asctime(const struct tm *timeptr)
{
- static char buf[25];
- return asctime_r(timeptr, buf);
+ static char buf[25];
+ return asctime_r(timeptr, buf);
}
char *ctime(const time_t *timep)
{
- return asctime(localtime(timep));
+ return asctime(localtime(timep));
}
#ifdef RT_USING_DEVICE
int gettimeofday(struct timeval *tp, void *ignore)
{
- time_t time;
- rt_device_t device;
+ time_t time;
+ rt_device_t device;
- device = rt_device_find("rtc");
- if (device != RT_NULL)
- {
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
- if (tp != RT_NULL)
- {
- tp->tv_sec = time;
- tp->tv_usec = 0;
- }
+ device = rt_device_find("rtc");
+ RT_ASSERT(device != RT_NULL);
- return time;
- }
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
+ if (tp != RT_NULL)
+ {
+ tp->tv_sec = time;
+ tp->tv_usec = 0;
+ }
- return 0;
+ return time;
}
#endif
diff --git a/components/libc/compilers/newlib/libc.c b/components/libc/compilers/newlib/libc.c
index 06c490c8cf..2234c36f98 100644
--- a/components/libc/compilers/newlib/libc.c
+++ b/components/libc/compilers/newlib/libc.c
@@ -35,11 +35,11 @@ int libc_system_init(void)
libc_stdio_set_console(dev_console->parent.name, O_WRONLY);
#endif
}
-#endif
/* set PATH and HOME */
putenv("PATH=/bin");
putenv("HOME=/home");
+#endif
#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT
pthread_system_init();
diff --git a/components/libc/compilers/newlib/libc.h b/components/libc/compilers/newlib/libc.h
index ab9334fe26..fdf2ab4f60 100644
--- a/components/libc/compilers/newlib/libc.h
+++ b/components/libc/compilers/newlib/libc.h
@@ -27,13 +27,19 @@
#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
+#ifdef __cplusplus
+extern "C" {
+#endif
int libc_system_init(void);
int libc_stdio_set_console(const char* device_name, int mode);
int libc_stdio_get_console(void);
/* some time related function */
-int libc_set_time(const struct timespec *time);
-int libc_get_time(struct timespec *time);
-int libc_time_to_tick(const struct timespec *time);
+int libc_set_time(const struct timespec* time);
+int libc_get_time(struct timespec* time);
+int libc_time_to_tick(const struct timespec* time);
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c
index e4cda478cb..59c1881ad1 100644
--- a/components/libc/compilers/newlib/syscalls.c
+++ b/components/libc/compilers/newlib/syscalls.c
@@ -9,6 +9,8 @@
#include <reent.h>
#include <sys/errno.h>
#include <sys/time.h>
+#include <stdio.h>
+
#include <rtthread.h>
#ifdef RT_USING_DFS
@@ -25,6 +27,14 @@
/* Reentrant versions of system calls. */
+#ifndef _REENT_ONLY
+int *
+__errno ()
+{
+ return _rt_errno();
+}
+#endif
+
int
_close_r(struct _reent *ptr, int fd)
{
@@ -218,7 +228,7 @@ _ssize_t
_write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
#ifndef RT_USING_DFS
- if (fd == 0)
+ if (fileno(stdout) == fd)
{
rt_device_t console;
@@ -432,3 +442,18 @@ void abort(void)
while (1);
}
+
+uid_t getuid(void)
+{
+ return 0;
+}
+
+mode_t umask(mode_t mask)
+{
+ return 022;
+}
+
+int flock(int fd, int operation)
+{
+ return 0;
+}
diff --git a/components/libc/compilers/newlib/time.c b/components/libc/compilers/newlib/time.c
index 29c5c6cdd2..f099d51330 100644
--- a/components/libc/compilers/newlib/time.c
+++ b/components/libc/compilers/newlib/time.c
@@ -16,19 +16,16 @@ int gettimeofday(struct timeval *tp, void *ignore)
rt_device_t device;
device = rt_device_find("rtc");
- if (device != RT_NULL)
- {
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
- if (tp != RT_NULL)
- {
- tp->tv_sec = time;
- tp->tv_usec = 0;
- }
+ RT_ASSERT(device != RT_NULL);
- return time;
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
+ if (tp != RT_NULL)
+ {
+ tp->tv_sec = time;
+ tp->tv_usec = 0;
}
- return 0;
+ return time;
}
#endif