summaryrefslogtreecommitdiff
path: root/components/libc/compilers/common
diff options
context:
space:
mode:
authorcliff-cmc <[email protected]>2021-02-26 11:09:27 +0800
committerCliff Chen <[email protected]>2021-02-26 11:45:19 +0800
commiteea0c3d74a40f73235da45c6f77e8b411ac94cf2 (patch)
treea6906f1aed7118ab53dbe18f2ee4727a754583af /components/libc/compilers/common
parent1a9ecf27f31277750d92c921b62503f75275e122 (diff)
parentfae0fa8eea4c0e797940bf1eddc8ee6c1711734a (diff)
Add memtrace command for memheap.c
Diffstat (limited to 'components/libc/compilers/common')
-rw-r--r--components/libc/compilers/common/SConscript18
-rw-r--r--components/libc/compilers/common/readme.md10
-rw-r--r--components/libc/compilers/common/stdlib.c28
-rw-r--r--components/libc/compilers/common/sys/time.h66
-rw-r--r--components/libc/compilers/common/termios.h19
-rw-r--r--components/libc/compilers/common/time.c442
-rw-r--r--components/libc/compilers/common/unistd.c88
7 files changed, 559 insertions, 112 deletions
diff --git a/components/libc/compilers/common/SConscript b/components/libc/compilers/common/SConscript
index a8d2606820..ecdee2637e 100644
--- a/components/libc/compilers/common/SConscript
+++ b/components/libc/compilers/common/SConscript
@@ -8,12 +8,20 @@ group = []
CPPPATH = [cwd]
if GetDepend('RT_USING_LIBC'):
- src += Glob('*.c')
+ src += Glob('*.c')
else:
- if GetDepend('RT_LIBC_USING_TIME'):
- src += ['time.c']
+ if GetDepend('RT_LIBC_USING_TIME') and not GetDepend('RT_USING_MINILIBC'):
+ src += ['time.c']
-if (rtconfig.PLATFORM == 'armcc' or rtconfig.PLATFORM == 'iar') and rtconfig.ARCH != 'sim' :
- group = DefineGroup('libc', src, depend = [''], CPPPATH = CPPPATH)
+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 not GetDepend('RT_USING_MINILIBC') and (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/readme.md b/components/libc/compilers/common/readme.md
new file mode 100644
index 0000000000..81bb005d0a
--- /dev/null
+++ b/components/libc/compilers/common/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/stdlib.c b/components/libc/compilers/common/stdlib.c
new file mode 100644
index 0000000000..48a86098cd
--- /dev/null
+++ b/components/libc/compilers/common/stdlib.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2006-2018, 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/sys/time.h b/components/libc/compilers/common/sys/time.h
index 1d68eeafa3..e4d60d2d11 100644
--- a/components/libc/compilers/common/sys/time.h
+++ b/components/libc/compilers/common/sys/time.h
@@ -5,16 +5,27 @@
*
* 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
/*
@@ -27,31 +38,56 @@ struct timeval {
};
#endif /* _TIMEVAL_DEFINED */
-/*
- * Skip define timespec for IAR version over 8.10.1 where __VER__ is 8010001.
- */
-#if defined ( __ICCARM__ ) && (__VER__ >= 8010001)
-#define _TIMESPEC_DEFINED
-#endif
-
-#ifndef _TIMESPEC_DEFINED
-#define _TIMESPEC_DEFINED
-/*
- * Structure defined by POSIX.1b to be like a timeval.
- */
+#if !defined __GNUC__ && !defined __ICCARM__
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* and nanoseconds */
};
-#endif /* _TIMESPEC_DEFINED */
+#endif
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of dst correction */
};
-int gettimeofday(struct timeval *tp, void *ignore);
-struct tm *gmtime_r(const time_t *timep, struct tm *r);
+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);
+
+#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
}
diff --git a/components/libc/compilers/common/termios.h b/components/libc/compilers/common/termios.h
new file mode 100644
index 0000000000..414d0c0cb3
--- /dev/null
+++ b/components/libc/compilers/common/termios.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2006-2018, 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/time.c b/components/libc/compilers/common/time.c
index 50a800b259..c2fbd6f333 100644
--- a/components/libc/compilers/common/time.c
+++ b/components/libc/compilers/common/time.c
@@ -6,15 +6,30 @@
* 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
+ * add difftime()
+ * 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
*/
#include <sys/time.h>
#include <rtthread.h>
+#ifdef RT_USING_DEVICE
+#include <rtdevice.h>
+#endif
-#if !defined (__IAR_SYSTEMS_ICC__)
+/* seconds per day */
+#define SPD 24*60*60
/* days per month -- nonleap! */
-const short __spm[13] =
+static const short __spm[13] =
{
0,
(31),
@@ -30,13 +45,11 @@ const short __spm[13] =
(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
+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 ";
-int __isleap(int year)
+static int __isleap(int year)
{
/* every fourth year is a leap year except for century years that are
* not divisible by 400. */
@@ -44,6 +57,12 @@ int __isleap(int year)
return (!(year % 4) && ((year % 100) || !(year % 400)));
}
+static void num2str(char *c, int i)
+{
+ c[0] = i / 10 + '0';
+ c[1] = i % 10 + '0';
+}
+
struct tm *gmtime_r(const time_t *timep, struct tm *r)
{
time_t i;
@@ -77,29 +96,175 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r)
;
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 is not supprt now */
+/*TODO: timezone */
struct tm* localtime_r(const time_t* t, struct tm* r)
{
- return gmtime_r(t, r);
+ time_t local_tz;
+ int utc_plus;
+
+ utc_plus = 0; /* GTM: UTC+0 */
+ 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)
{
+ return timegm(t);
+}
+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';
+ return buf;
+}
+RTM_EXPORT(asctime_r);
+
+char* asctime(const struct tm *timeptr)
+{
+ static char buf[25];
+ 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);
+
+double difftime (time_t tim1, time_t tim2)
+{
+ return (double)(tim1 - tim2);
+}
+RTM_EXPORT(difftime);
+
+/**
+ * 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)
+{
+ time_t time_now = ((time_t)-1); /* default is not available */
+
+#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;
+ }
+
+ if(time_now == (time_t)-1)
+ {
+ errno = ENOSYS;
+ }
+
+ return time_now;
+}
+RTM_EXPORT(time);
+
+RT_WEAK clock_t clock(void)
+{
+ return rt_tick_get();
+}
+RTM_EXPORT(clock);
+
+int stime(const time_t *t)
+{
+#ifdef RT_USING_RTC
+ rt_device_t device;
+
+ /* read timestamp from RTC device. */
+ device = rt_device_find("rtc");
+ if (rt_device_open(device, 0) == RT_EOK)
+ {
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, (void*)t);
+ rt_device_close(device);
+ }
+ else
+ {
+ errno = ENOSYS;
+ return -1;
+ }
+ return 0;
+
+#else
+ errno = ENOSYS;
+ return -1;
+#endif /* RT_USING_RTC */
+}
+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;
@@ -171,121 +336,214 @@ time_t mktime(struct tm * const t)
i = 60;
return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
}
+RTM_EXPORT(timegm);
-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)
+/* TODO: timezone */
+int gettimeofday(struct timeval *tv, struct timezone *tz)
{
- /* "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;
-}
+ time_t t = time(RT_NULL);
-char* asctime(const struct tm *timeptr)
-{
- static char buf[25];
- return asctime_r(timeptr, buf);
+ if (tv != RT_NULL && t != (time_t)-1)
+ {
+ tv->tv_sec = t;
+ tv->tv_usec = 0;
+ return 0;
+ }
+ else
+ {
+ errno = ENOSYS;
+ return -1;
+ }
}
+RTM_EXPORT(gettimeofday);
-char* ctime(const time_t *timep)
+/* TODO: timezone */
+int settimeofday(const struct timeval *tv, const struct timezone *tz)
{
- return asctime(localtime(timep));
+ if (tv != RT_NULL)
+ {
+ return stime((const time_t *)&tv->tv_sec);
+ }
+ else
+ {
+ errno = ENOSYS;
+ return -1;
+ }
}
+RTM_EXPORT(settimeofday);
-#endif /* __IAR_SYSTEMS_ICC__ */
-
-int gettimeofday(struct timeval *tp, void *ignore)
+#ifdef RT_USING_POSIX
+static struct timeval _timevalue;
+static int clock_time_system_init()
{
- time_t time = 0;
-#ifdef RT_USING_DEVICE
+ time_t time;
+ rt_tick_t tick;
rt_device_t device;
+
+ time = 0;
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)
+ if (device != RT_NULL)
{
- tp->tv_sec = time;
- tp->tv_usec = 0;
+ /* get realtime seconds */
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
}
-#else
- tv->tv_sec = 0;
- tv->tv_usec = 0;
-#endif
- return 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;
-/**
- * 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)
+ 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
-{
- time_t time_now = 0;
-#ifdef RT_USING_RTC
- static rt_device_t device = RT_NULL;
+ default:
+ ret = -1;
+ rt_set_errno(EINVAL);
+ break;
+ }
- /* optimization: find rtc device only first. */
- if (device == RT_NULL)
+ return ret;
+}
+RTM_EXPORT(clock_getres);
+
+int clock_gettime(clockid_t clockid, struct timespec *tp)
+{
+ int ret = 0;
+
+ if (tp == RT_NULL)
{
- device = rt_device_find("rtc");
+ rt_set_errno(EINVAL);
+ return -1;
}
- /* read timestamp from RTC device. */
- if (device != RT_NULL)
+ switch (clockid)
{
- if (rt_device_open(device, 0) == RT_EOK)
+ case CLOCK_REALTIME:
{
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
- rt_device_close(device);
+ /* 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;
}
-#endif /* RT_USING_RTC */
- /* if t is not NULL, write timestamp to *t */
- if (t != RT_NULL)
+ 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))
{
- *t = time_now;
+ rt_set_errno(EINVAL);
+
+ return -1;
}
- return time_now;
+ /* 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);
-RT_WEAK clock_t clock(void)
+int clock_time_to_tick(const struct timespec *time)
{
- return rt_tick_get();
+ 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/unistd.c b/components/libc/compilers/common/unistd.c
new file mode 100644
index 0000000000..0966242e55
--- /dev/null
+++ b/components/libc/compilers/common/unistd.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2006-2018, 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);