summaryrefslogtreecommitdiff
path: root/components/libc/compilers/common
diff options
context:
space:
mode:
authorMeco Man <[email protected]>2021-04-21 00:56:36 +0800
committerMeco Man <[email protected]>2021-04-21 00:56:36 +0800
commit40c09fc1e088e1f7a9eb91c85bd30119d4a38822 (patch)
treea88febbb8f10e73e2f30e50dae777693e452bd46 /components/libc/compilers/common
parent926cd865892cfbb9b474d36cfd046688d92ecc37 (diff)
重新分类为common文件夹下属all文件夹和excgcc文件夹
Diffstat (limited to 'components/libc/compilers/common')
-rw-r--r--components/libc/compilers/common/SConscript15
-rw-r--r--components/libc/compilers/common/all/SConscript27
-rw-r--r--components/libc/compilers/common/all/dirent.h65
-rw-r--r--components/libc/compilers/common/all/readme.md10
-rw-r--r--components/libc/compilers/common/all/stdlib.c28
-rw-r--r--components/libc/compilers/common/all/sys/ioctl.h18
-rw-r--r--components/libc/compilers/common/all/sys/mman.h60
-rw-r--r--components/libc/compilers/common/all/sys/statfs.h21
-rw-r--r--components/libc/compilers/common/all/sys/termios.h8
-rw-r--r--components/libc/compilers/common/all/sys/time.h101
-rw-r--r--components/libc/compilers/common/all/termios.h19
-rw-r--r--components/libc/compilers/common/all/time.c643
-rw-r--r--components/libc/compilers/common/all/unistd.c88
-rw-r--r--components/libc/compilers/common/excgcc/SConscript13
-rw-r--r--components/libc/compilers/common/excgcc/fcntl.h18
-rw-r--r--components/libc/compilers/common/excgcc/readme.md3
-rw-r--r--components/libc/compilers/common/excgcc/sys/stat.h8
-rw-r--r--components/libc/compilers/common/excgcc/sys/types.h36
-rw-r--r--components/libc/compilers/common/excgcc/sys/unistd.h83
-rw-r--r--components/libc/compilers/common/excgcc/unistd.h10
20 files changed, 1274 insertions, 0 deletions
diff --git a/components/libc/compilers/common/SConscript b/components/libc/compilers/common/SConscript
new file mode 100644
index 0000000000..4c815c49b8
--- /dev/null
+++ b/components/libc/compilers/common/SConscript
@@ -0,0 +1,15 @@
+# RT-Thread building script for bridge
+
+import os
+from building import *
+
+cwd = GetCurrentDir()
+objs = []
+list = os.listdir(cwd)
+
+for d in list:
+ path = os.path.join(cwd, d)
+ if os.path.isfile(os.path.join(path, 'SConscript')):
+ objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
+Return('objs')
diff --git a/components/libc/compilers/common/all/SConscript b/components/libc/compilers/common/all/SConscript
new file mode 100644
index 0000000000..319e1a3555
--- /dev/null
+++ b/components/libc/compilers/common/all/SConscript
@@ -0,0 +1,27 @@
+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 GetDepend('RT_USING_POSIX') == False:
+ SrcRemove(src, ['unistd.c'])
+
+if rtconfig.CROSS_TOOL == 'keil':
+ CPPDEFINES = ['__CLK_TCK=RT_TICK_PER_SECOND']
+else:
+ CPPDEFINES = []
+
+if GetDepend('RT_USING_LIBC') or GetDepend('RT_LIBC_USING_TIME'):
+ group = DefineGroup('libc', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
+
+Return('group')
diff --git a/components/libc/compilers/common/all/dirent.h b/components/libc/compilers/common/all/dirent.h
new file mode 100644
index 0000000000..bfba586093
--- /dev/null
+++ b/components/libc/compilers/common/all/dirent.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+#ifndef __RTT_DIRENT_H__
+#define __RTT_DIRENT_H__
+
+#include <rtthread.h>
+
+/*
+* dirent.h - format of directory entries
+ * Ref: http://www.opengroup.org/onlinepubs/009695399/basedefs/dirent.h.html
+ */
+
+/* File types */
+#define FT_REGULAR 0 /* regular file */
+#define FT_SOCKET 1 /* socket file */
+#define FT_DIRECTORY 2 /* directory */
+#define FT_USER 3 /* user defined */
+
+#define DT_UNKNOWN 0x00
+#define DT_REG 0x01
+#define DT_DIR 0x02
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef HAVE_DIR_STRUCTURE
+typedef struct
+{
+ int fd; /* directory file */
+ char buf[512];
+ int num;
+ int cur;
+} DIR;
+#endif
+
+#ifndef HAVE_DIRENT_STRUCTURE
+struct dirent
+{
+ rt_uint8_t d_type; /* The type of the file */
+ rt_uint8_t d_namlen; /* The length of the not including the terminating null file name */
+ rt_uint16_t d_reclen; /* length of this record */
+ char d_name[256]; /* The null-terminated file name */
+};
+#endif
+
+int closedir(DIR *);
+DIR *opendir(const char *);
+struct dirent *readdir(DIR *);
+int readdir_r(DIR *, struct dirent *, struct dirent **);
+void rewinddir(DIR *);
+void seekdir(DIR *, long int);
+long telldir(DIR *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/libc/compilers/common/all/readme.md b/components/libc/compilers/common/all/readme.md
new file mode 100644
index 0000000000..81bb005d0a
--- /dev/null
+++ b/components/libc/compilers/common/all/readme.md
@@ -0,0 +1,10 @@
+## Attentions
+
+1. This folder is "common" for armlibc newlibc and dlib.
+
+2. If you want to add new `.c` files, please do not forget to fix SConscript file too. eg:
+
+```python
+if GetDepend('RT_USING_POSIX') == False:
+ SrcRemove(src, ['unistd.c'])
+``` \ No newline at end of file
diff --git a/components/libc/compilers/common/all/stdlib.c b/components/libc/compilers/common/all/stdlib.c
new file mode 100644
index 0000000000..9d8952e99e
--- /dev/null
+++ b/components/libc/compilers/common/all/stdlib.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-02-15 Meco Man first version
+ */
+
+#include <rtthread.h>
+
+void __rt_libc_exit(int status)
+{
+ rt_thread_t self = rt_thread_self();
+
+ if (self != RT_NULL)
+ {
+ rt_kprintf("thread:%s exit:%d!\n", self->name, status);
+ rt_thread_control(self, RT_THREAD_CTRL_CLOSE, RT_NULL);
+ }
+}
+
+int __rt_libc_system(const char *string)
+{
+ /* TODO */
+ return 0;
+}
diff --git a/components/libc/compilers/common/all/sys/ioctl.h b/components/libc/compilers/common/all/sys/ioctl.h
new file mode 100644
index 0000000000..648d90230d
--- /dev/null
+++ b/components/libc/compilers/common/all/sys/ioctl.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-09-01 Meco Man First Version
+ */
+#ifndef _SYS_IOCTL_H
+#define _SYS_IOCTL_H
+
+#include <rtconfig.h>
+#ifdef RT_USING_POSIX
+#include <dfs_posix.h>
+#endif
+
+#endif
diff --git a/components/libc/compilers/common/all/sys/mman.h b/components/libc/compilers/common/all/sys/mman.h
new file mode 100644
index 0000000000..a9235d61f0
--- /dev/null
+++ b/components/libc/compilers/common/all/sys/mman.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017/11/30 Bernard The first version.
+ */
+
+#ifndef _SYS_MMAN_H
+#define _SYS_MMAN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+
+#define MAP_FAILED ((void *) -1)
+
+#define MAP_SHARED 0x01
+#define MAP_PRIVATE 0x02
+#define MAP_TYPE 0x0f
+#define MAP_FIXED 0x10
+#define MAP_ANON 0x20
+#define MAP_ANONYMOUS MAP_ANON
+#define MAP_NORESERVE 0x4000
+#define MAP_GROWSDOWN 0x0100
+#define MAP_DENYWRITE 0x0800
+#define MAP_EXECUTABLE 0x1000
+#define MAP_LOCKED 0x2000
+#define MAP_POPULATE 0x8000
+#define MAP_NONBLOCK 0x10000
+#define MAP_STACK 0x20000
+#define MAP_HUGETLB 0x40000
+#define MAP_FILE 0
+
+#define PROT_NONE 0
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define PROT_EXEC 4
+#define PROT_GROWSDOWN 0x01000000
+#define PROT_GROWSUP 0x02000000
+
+#define MS_ASYNC 1
+#define MS_INVALIDATE 2
+#define MS_SYNC 4
+
+#define MCL_CURRENT 1
+#define MCL_FUTURE 2
+#define MCL_ONFAULT 4
+
+void *mmap (void *start, size_t len, int prot, int flags, int fd, off_t off);
+int munmap (void *start, size_t len);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/components/libc/compilers/common/all/sys/statfs.h b/components/libc/compilers/common/all/sys/statfs.h
new file mode 100644
index 0000000000..0996af9a18
--- /dev/null
+++ b/components/libc/compilers/common/all/sys/statfs.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+#ifndef __RTT_STATFS_H__
+#define __RTT_STATFS_H__
+
+#include <rtthread.h>
+
+struct statfs
+{
+ rt_size_t f_bsize; /* block size */
+ rt_size_t f_blocks; /* total data blocks in file system */
+ rt_size_t f_bfree; /* free blocks in file system */
+};
+
+#endif
diff --git a/components/libc/compilers/common/all/sys/termios.h b/components/libc/compilers/common/all/sys/termios.h
new file mode 100644
index 0000000000..c4b42083c4
--- /dev/null
+++ b/components/libc/compilers/common/all/sys/termios.h
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
diff --git a/components/libc/compilers/common/all/sys/time.h b/components/libc/compilers/common/all/sys/time.h
new file mode 100644
index 0000000000..ef1c810608
--- /dev/null
+++ b/components/libc/compilers/common/all/sys/time.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-09-07 Meco Man combine gcc armcc iccarm
+ * 2021-02-12 Meco Man move all definitions located in <clock_time.h> to this file
+ */
+#ifndef _SYS_TIME_H_
+#define _SYS_TIME_H_
+
+#include <rtconfig.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Skip define timespec for IAR version over 8.10.1 where __VER__ is 8010001.
+ */
+#if defined ( __ICCARM__ ) && (__VER__ >= 8010001)
+#define _TIMESPEC_DEFINED
+#endif
+
+
+#ifndef _TIMEVAL_DEFINED
+#define _TIMEVAL_DEFINED
+/*
+ * Structure returned by gettimeofday(2) system call,
+ * and used in other calls.
+ */
+#if !(defined(_WIN32))
+struct timeval {
+ long tv_sec; /* seconds */
+ long tv_usec; /* and microseconds */
+};
+#endif
+#endif /* _TIMEVAL_DEFINED */
+
+#if !(defined(__GNUC__) && !defined(__ARMCC_VERSION)/*GCC*/) && !defined (__ICCARM__) && !defined (_WIN32)
+struct timespec {
+ time_t tv_sec; /* seconds */
+ long tv_nsec; /* and nanoseconds */
+};
+#endif
+
+struct timezone {
+ int tz_minuteswest; /* minutes west of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+};
+
+int stime(const time_t *t);
+time_t timegm(struct tm * const t);
+int gettimeofday(struct timeval *tv, struct timezone *tz);
+int settimeofday(const struct timeval *tv, const struct timezone *tz);
+#if defined(__ARMCC_VERSION) || defined (__ICCARM__)
+struct tm *gmtime_r(const time_t *timep, struct tm *r);
+#endif
+
+#ifdef RT_USING_POSIX
+#include <sys/types.h>
+/* posix clock and timer */
+#define MILLISECOND_PER_SECOND 1000UL
+#define MICROSECOND_PER_SECOND 1000000UL
+#define NANOSECOND_PER_SECOND 1000000000UL
+
+#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)
+
+#ifndef CLOCK_REALTIME
+#define CLOCK_REALTIME 1
+#endif
+
+#define CLOCK_CPUTIME_ID 2
+
+#ifndef CLOCK_PROCESS_CPUTIME_ID
+#define CLOCK_PROCESS_CPUTIME_ID CLOCK_CPUTIME_ID
+#endif
+#ifndef CLOCK_THREAD_CPUTIME_ID
+#define CLOCK_THREAD_CPUTIME_ID CLOCK_CPUTIME_ID
+#endif
+
+#ifndef CLOCK_MONOTONIC
+#define CLOCK_MONOTONIC 4
+#endif
+
+int clock_getres (clockid_t clockid, struct timespec *res);
+int clock_gettime (clockid_t clockid, struct timespec *tp);
+int clock_settime (clockid_t clockid, const struct timespec *tp);
+int clock_time_to_tick(const struct timespec *time);
+#endif /* RT_USING_POSIX */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_TIME_H_ */
diff --git a/components/libc/compilers/common/all/termios.h b/components/libc/compilers/common/all/termios.h
new file mode 100644
index 0000000000..2960d52c58
--- /dev/null
+++ b/components/libc/compilers/common/all/termios.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+#ifndef _TERMIOS_H__
+#define _TERMIOS_H__
+
+#include <rtconfig.h>
+
+#ifdef RT_USING_POSIX_TERMIOS
+#include <sys/types.h>
+#include <posix_termios.h>
+#endif
+
+#endif
diff --git a/components/libc/compilers/common/all/time.c b/components/libc/compilers/common/all/time.c
new file mode 100644
index 0000000000..33d8907165
--- /dev/null
+++ b/components/libc/compilers/common/all/time.c
@@ -0,0 +1,643 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-08-21 zhangjun copy from minilibc
+ * 2020-09-07 Meco Man combine gcc armcc iccarm
+ * 2021-02-05 Meco Man add timegm()
+ * 2021-02-07 Meco Man fixed gettimeofday()
+ * 2021-02-08 Meco Man add settimeofday() stime()
+ * 2021-02-10 Meco Man add ctime_r() and re-implement ctime()
+ * 2021-02-11 Meco Man fix bug #3183 - align days[] and months[] to 4 bytes
+ * 2021-02-12 Meco Man add errno
+ * 2012-12-08 Bernard <clock_time.c> fix the issue of _timevalue.tv_usec initialization,
+ * which found by Rob <[email protected]>
+ * 2021-02-12 Meco Man move all of the functions located in <clock_time.c> to this file
+ * 2021-03-15 Meco Man fixed bug: https://club.rt-thread.org/ask/question/423650.html
+ */
+
+#include <sys/time.h>
+#include <rtthread.h>
+
+#ifdef RT_USING_DEVICE
+#include <rtdevice.h>
+#endif
+
+#define DBG_TAG "TIME"
+#define DBG_LVL DBG_INFO
+#include <rtdbg.h>
+
+/* seconds per day */
+#define SPD 24*60*60
+
+/* days per month -- nonleap! */
+static 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),
+};
+
+ALIGN(4) static const char days[] = "Sun Mon Tue Wed Thu Fri Sat ";
+ALIGN(4) static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ";
+
+static 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)));
+}
+
+static void num2str(char *c, int i)
+{
+ c[0] = i / 10 + '0';
+ c[1] = i % 10 + '0';
+}
+
+/**
+ * Get time from RTC device (without timezone)
+ * @param tv: struct timeval
+ * @return -1 failure; 1 success
+ */
+static int get_timeval(struct timeval *tv)
+{
+#ifdef RT_USING_RTC
+ static rt_device_t device = RT_NULL;
+ rt_err_t rst = -RT_ERROR;
+
+ if (tv == RT_NULL)
+ return -1;
+
+ /* default is 0 */
+ tv->tv_sec = 0;
+ tv->tv_usec = 0;
+
+ /* 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)
+ {
+ rst = rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &tv->tv_sec);
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME_US, &tv->tv_usec);
+ rt_device_close(device);
+ }
+ }
+ else
+ {
+ /* LOG_W will cause a recursive printing if ulog timestamp function is turned on */
+ rt_kprintf("Cannot find a RTC device to provide time!\r\n");
+ return -1;
+ }
+
+ return (rst < 0) ? -1 : 1;
+
+#else
+ /* LOG_W will cause a recursive printing if ulog timestamp function is turned on */
+ rt_kprintf("Cannot find a RTC device to provide time!\r\n");
+ return -1;
+#endif /* RT_USING_RTC */
+}
+
+/**
+ * Set time to RTC device (without timezone)
+ * @param tv: struct timeval
+ * @return -1 failure; 1 success
+ */
+static int set_timeval(struct timeval *tv)
+{
+#ifdef RT_USING_RTC
+ static rt_device_t device = RT_NULL;
+ rt_err_t rst = -RT_ERROR;
+
+ if (tv == RT_NULL)
+ return -1;
+
+ /* 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)
+ {
+ rst = rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &tv->tv_sec);
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME_US, &tv->tv_usec);
+ rt_device_close(device);
+ }
+ }
+ else
+ {
+ LOG_W("Cannot find a RTC device to provide time!");
+ return -1;
+ }
+
+ return (rst < 0) ? -1 : 1;
+
+#else
+ LOG_W("Cannot find a RTC device to provide time!");
+ return -1;
+#endif /* RT_USING_RTC */
+}
+
+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];
+
+ r->tm_isdst = 0;
+ return r;
+}
+RTM_EXPORT(gmtime_r);
+
+struct tm* gmtime(const time_t* t)
+{
+ static struct tm tmp;
+ return gmtime_r(t, &tmp);
+}
+RTM_EXPORT(gmtime);
+
+/*TODO: timezone */
+struct tm* localtime_r(const time_t* t, struct tm* r)
+{
+ time_t local_tz;
+ int utc_plus;
+
+ utc_plus = 8; /* GMT: UTC+8 */
+ local_tz = *t + utc_plus * 3600;
+ return gmtime_r(&local_tz, r);
+}
+RTM_EXPORT(localtime_r);
+
+struct tm* localtime(const time_t* t)
+{
+ static struct tm tmp;
+ return localtime_r(t, &tmp);
+}
+RTM_EXPORT(localtime);
+
+/* TODO: timezone */
+time_t mktime(struct tm * const t)
+{
+ time_t timestamp;
+ int utc_plus;
+
+ utc_plus = 8; /* GMT: UTC+8 */
+ timestamp = timegm(t);
+ timestamp = timestamp - 3600 * utc_plus;
+ return timestamp;
+}
+RTM_EXPORT(mktime);
+
+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';
+ buf[25] = '\0';
+ return buf;
+}
+RTM_EXPORT(asctime_r);
+
+char* asctime(const struct tm *timeptr)
+{
+ static char buf[26];
+ return asctime_r(timeptr, buf);
+}
+RTM_EXPORT(asctime);
+
+char *ctime_r (const time_t * tim_p, char * result)
+{
+ struct tm tm;
+ return asctime_r (localtime_r (tim_p, &tm), result);
+}
+RTM_EXPORT(ctime_r);
+
+char* ctime(const time_t *tim_p)
+{
+ return asctime (localtime (tim_p));
+}
+RTM_EXPORT(ctime);
+
+/**
+ * Returns the current time.
+ *
+ * @param time_t * t the timestamp pointer, if not used, keep NULL.
+ *
+ * @return The value ((time_t)-1) is returned if the calendar time is not available.
+ * If timer is not a NULL pointer, the return value is also stored in timer.
+ *
+ */
+RT_WEAK time_t time(time_t *t)
+{
+ struct timeval now;
+
+ if(get_timeval(&now) > 0)
+ {
+ if (t)
+ {
+ *t = now.tv_sec;
+ }
+ return now.tv_sec;
+ }
+ else
+ {
+ errno = EFAULT;
+ return ((time_t)-1);
+ }
+}
+RTM_EXPORT(time);
+
+RT_WEAK clock_t clock(void)
+{
+ return rt_tick_get();
+}
+RTM_EXPORT(clock);
+
+int stime(const time_t *t)
+{
+ struct timeval tv;
+
+ if (!t)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ tv.tv_sec = *t;
+ if (set_timeval(&tv) > 0)
+ {
+ return 0;
+ }
+ else
+ {
+ errno = EFAULT;
+ return -1;
+ }
+}
+RTM_EXPORT(stime);
+
+time_t timegm(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;
+}
+RTM_EXPORT(timegm);
+
+/* TODO: timezone */
+int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ if (tv != RT_NULL && get_timeval(tv) > 0)
+ {
+ return 0;
+ }
+ else
+ {
+ errno = EFAULT;
+ return -1;
+ }
+}
+RTM_EXPORT(gettimeofday);
+
+/* TODO: timezone */
+int settimeofday(const struct timeval *tv, const struct timezone *tz)
+{
+ if (tv != RT_NULL)
+ {
+ if(tv->tv_sec >= 0 && tv->tv_usec >= 0)
+ {
+ if(set_timeval((struct timeval *)tv) > 0)
+ {
+ return 0;
+ }
+ else
+ {
+ errno = EFAULT;
+ return -1;
+ }
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ else
+ {
+ errno = EFAULT;
+ return -1;
+ }
+}
+RTM_EXPORT(settimeofday);
+
+/* inherent in the toolchain */
+RTM_EXPORT(difftime);
+RTM_EXPORT(strftime);
+
+#ifdef RT_USING_POSIX
+static struct timeval _timevalue;
+static int clock_time_system_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 = (tick%RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK;
+ _timevalue.tv_sec = time - tick/RT_TICK_PER_SECOND - 1;
+
+ return 0;
+}
+INIT_COMPONENT_EXPORT(clock_time_system_init);
+
+int clock_getres(clockid_t clockid, struct timespec *res)
+{
+ int ret = 0;
+
+ if (res == RT_NULL)
+ {
+ rt_set_errno(EINVAL);
+ return -1;
+ }
+
+ switch (clockid)
+ {
+ case CLOCK_REALTIME:
+ res->tv_sec = 0;
+ res->tv_nsec = NANOSECOND_PER_SECOND/RT_TICK_PER_SECOND;
+ break;
+
+#ifdef RT_USING_CPUTIME
+ case CLOCK_CPUTIME_ID:
+ res->tv_sec = 0;
+ res->tv_nsec = clock_cpu_getres();
+ break;
+#endif
+
+ default:
+ ret = -1;
+ rt_set_errno(EINVAL);
+ break;
+ }
+
+ return ret;
+}
+RTM_EXPORT(clock_getres);
+
+int clock_gettime(clockid_t clockid, struct timespec *tp)
+{
+ int ret = 0;
+
+ if (tp == RT_NULL)
+ {
+ rt_set_errno(EINVAL);
+ return -1;
+ }
+
+ switch (clockid)
+ {
+ case CLOCK_REALTIME:
+ {
+ /* get tick */
+ int tick = rt_tick_get();
+
+ tp->tv_sec = _timevalue.tv_sec + tick / RT_TICK_PER_SECOND;
+ tp->tv_nsec = (_timevalue.tv_usec + (tick % RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK) * 1000;
+ }
+ break;
+
+#ifdef RT_USING_CPUTIME
+ case CLOCK_CPUTIME_ID:
+ {
+ float unit = 0;
+ long long cpu_tick;
+
+ unit = clock_cpu_getres();
+ cpu_tick = clock_cpu_gettime();
+
+ tp->tv_sec = ((int)(cpu_tick * unit)) / NANOSECOND_PER_SECOND;
+ tp->tv_nsec = ((int)(cpu_tick * unit)) % NANOSECOND_PER_SECOND;
+ }
+ break;
+#endif
+ default:
+ rt_set_errno(EINVAL);
+ ret = -1;
+ }
+
+ return ret;
+}
+RTM_EXPORT(clock_gettime);
+
+int clock_settime(clockid_t clockid, const struct timespec *tp)
+{
+ int second;
+ rt_tick_t tick;
+ rt_device_t device;
+
+ if ((clockid != CLOCK_REALTIME) || (tp == RT_NULL))
+ {
+ rt_set_errno(EINVAL);
+
+ return -1;
+ }
+
+ /* get second */
+ second = tp->tv_sec;
+ /* get tick */
+ tick = rt_tick_get();
+
+ /* update timevalue */
+ _timevalue.tv_usec = MICROSECOND_PER_SECOND - (tick % RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK;
+ _timevalue.tv_sec = second - tick/RT_TICK_PER_SECOND - 1;
+
+ /* update for RTC device */
+ device = rt_device_find("rtc");
+ if (device != RT_NULL)
+ {
+ /* set realtime seconds */
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &second);
+ }
+ else
+ return -1;
+
+ return 0;
+}
+RTM_EXPORT(clock_settime);
+
+int clock_time_to_tick(const struct timespec *time)
+{
+ int tick;
+ int nsecond, second;
+ struct timespec tp;
+
+ RT_ASSERT(time != RT_NULL);
+
+ tick = RT_WAITING_FOREVER;
+ if (time != NULL)
+ {
+ /* get current tp */
+ clock_gettime(CLOCK_REALTIME, &tp);
+
+ if ((time->tv_nsec - tp.tv_nsec) < 0)
+ {
+ nsecond = NANOSECOND_PER_SECOND - (tp.tv_nsec - time->tv_nsec);
+ second = time->tv_sec - tp.tv_sec - 1;
+ }
+ else
+ {
+ nsecond = time->tv_nsec - tp.tv_nsec;
+ second = time->tv_sec - tp.tv_sec;
+ }
+
+ tick = second * RT_TICK_PER_SECOND + nsecond * RT_TICK_PER_SECOND / NANOSECOND_PER_SECOND;
+ if (tick < 0) tick = 0;
+ }
+
+ return tick;
+}
+RTM_EXPORT(clock_time_to_tick);
+
+#endif /* RT_USING_POSIX */
diff --git a/components/libc/compilers/common/all/unistd.c b/components/libc/compilers/common/all/unistd.c
new file mode 100644
index 0000000000..20130cbb8a
--- /dev/null
+++ b/components/libc/compilers/common/all/unistd.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-09-01 Meco Man first Version
+ * 2021-02-12 Meco Man move all functions located in <pthread_sleep.c> to this file
+ */
+
+#include <unistd.h>
+#include <rtthread.h>
+#include <rthw.h>
+
+#ifdef RT_USING_POSIX_TERMIOS
+#include "termios.h"
+
+int isatty(int fd)
+{
+ struct termios ts;
+ return(tcgetattr(fd,&ts) != -1);/*true if no error (is a tty)*/
+}
+RTM_EXPORT(isatty);
+#endif
+
+char *ttyname(int fd)
+{
+ return "/dev/tty0"; /*TODO: need to add more specific*/
+}
+RTM_EXPORT(ttyname);
+
+unsigned int sleep(unsigned int seconds)
+{
+ rt_tick_t delta_tick;
+
+ delta_tick = rt_tick_get();
+ rt_thread_delay(seconds * RT_TICK_PER_SECOND);
+ delta_tick = rt_tick_get() - delta_tick;
+
+ return seconds - delta_tick/RT_TICK_PER_SECOND;
+}
+RTM_EXPORT(sleep);
+
+int usleep(useconds_t usec)
+{
+ rt_thread_mdelay(usec / 1000u);
+ rt_hw_us_delay(usec % 1000u);
+ return 0;
+}
+RTM_EXPORT(usleep);
+
+pid_t getpid(void)
+{
+ /*TODO*/
+ return 0;
+}
+RTM_EXPORT(getpid);
+
+pid_t getppid(void)
+{
+ return 0;
+}
+RTM_EXPORT(getppid);
+
+uid_t getuid(void)
+{
+ return 0; /*ROOT*/
+}
+RTM_EXPORT(getuid);
+
+uid_t geteuid(void)
+{
+ return 0; /*ROOT*/
+}
+RTM_EXPORT(geteuid);
+
+gid_t getgid(void)
+{
+ return 0; /*ROOT*/
+}
+RTM_EXPORT(getgid);
+
+gid_t getegid(void)
+{
+ return 0; /*ROOT*/
+}
+RTM_EXPORT(getegid);
diff --git a/components/libc/compilers/common/excgcc/SConscript b/components/libc/compilers/common/excgcc/SConscript
new file mode 100644
index 0000000000..346e69b478
--- /dev/null
+++ b/components/libc/compilers/common/excgcc/SConscript
@@ -0,0 +1,13 @@
+from building import *
+
+Import('rtconfig')
+
+src = []
+cwd = GetCurrentDir()
+CPPPATH = [cwd]
+group = []
+src += Glob('*.c')
+
+if rtconfig.PLATFORM != 'gcc':
+ group = DefineGroup('libc', src, depend = ['RT_USING_LIBC'], CPPPATH = CPPPATH)
+Return('group')
diff --git a/components/libc/compilers/common/excgcc/fcntl.h b/components/libc/compilers/common/excgcc/fcntl.h
new file mode 100644
index 0000000000..f247b926e9
--- /dev/null
+++ b/components/libc/compilers/common/excgcc/fcntl.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+#ifndef FCNTL_H__
+#define FCNTL_H__
+
+#include <rtconfig.h>
+
+#ifdef RT_USING_DFS
+#include <dfs_posix.h>
+#endif
+
+#endif
diff --git a/components/libc/compilers/common/excgcc/readme.md b/components/libc/compilers/common/excgcc/readme.md
new file mode 100644
index 0000000000..15f8e60d59
--- /dev/null
+++ b/components/libc/compilers/common/excgcc/readme.md
@@ -0,0 +1,3 @@
+## Attentions
+
+This folder is "common" for armlibc and dlib. \ No newline at end of file
diff --git a/components/libc/compilers/common/excgcc/sys/stat.h b/components/libc/compilers/common/excgcc/sys/stat.h
new file mode 100644
index 0000000000..c4b42083c4
--- /dev/null
+++ b/components/libc/compilers/common/excgcc/sys/stat.h
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
diff --git a/components/libc/compilers/common/excgcc/sys/types.h b/components/libc/compilers/common/excgcc/sys/types.h
new file mode 100644
index 0000000000..7222326a2a
--- /dev/null
+++ b/components/libc/compilers/common/excgcc/sys/types.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-09-05 Meco Man fix bugs
+ * 2020-12-16 Meco Man add useconds_t
+ */
+#ifndef __TYPES_H__
+#define __TYPES_H__
+
+#include <stdint.h>
+
+typedef int32_t clockid_t;
+typedef int32_t key_t; /* Used for interprocess communication. */
+typedef int pid_t; /* Used for process IDs and process group IDs. */
+typedef unsigned short uid_t;
+typedef unsigned short gid_t;
+typedef signed long off_t;
+typedef int mode_t;
+#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
+typedef unsigned long useconds_t; /* microseconds (unsigned) */
+
+typedef unsigned long dev_t;
+
+typedef unsigned int u_int;
+typedef unsigned char u_char;
+typedef unsigned long u_long;
+
+#endif
diff --git a/components/libc/compilers/common/excgcc/sys/unistd.h b/components/libc/compilers/common/excgcc/sys/unistd.h
new file mode 100644
index 0000000000..7752a1caf7
--- /dev/null
+++ b/components/libc/compilers/common/excgcc/sys/unistd.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-12-16 Meco Man add usleep
+ */
+#ifndef _SYS_UNISTD_H
+#define _SYS_UNISTD_H
+
+#include <rtconfig.h>
+#include "types.h"
+
+#ifdef RT_USING_DFS
+
+#define STDIN_FILENO 0 /* standard input file descriptor */
+#define STDOUT_FILENO 1 /* standard output file descriptor */
+#define STDERR_FILENO 2 /* standard error file descriptor */
+
+#include <dfs_posix.h>
+#else
+#define _FREAD 0x0001 /* read enabled */
+#define _FWRITE 0x0002 /* write enabled */
+#define _FAPPEND 0x0008 /* append (writes guaranteed at the end) */
+#define _FMARK 0x0010 /* internal; mark during gc() */
+#define _FDEFER 0x0020 /* internal; defer for next gc pass */
+#define _FASYNC 0x0040 /* signal pgrp when data ready */
+#define _FSHLOCK 0x0080 /* BSD flock() shared lock present */
+#define _FEXLOCK 0x0100 /* BSD flock() exclusive lock present */
+#define _FCREAT 0x0200 /* open with file create */
+#define _FTRUNC 0x0400 /* open with truncation */
+#define _FEXCL 0x0800 /* error on open if file exists */
+#define _FNBIO 0x1000 /* non blocking I/O (sys5 style) */
+#define _FSYNC 0x2000 /* do all writes synchronously */
+#define _FNONBLOCK 0x4000 /* non blocking I/O (POSIX style) */
+#define _FNDELAY _FNONBLOCK /* non blocking I/O (4.2 style) */
+#define _FNOCTTY 0x8000 /* don't assign a ctty on this open */
+
+
+#ifndef O_RDONLY
+#define O_RDONLY 0 /* +1 == FREAD */
+#endif
+#ifndef O_WRONLY
+#define O_WRONLY 1 /* +1 == FWRITE */
+#endif
+#ifndef O_RDWR
+#define O_RDWR 2 /* +1 == FREAD|FWRITE */
+#endif
+#ifndef O_APPEND
+#define O_APPEND _FAPPEND
+#endif
+#ifndef O_CREAT
+#define O_CREAT _FCREAT
+#endif
+#ifndef O_TRUNC
+#define O_TRUNC _FTRUNC
+#endif
+#ifndef O_EXCL
+#define O_EXCL _FEXCL
+#endif
+#ifndef O_SYNC
+#define O_SYNC _FSYNC
+#endif
+
+#endif
+
+
+int isatty (int fd);
+char * ttyname (int desc);
+
+unsigned int sleep(unsigned int seconds);
+int usleep(useconds_t usec);
+
+pid_t getpid(void);
+pid_t getppid(void);
+uid_t getuid(void);
+uid_t geteuid(void);
+gid_t getgid(void);
+gid_t getegid(void);
+
+#endif /* _SYS_UNISTD_H */
diff --git a/components/libc/compilers/common/excgcc/unistd.h b/components/libc/compilers/common/excgcc/unistd.h
new file mode 100644
index 0000000000..cd77a12e3b
--- /dev/null
+++ b/components/libc/compilers/common/excgcc/unistd.h
@@ -0,0 +1,10 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+#include "sys/unistd.h"
+