summaryrefslogtreecommitdiff
path: root/components/libc/compilers
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
parent1a9ecf27f31277750d92c921b62503f75275e122 (diff)
parentfae0fa8eea4c0e797940bf1eddc8ee6c1711734a (diff)
Add memtrace command for memheap.c
Diffstat (limited to 'components/libc/compilers')
-rw-r--r--components/libc/compilers/armlibc/README.md9
-rw-r--r--components/libc/compilers/armlibc/fcntl.h2
-rw-r--r--components/libc/compilers/armlibc/libc_syms.c7
-rw-r--r--components/libc/compilers/armlibc/sys/ioctl.h (renamed from components/libc/compilers/armlibc/termios.h)8
-rw-r--r--components/libc/compilers/armlibc/sys/types.h16
-rw-r--r--components/libc/compilers/armlibc/sys/unistd.h36
-rw-r--r--components/libc/compilers/armlibc/syscalls.c (renamed from components/libc/compilers/armlibc/stubs.c)60
-rw-r--r--components/libc/compilers/armlibc/unistd.h1
-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.h (renamed from components/libc/compilers/newlib/termios.h)4
-rw-r--r--components/libc/compilers/common/time.c442
-rw-r--r--components/libc/compilers/common/unistd.c88
-rw-r--r--components/libc/compilers/dlib/README.md7
-rw-r--r--components/libc/compilers/dlib/SConscript2
-rw-r--r--components/libc/compilers/dlib/sys/types.h15
-rw-r--r--components/libc/compilers/dlib/sys/unistd.h18
-rw-r--r--components/libc/compilers/dlib/syscall_remove.c10
-rw-r--r--components/libc/compilers/dlib/syscalls.c25
-rw-r--r--components/libc/compilers/dlib/syscalls.h10
-rw-r--r--components/libc/compilers/dlib/termios.h15
-rw-r--r--components/libc/compilers/minilibc/SConscript2
-rw-r--r--components/libc/compilers/newlib/README.md9
-rw-r--r--components/libc/compilers/newlib/SConscript2
-rw-r--r--components/libc/compilers/newlib/libc.h19
-rw-r--r--components/libc/compilers/newlib/libc_syms.c4
-rw-r--r--components/libc/compilers/newlib/machine/time.h12
-rw-r--r--components/libc/compilers/newlib/syscalls.c241
-rw-r--r--components/libc/compilers/newlib/time.c82
31 files changed, 807 insertions, 461 deletions
diff --git a/components/libc/compilers/armlibc/README.md b/components/libc/compilers/armlibc/README.md
new file mode 100644
index 0000000000..4d2a73b6be
--- /dev/null
+++ b/components/libc/compilers/armlibc/README.md
@@ -0,0 +1,9 @@
+# ARMLIB (Keil-MDK) porting for RT-Thread
+
+Please define RT_USING_LIBC and compile RT-Thread with Keil-MDK compiler.
+
+
+
+## More Information
+
+https://www.keil.com/support/man/docs/armlib/ \ No newline at end of file
diff --git a/components/libc/compilers/armlibc/fcntl.h b/components/libc/compilers/armlibc/fcntl.h
index 80cf1b4409..3e650a8471 100644
--- a/components/libc/compilers/armlibc/fcntl.h
+++ b/components/libc/compilers/armlibc/fcntl.h
@@ -9,6 +9,8 @@
#ifndef FCNTL_H__
#define FCNTL_H__
+#include <rtconfig.h>
+
#ifdef RT_USING_DFS
#include <dfs_posix.h>
#endif
diff --git a/components/libc/compilers/armlibc/libc_syms.c b/components/libc/compilers/armlibc/libc_syms.c
index 0e1c42d899..a2e8af17f1 100644
--- a/components/libc/compilers/armlibc/libc_syms.c
+++ b/components/libc/compilers/armlibc/libc_syms.c
@@ -10,8 +10,6 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
-#include <time.h>
-
#include <rtm.h>
/* some export routines for module */
@@ -35,11 +33,6 @@ RTM_EXPORT(memchr);
RTM_EXPORT(toupper);
RTM_EXPORT(atoi);
-#ifdef RT_USING_RTC
-RTM_EXPORT(localtime);
-RTM_EXPORT(time);
-#endif
-
/* import the full stdio for printf */
#if defined(RT_USING_MODULE) && defined(__MICROLIB)
#error "[RT_USING_LIBC] Please use standard libc but not microlib."
diff --git a/components/libc/compilers/armlibc/termios.h b/components/libc/compilers/armlibc/sys/ioctl.h
index 1956121225..033a57014a 100644
--- a/components/libc/compilers/armlibc/termios.h
+++ b/components/libc/compilers/armlibc/sys/ioctl.h
@@ -5,11 +5,11 @@
*
* Change Logs:
* Date Author Notes
+ * 2020-09-01 Meco Man First Version
*/
-#ifndef _TERMIOS_H__
-#define _TERMIOS_H__
+#ifndef _SYS_IOCTL_H
+#define _SYS_IOCTL_H
+
-#include <sys/types.h>
-#include <posix_termios.h>
#endif
diff --git a/components/libc/compilers/armlibc/sys/types.h b/components/libc/compilers/armlibc/sys/types.h
index 001ace4dd2..d1e457b36f 100644
--- a/components/libc/compilers/armlibc/sys/types.h
+++ b/components/libc/compilers/armlibc/sys/types.h
@@ -5,20 +5,24 @@
*
* 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>
-#include <rtthread.h>
-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 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;
#ifndef ARCH_CPU_64BIT
-typedef signed int ssize_t; /* Used for a count of bytes or an error indication. */
+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. */
+typedef long signed int ssize_t; /* Used for a count of bytes or an error indication. */
#endif
+typedef unsigned long useconds_t; /* microseconds (unsigned) */
#endif
diff --git a/components/libc/compilers/armlibc/sys/unistd.h b/components/libc/compilers/armlibc/sys/unistd.h
index 33f0561e72..ee1e1c4db9 100644
--- a/components/libc/compilers/armlibc/sys/unistd.h
+++ b/components/libc/compilers/armlibc/sys/unistd.h
@@ -5,11 +5,13 @@
*
* Change Logs:
* Date Author Notes
+ * 2020-12-16 Meco Man add usleep
*/
#ifndef _SYS_UNISTD_H
#define _SYS_UNISTD_H
-#include <rtthread.h>
+#include <rtconfig.h>
+#include "types.h"
#ifdef RT_USING_DFS
@@ -36,14 +38,46 @@
#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/armlibc/stubs.c b/components/libc/compilers/armlibc/syscalls.c
index b6ffb37b0f..8addb3e163 100644
--- a/components/libc/compilers/armlibc/stubs.c
+++ b/components/libc/compilers/armlibc/syscalls.c
@@ -9,16 +9,21 @@
* 2013-11-24 aozima fixed _sys_read()/_sys_write() issues.
* 2014-08-03 bernard If using msh, use system() implementation
* in msh.
+ * 2020-08-05 Meco Man fixed _sys_flen() compiling-warning when
+ * RT_USING_DFS is not defined
+ * 2020-02-13 Meco Man re-implement exit() and abort()
+ * 2020-02-14 Meco Man implement _sys_tmpnam()
+ * 2020-02-25 Meco Man add multithreaded protection
*/
#include <string.h>
#include <rt_sys.h>
-#include "rtthread.h"
+#include <rtthread.h>
#include "libc.h"
#ifdef RT_USING_DFS
-#include "dfs_posix.h"
+#include <dfs_posix.h>
#endif
#ifdef __CLANG_ARM
@@ -37,6 +42,36 @@ const char __stdin_name[] = "STDIN";
const char __stdout_name[] = "STDOUT";
const char __stderr_name[] = "STDERR";
+#ifdef RT_USING_HEAP
+int _mutex_initialize(rt_mutex_t *m)
+{
+ *m = rt_mutex_create("_mutex_", RT_IPC_FLAG_PRIO);
+ if(*m == RT_NULL)
+ {
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+void _mutex_acquire(rt_mutex_t *m)
+{
+ rt_mutex_take(*m, RT_WAITING_FOREVER);
+}
+
+void _mutex_release(rt_mutex_t *m)
+{
+ rt_mutex_release(*m);
+}
+
+void _mutex_free(rt_mutex_t *m)
+{
+ rt_mutex_delete(*m);
+}
+#endif
+
/**
* required by fopen() and freopen().
*
@@ -231,7 +266,8 @@ int _sys_seek(FILEHANDLE fh, long pos)
*/
int _sys_tmpnam(char *name, int fileno, unsigned maxlength)
{
- return -1;
+ rt_snprintf(name, maxlength, "tem%03d", fileno);
+ return 1;
}
char *_sys_command_string(char *cmd, int len)
@@ -251,10 +287,12 @@ void _ttywrch(int ch)
#endif
}
+/* for exit() and abort() */
RT_WEAK void _sys_exit(int return_code)
{
- /* TODO: perhaps exit the thread which is invoking this function */
- while (1);
+ extern void __rt_libc_exit(int status);
+ __rt_libc_exit(return_code);
+ while(1);
}
/**
@@ -265,16 +303,16 @@ RT_WEAK void _sys_exit(int return_code)
*/
long _sys_flen(FILEHANDLE fh)
{
+#ifdef RT_USING_DFS
struct stat stat;
-
+
if (fh < STDERR)
return -1;
-#ifndef RT_USING_DFS
- return -1;
-#else
fstat(fh, &stat);
return stat.st_size;
+#else
+ return -1;
#endif
}
@@ -300,8 +338,8 @@ int remove(const char *filename)
#else
int system(const char *string)
{
- RT_ASSERT(0);
- for (;;);
+ extern int __rt_libc_system(const char *string);
+ return __rt_libc_system(string);
}
#endif
diff --git a/components/libc/compilers/armlibc/unistd.h b/components/libc/compilers/armlibc/unistd.h
index 70187722d8..736fc219a8 100644
--- a/components/libc/compilers/armlibc/unistd.h
+++ b/components/libc/compilers/armlibc/unistd.h
@@ -7,3 +7,4 @@
* Date Author Notes
*/
#include "sys/unistd.h"
+
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/newlib/termios.h b/components/libc/compilers/common/termios.h
index 1956121225..414d0c0cb3 100644
--- a/components/libc/compilers/newlib/termios.h
+++ b/components/libc/compilers/common/termios.h
@@ -9,7 +9,11 @@
#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);
diff --git a/components/libc/compilers/dlib/README.md b/components/libc/compilers/dlib/README.md
index 846eb3f5c0..acd08f9074 100644
--- a/components/libc/compilers/dlib/README.md
+++ b/components/libc/compilers/dlib/README.md
@@ -1,4 +1,9 @@
-Dlib(IAR) porting for RT-Thread.
+# DLIB (IAR) porting for RT-Thread
Please define RT_USING_LIBC and compile RT-Thread with IAR compiler.
+
+
+## More Information
+
+http://www.iarsys.co.jp/download/LMS2/arm/7502/ewarm7502doc/arm/doc/EWARM_DevelopmentGuide.ENU.pdf P.130 \ No newline at end of file
diff --git a/components/libc/compilers/dlib/SConscript b/components/libc/compilers/dlib/SConscript
index 456b762496..75a5812fab 100644
--- a/components/libc/compilers/dlib/SConscript
+++ b/components/libc/compilers/dlib/SConscript
@@ -20,7 +20,7 @@ if rtconfig.PLATFORM == 'iar':
if LooseVersion(IARVersion()) < LooseVersion("8.20.1"):
CPPDEFINES = CPPDEFINES + ['_DLIB_THREAD_SUPPORT']
- group = DefineGroup('dlib', src, depend = ['RT_USING_LIBC'],
+ group = DefineGroup('libc', src, depend = ['RT_USING_LIBC'],
CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
Return('group')
diff --git a/components/libc/compilers/dlib/sys/types.h b/components/libc/compilers/dlib/sys/types.h
index 001ace4dd2..3af15ba251 100644
--- a/components/libc/compilers/dlib/sys/types.h
+++ b/components/libc/compilers/dlib/sys/types.h
@@ -5,20 +5,23 @@
*
* Change Logs:
* Date Author Notes
+ * 2020-12-16 Meco Man add useconds_t
*/
#ifndef __TYPES_H__
#define __TYPES_H__
#include <stdint.h>
-#include <rtthread.h>
-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 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;
#ifndef ARCH_CPU_64BIT
-typedef signed int ssize_t; /* Used for a count of bytes or an error indication. */
+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. */
+typedef long signed int ssize_t; /* Used for a count of bytes or an error indication. */
#endif
+typedef unsigned long useconds_t; /* microseconds (unsigned) */
#endif
diff --git a/components/libc/compilers/dlib/sys/unistd.h b/components/libc/compilers/dlib/sys/unistd.h
index 29f68f24f8..5b86822635 100644
--- a/components/libc/compilers/dlib/sys/unistd.h
+++ b/components/libc/compilers/dlib/sys/unistd.h
@@ -5,10 +5,14 @@
*
* 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 */
@@ -36,4 +40,18 @@
#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/dlib/syscall_remove.c b/components/libc/compilers/dlib/syscall_remove.c
index e7f0268b1b..f7e64d1997 100644
--- a/components/libc/compilers/dlib/syscall_remove.c
+++ b/components/libc/compilers/dlib/syscall_remove.c
@@ -9,16 +9,16 @@
*/
#include <rtthread.h>
#ifdef RT_USING_DFS
-#include <dfs_file.h>
+#include <dfs_posix.h>
#endif
#include <yfuns.h>
#pragma module_name = "?remove"
int remove(const char *val)
{
-#ifdef RT_USING_DFS
- dfs_file_unlink(val);
+#ifndef RT_USING_DFS
+ return -1;
+#else
+ return unlink(val);
#endif
-
- return 0;
}
diff --git a/components/libc/compilers/dlib/syscalls.c b/components/libc/compilers/dlib/syscalls.c
new file mode 100644
index 0000000000..007ea76bd1
--- /dev/null
+++ b/components/libc/compilers/dlib/syscalls.c
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-02-13 Meco Man implement exit() and abort()
+ * 2021-02-20 Meco Man add system()
+ */
+#include <rtthread.h>
+
+/* for exit() and abort() */
+void __exit (int status)
+{
+ extern void __rt_libc_exit(int status);
+ __rt_libc_exit(status);
+ while(1);
+}
+
+int system(const char * string)
+{
+ extern int __rt_libc_system(const char *string);
+ return __rt_libc_system(string);
+}
diff --git a/components/libc/compilers/dlib/syscalls.h b/components/libc/compilers/dlib/syscalls.h
deleted file mode 100644
index 993962e8db..0000000000
--- a/components/libc/compilers/dlib/syscalls.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2015-01-28 Bernard first version
- */
-
diff --git a/components/libc/compilers/dlib/termios.h b/components/libc/compilers/dlib/termios.h
deleted file mode 100644
index 1956121225..0000000000
--- a/components/libc/compilers/dlib/termios.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * 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 <sys/types.h>
-#include <posix_termios.h>
-
-#endif
diff --git a/components/libc/compilers/minilibc/SConscript b/components/libc/compilers/minilibc/SConscript
index 518d800571..dec657028f 100644
--- a/components/libc/compilers/minilibc/SConscript
+++ b/components/libc/compilers/minilibc/SConscript
@@ -8,7 +8,7 @@ group = []
CPPPATH = [cwd]
CPPDEFINES = ['RT_USING_MINILIBC']
-if rtconfig.PLATFORM == 'gcc' and rtconfig.ARCH != 'sim' and not GetDepend('RT_USING_LIBC'):
+if rtconfig.PLATFORM == 'gcc' and rtconfig.ARCH != 'sim' and not GetDepend('RT_USING_LIBC') and GetDepend('RT_USING_MINILIBC'):
group = DefineGroup('libc', src, depend = [''],
CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
diff --git a/components/libc/compilers/newlib/README.md b/components/libc/compilers/newlib/README.md
new file mode 100644
index 0000000000..385f329a4f
--- /dev/null
+++ b/components/libc/compilers/newlib/README.md
@@ -0,0 +1,9 @@
+# NEWLIB (GCC) porting for RT-Thread
+
+Please define RT_USING_LIBC and compile RT-Thread with GCC compiler.
+
+
+
+## More Information
+
+https://sourceware.org/newlib/libc.html#Reentrancy \ No newline at end of file
diff --git a/components/libc/compilers/newlib/SConscript b/components/libc/compilers/newlib/SConscript
index 06e5faad09..d0868bbdea 100644
--- a/components/libc/compilers/newlib/SConscript
+++ b/components/libc/compilers/newlib/SConscript
@@ -15,7 +15,7 @@ CPPDEFINES = ['RT_USING_NEWLIB']
LIBS = ['c', 'm']
if rtconfig.PLATFORM == 'gcc':
- group = DefineGroup('newlib', src, depend = ['RT_USING_LIBC'],
+ group = DefineGroup('libc', src, depend = ['RT_USING_LIBC'],
CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS)
Return('group')
diff --git a/components/libc/compilers/newlib/libc.h b/components/libc/compilers/newlib/libc.h
index fdf2ab4f60..9a76ffb79f 100644
--- a/components/libc/compilers/newlib/libc.h
+++ b/components/libc/compilers/newlib/libc.h
@@ -10,23 +10,10 @@
#ifndef __RTT_LIBC_H__
#define __RTT_LIBC_H__
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <sys/time.h>
-
#ifndef _EXFUN
-#define _EXFUN(name, proto) name proto
+#define _EXFUN(name, proto) name proto
#endif
-#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)
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -34,10 +21,6 @@ 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);
#ifdef __cplusplus
}
#endif
diff --git a/components/libc/compilers/newlib/libc_syms.c b/components/libc/compilers/newlib/libc_syms.c
index b150c10fd6..4b0ee355f0 100644
--- a/components/libc/compilers/newlib/libc_syms.c
+++ b/components/libc/compilers/newlib/libc_syms.c
@@ -39,10 +39,6 @@ RTM_EXPORT(snprintf);
RTM_EXPORT(fwrite);
-#include <time.h>
-RTM_EXPORT(localtime);
-RTM_EXPORT(time);
-
#include <setjmp.h>
RTM_EXPORT(longjmp);
RTM_EXPORT(setjmp);
diff --git a/components/libc/compilers/newlib/machine/time.h b/components/libc/compilers/newlib/machine/time.h
new file mode 100644
index 0000000000..d46533eb39
--- /dev/null
+++ b/components/libc/compilers/newlib/machine/time.h
@@ -0,0 +1,12 @@
+#ifndef _MACHTIME_H_
+#define _MACHTIME_H_
+
+#include <rtconfig.h>
+#define _CLOCKS_PER_SEC_ RT_TICK_PER_SECOND
+
+#ifdef __SPU__
+#include <sys/_timespec.h>
+int nanosleep (const struct timespec *, struct timespec *);
+#endif
+
+#endif /* _MACHTIME_H_ */
diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c
index 228fa0d140..949d8a61de 100644
--- a/components/libc/compilers/newlib/syscalls.c
+++ b/components/libc/compilers/newlib/syscalls.c
@@ -5,11 +5,16 @@
*
* Change Logs:
* Date Author Notes
+ * 2021-02-11 Meco Man remove _gettimeofday_r() and _times_r()
+ * 2020-02-13 Meco Man re-implement exit() and abort()
+ * 2020-02-21 Meco Man improve and beautify syscalls
+ * 2020-02-24 Meco Man fix bug of _isatty_r()
*/
+
#include <reent.h>
-#include <sys/errno.h>
-#include <sys/time.h>
+#include <errno.h>
#include <stdio.h>
+#include <sys/time.h>
#include <rtthread.h>
@@ -32,10 +37,18 @@ __errno ()
#endif
int
+_getpid_r(struct _reent *ptr)
+{
+ return 0;
+}
+
+int
_close_r(struct _reent *ptr, int fd)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
return close(fd);
#endif
@@ -74,21 +87,17 @@ _fstat_r(struct _reent *ptr, int fd, struct stat *pstat)
}
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;
+ if (fd >=0 && fd < 3)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
}
-
int
_kill_r(struct _reent *ptr, int pid, int sig)
{
@@ -109,7 +118,9 @@ _off_t
_lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
_off_t rc;
@@ -122,7 +133,9 @@ int
_mkdir_r(struct _reent *ptr, const char *name, int mode)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
int rc;
@@ -135,7 +148,9 @@ int
_open_r(struct _reent *ptr, const char *file, int flags, int mode)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
int rc;
@@ -148,7 +163,9 @@ _ssize_t
_read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
_ssize_t rc;
@@ -161,7 +178,9 @@ int
_rename_r(struct _reent *ptr, const char *old, const char *new)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
int rc;
@@ -181,7 +200,9 @@ int
_stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
int rc;
@@ -190,24 +211,15 @@ _stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
#endif
}
-_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)
{
#ifndef RT_USING_DFS
- return 0;
+ /* return "not supported" */
+ ptr->_errno = ENOTSUP;
+ return -1;
#else
- int rc;
-
- rc = unlink(file);
- return rc;
+ return unlink(file);
#endif
}
@@ -219,11 +231,11 @@ _wait_r(struct _reent *ptr, int *status)
return -1;
}
-#ifdef RT_USING_DEVICE
_ssize_t
_write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
#ifndef RT_USING_DFS
+#ifdef RT_USING_DEVICE
if (fileno(stdout) == fd)
{
rt_device_t console;
@@ -233,120 +245,18 @@ _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
}
return 0;
-
#else
- _ssize_t rc;
-
- rc = write(fd, buf, nbytes);
- return rc;
-#endif
-}
-#endif
-
-#ifdef RT_USING_PTHREADS
-
-#include <clock_time.h>
-/* POSIX timer provides clock_gettime function */
-#include <time.h>
-int
-_gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp)
-{
- struct timespec tp;
-
- if (clock_gettime(CLOCK_REALTIME, &tp) == 0)
- {
- if (__tp != RT_NULL)
- {
- __tp->tv_sec = tp.tv_sec;
- __tp->tv_usec = tp.tv_nsec / 1000UL;
- }
-
- return tp.tv_sec;
- }
-
/* return "not supported" */
ptr->_errno = ENOTSUP;
return -1;
-}
-
+#endif /*RT_USING_DEVICE*/
#else
+ _ssize_t rc;
-#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)
-
-struct timeval _timevalue = {0};
-#ifdef RT_USING_DEVICE
-static void libc_system_time_init(void)
-{
- 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;
-}
+ rc = write(fd, buf, nbytes);
+ return rc;
#endif
-
-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) * MICROSECOND_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;
}
-#endif
/* Memory routine */
void *
@@ -396,27 +306,20 @@ _free_r (struct _reent *ptr, void *addr)
rt_free (addr);
}
-void
-exit (int status)
+/* for exit() and abort() */
+__attribute__ ((noreturn)) void
+_exit (int status)
{
-#ifdef RT_USING_MODULE
- if (dlmodule_self())
- {
- dlmodule_exit(status);
- }
-#endif
-
- rt_kprintf("thread:%s exit with %d\n", rt_thread_self()->name, status);
- RT_ASSERT(0);
-
- while (1);
+ extern void __rt_libc_exit(int status);
+ __rt_libc_exit(status);
+ while(1);
}
void
_system(const char *s)
{
- /* not support this call */
- return;
+ extern int __rt_libc_system(const char *string);
+ __rt_libc_system(s);
}
void __libc_init_array(void)
@@ -424,26 +327,6 @@ void __libc_init_array(void)
/* we not use __libc init_aray to initialize C++ objects */
}
-void abort(void)
-{
- if (rt_thread_self())
- {
- rt_thread_t self = rt_thread_self();
-
- rt_kprintf("thread:%-8.*s abort!\n", RT_NAME_MAX, self->name);
- rt_thread_suspend(self);
-
- rt_schedule();
- }
-
- while (1);
-}
-
-uid_t getuid(void)
-{
- return 0;
-}
-
mode_t umask(mode_t mask)
{
return 022;
@@ -453,3 +336,9 @@ int flock(int fd, int operation)
{
return 0;
}
+
+/*
+These functions are implemented and replaced by the 'common/time.c' file
+int _gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp);
+_CLOCK_T_ _times_r(struct _reent *ptr, struct tms *ptms);
+*/
diff --git a/components/libc/compilers/newlib/time.c b/components/libc/compilers/newlib/time.c
deleted file mode 100644
index f099d51330..0000000000
--- a/components/libc/compilers/newlib/time.c
+++ /dev/null
@@ -1,82 +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");
- 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;
- }
-
- return time;
-}
-#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();
-}