From 8b17d53da73289a368a47f798a9275aea3e50d86 Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Mon, 27 Sep 2021 14:43:31 -0400 Subject: [libc]新建gcc文件夹,将newlib和partical文件夹并入 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/ls1bdev/Kconfig | 4 - bsp/ls1cdev/Kconfig | 4 - bsp/ls2kdev/Kconfig | 4 - .../libc/compilers/common/partial/SConscript | 15 - .../libc/compilers/common/partial/ls/SConscript | 23 -- .../libc/compilers/common/partial/ls/readme.md | 9 - .../libc/compilers/common/partial/ls/sys/select.h | 52 ---- components/libc/compilers/gcc/SConscript | 15 + components/libc/compilers/gcc/newlib/README.md | 10 + components/libc/compilers/gcc/newlib/SConscript | 28 ++ components/libc/compilers/gcc/newlib/libc.c | 50 +++ components/libc/compilers/gcc/newlib/libc.h | 28 ++ components/libc/compilers/gcc/newlib/libc_syms.c | 52 ++++ .../libc/compilers/gcc/newlib/machine/time.h | 12 + components/libc/compilers/gcc/newlib/stdio.c | 80 +++++ components/libc/compilers/gcc/newlib/syscalls.c | 341 ++++++++++++++++++++ components/libc/compilers/gcc/partial/SConscript | 15 + .../libc/compilers/gcc/partial/mips/SConscript | 20 ++ .../libc/compilers/gcc/partial/mips/readme.md | 4 + .../libc/compilers/gcc/partial/mips/sys/select.h | 52 ++++ components/libc/compilers/gcc/partial/readme.md | 2 + components/libc/compilers/newlib/README.md | 9 - components/libc/compilers/newlib/SConscript | 28 -- components/libc/compilers/newlib/libc.c | 50 --- components/libc/compilers/newlib/libc.h | 28 -- components/libc/compilers/newlib/libc_syms.c | 52 ---- components/libc/compilers/newlib/machine/time.h | 12 - components/libc/compilers/newlib/stdio.c | 80 ----- components/libc/compilers/newlib/syscalls.c | 344 --------------------- 29 files changed, 709 insertions(+), 714 deletions(-) delete mode 100644 components/libc/compilers/common/partial/SConscript delete mode 100644 components/libc/compilers/common/partial/ls/SConscript delete mode 100644 components/libc/compilers/common/partial/ls/readme.md delete mode 100644 components/libc/compilers/common/partial/ls/sys/select.h create mode 100644 components/libc/compilers/gcc/SConscript create mode 100644 components/libc/compilers/gcc/newlib/README.md create mode 100644 components/libc/compilers/gcc/newlib/SConscript create mode 100644 components/libc/compilers/gcc/newlib/libc.c create mode 100644 components/libc/compilers/gcc/newlib/libc.h create mode 100644 components/libc/compilers/gcc/newlib/libc_syms.c create mode 100644 components/libc/compilers/gcc/newlib/machine/time.h create mode 100644 components/libc/compilers/gcc/newlib/stdio.c create mode 100644 components/libc/compilers/gcc/newlib/syscalls.c create mode 100644 components/libc/compilers/gcc/partial/SConscript create mode 100644 components/libc/compilers/gcc/partial/mips/SConscript create mode 100644 components/libc/compilers/gcc/partial/mips/readme.md create mode 100644 components/libc/compilers/gcc/partial/mips/sys/select.h create mode 100644 components/libc/compilers/gcc/partial/readme.md delete mode 100644 components/libc/compilers/newlib/README.md delete mode 100644 components/libc/compilers/newlib/SConscript delete mode 100644 components/libc/compilers/newlib/libc.c delete mode 100644 components/libc/compilers/newlib/libc.h delete mode 100644 components/libc/compilers/newlib/libc_syms.c delete mode 100644 components/libc/compilers/newlib/machine/time.h delete mode 100644 components/libc/compilers/newlib/stdio.c delete mode 100644 components/libc/compilers/newlib/syscalls.c diff --git a/bsp/ls1bdev/Kconfig b/bsp/ls1bdev/Kconfig index c9196af29d..b02aee337a 100644 --- a/bsp/ls1bdev/Kconfig +++ b/bsp/ls1bdev/Kconfig @@ -18,10 +18,6 @@ config PKGS_DIR source "$RTT_DIR/Kconfig" source "$PKGS_DIR/Kconfig" -config SOC_LS - bool - default y - config SOC_LS1B bool select RT_USING_COMPONENTS_INIT diff --git a/bsp/ls1cdev/Kconfig b/bsp/ls1cdev/Kconfig index 59f7c43323..3fb6e3bbdf 100644 --- a/bsp/ls1cdev/Kconfig +++ b/bsp/ls1cdev/Kconfig @@ -19,10 +19,6 @@ source "$RTT_DIR/Kconfig" source "$RTT_DIR/libcpu/mips/common/Kconfig" source "$PKGS_DIR/Kconfig" -config SOC_LS - bool - default y - config SOC_LS1C300 bool select RT_USING_COMPONENTS_INIT diff --git a/bsp/ls2kdev/Kconfig b/bsp/ls2kdev/Kconfig index 57dd99e53a..fc2dfe1328 100644 --- a/bsp/ls2kdev/Kconfig +++ b/bsp/ls2kdev/Kconfig @@ -22,10 +22,6 @@ source "$RTT_DIR/Kconfig" source "$RTT_DIR/libcpu/mips/common/Kconfig" source "$PKGS_DIR/Kconfig" -config SOC_LS - bool - default y - config SOC_LS2K1000 bool select ARCH_MIPS64 diff --git a/components/libc/compilers/common/partial/SConscript b/components/libc/compilers/common/partial/SConscript deleted file mode 100644 index 4c815c49b8..0000000000 --- a/components/libc/compilers/common/partial/SConscript +++ /dev/null @@ -1,15 +0,0 @@ -# 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/partial/ls/SConscript b/components/libc/compilers/common/partial/ls/SConscript deleted file mode 100644 index 2665bee078..0000000000 --- a/components/libc/compilers/common/partial/ls/SConscript +++ /dev/null @@ -1,23 +0,0 @@ -from shutil import copy -from building import * - -Import('rtconfig') - -src = [] -cwd = GetCurrentDir() -CPPPATH = [cwd] -group = [] - -if rtconfig.PLATFORM == 'gcc' and GetDepend('SOC_LS'): - try: - # There is no 'sys/select.h' in these bsp's gcc toolchain; thus, we need to copy this file from 'nogcc/sys/select.h' - copy("../../nogcc/sys/select.h", "./sys/select.h") - except: - pass - - if GetDepend('RT_USING_LIBC'): - src += Glob('*.c') - - group = DefineGroup('libc', src, depend = [], CPPPATH = CPPPATH) - -Return('group') diff --git a/components/libc/compilers/common/partial/ls/readme.md b/components/libc/compilers/common/partial/ls/readme.md deleted file mode 100644 index fa68e1e84a..0000000000 --- a/components/libc/compilers/common/partial/ls/readme.md +++ /dev/null @@ -1,9 +0,0 @@ -This folder will be included when compiling the BSPs as follow: - -- ls1bdev -- ls1cdev -- ls2kdev - -These files will be generated by scons automatically , and **DO NOT** change them: - -- sys/select.h \ No newline at end of file diff --git a/components/libc/compilers/common/partial/ls/sys/select.h b/components/libc/compilers/common/partial/ls/sys/select.h deleted file mode 100644 index 575ad3a1b5..0000000000 --- a/components/libc/compilers/common/partial/ls/sys/select.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-07-21 Meco Man The first version - */ - -#ifndef __SYS_SELECT_H__ -#define __SYS_SELECT_H__ - -#include -#include -#include - -#ifndef FD_SETSIZE -#define FD_SETSIZE 32 -#endif - -#ifdef SAL_USING_POSIX -#ifdef FD_SETSIZE -#undef FD_SETSIZE -#endif -#define FD_SETSIZE DFS_FD_MAX -#endif /* SAL_USING_POSIX */ - -#define NBBY 8 /* number of bits in a byte */ - -typedef long fd_mask; - -#define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ -#ifndef howmany -#define howmany(x,y) (((x)+((y)-1))/(y)) -#endif - -#ifndef _SYS_TYPES_FD_SET /* MIPS */ -typedef struct _types_fd_set { - fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; -} _types_fd_set; -#define fd_set _types_fd_set - -#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS))) -#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS))) -#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS))) -#define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p))) -#endif /* _SYS_TYPES_FD_SET */ - -int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); - -#endif /* __SYS_SELECT_H__ */ diff --git a/components/libc/compilers/gcc/SConscript b/components/libc/compilers/gcc/SConscript new file mode 100644 index 0000000000..4c815c49b8 --- /dev/null +++ b/components/libc/compilers/gcc/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/gcc/newlib/README.md b/components/libc/compilers/gcc/newlib/README.md new file mode 100644 index 0000000000..62172e6a55 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/README.md @@ -0,0 +1,10 @@ +# 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 + diff --git a/components/libc/compilers/gcc/newlib/SConscript b/components/libc/compilers/gcc/newlib/SConscript new file mode 100644 index 0000000000..cef546e17c --- /dev/null +++ b/components/libc/compilers/gcc/newlib/SConscript @@ -0,0 +1,28 @@ +from building import * +Import('rtconfig') + +src = [] +cwd = GetCurrentDir() +group = [] +LIBS = [] +CPPDEFINES = [] +CPPPATH = [cwd] + +if rtconfig.PLATFORM == 'gcc': + if GetDepend('RT_USING_LIBC'): + CPPDEFINES += ['RT_USING_NEWLIB'] + # link with libc and libm: + # libm is a frequently used lib. Newlib is compiled with -ffunction-sections in + # recent GCC tool chains. The linker would just link in the functions that have + # been referenced. So setting this won't result in bigger text size. + LIBS += ['c', 'm'] + + src += Glob('*.c') + if GetDepend('RT_USING_MODULE') == False: + SrcRemove(src, ['libc_syms.c']) + else: + src += ['syscalls.c'] + + group = DefineGroup('libc', src, depend = [], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS) + +Return('group') diff --git a/components/libc/compilers/gcc/newlib/libc.c b/components/libc/compilers/gcc/newlib/libc.c new file mode 100644 index 0000000000..9834a9a015 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/libc.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#include +#include +#include +#include +#include + +#include "libc.h" + +#ifdef RT_USING_PTHREADS +#include +#endif + +int _EXFUN(putenv,(char *__string)); + +int libc_system_init(void) +{ +#if defined(RT_USING_DFS) & defined(RT_USING_DFS_DEVFS) & defined(RT_USING_CONSOLE) + rt_device_t dev_console; + + dev_console = rt_console_get_device(); + if (dev_console) + { + #if defined(RT_USING_POSIX) + libc_stdio_set_console(dev_console->parent.name, O_RDWR); + #else + libc_stdio_set_console(dev_console->parent.name, O_WRONLY); + #endif + } + + /* set PATH and HOME */ + putenv("PATH=/bin"); + putenv("HOME=/home"); +#endif + +#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT + pthread_system_init(); +#endif + + return 0; +} +INIT_COMPONENT_EXPORT(libc_system_init); diff --git a/components/libc/compilers/gcc/newlib/libc.h b/components/libc/compilers/gcc/newlib/libc.h new file mode 100644 index 0000000000..c470698aa6 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/libc.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#ifndef __RTT_LIBC_H__ +#define __RTT_LIBC_H__ + +#ifndef _EXFUN +#define _EXFUN(name, proto) name proto +#endif + +#ifdef __cplusplus +extern "C" { +#endif +int libc_system_init(void); +int libc_stdio_get_console(void); +int libc_stdio_set_console(const char* device_name, int mode); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/libc/compilers/gcc/newlib/libc_syms.c b/components/libc/compilers/gcc/newlib/libc_syms.c new file mode 100644 index 0000000000..aaf6980d6b --- /dev/null +++ b/components/libc/compilers/gcc/newlib/libc_syms.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#include +#include + +#include +#include +#include + +RTM_EXPORT(strcpy); +RTM_EXPORT(strncpy); +RTM_EXPORT(strlen); +RTM_EXPORT(strcat); +RTM_EXPORT(strstr); +RTM_EXPORT(strchr); +RTM_EXPORT(strcmp); +RTM_EXPORT(strtol); +RTM_EXPORT(strtoul); +RTM_EXPORT(strncmp); + +RTM_EXPORT(memcpy); +RTM_EXPORT(memcmp); +RTM_EXPORT(memmove); +RTM_EXPORT(memset); +RTM_EXPORT(memchr); + +RTM_EXPORT(putchar); +RTM_EXPORT(puts); +RTM_EXPORT(printf); +RTM_EXPORT(sprintf); +RTM_EXPORT(snprintf); + +RTM_EXPORT(fwrite); + +#include +RTM_EXPORT(longjmp); +RTM_EXPORT(setjmp); + +RTM_EXPORT(exit); +RTM_EXPORT(abort); + +RTM_EXPORT(rand); + +#include +RTM_EXPORT(__assert_func); diff --git a/components/libc/compilers/gcc/newlib/machine/time.h b/components/libc/compilers/gcc/newlib/machine/time.h new file mode 100644 index 0000000000..ff754d2473 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/machine/time.h @@ -0,0 +1,12 @@ +#ifndef _MACHTIME_H_ +#define _MACHTIME_H_ + +#include +#define _CLOCKS_PER_SEC_ RT_TICK_PER_SECOND + +#ifdef __SPU__ +#include +int nanosleep (const struct timespec *, struct timespec *); +#endif + +#endif /* _MACHTIME_H_ */ diff --git a/components/libc/compilers/gcc/newlib/stdio.c b/components/libc/compilers/gcc/newlib/stdio.c new file mode 100644 index 0000000000..baccafad87 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/stdio.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#include +#include +#include +#include +#include "libc.h" + +#define STDIO_DEVICE_NAME_MAX 32 + +int _EXFUN(fileno, (FILE *)); + +static FILE* std_console = NULL; + +int libc_stdio_set_console(const char* device_name, int mode) +{ + FILE *fp; + char name[STDIO_DEVICE_NAME_MAX]; + char *file_mode; + + snprintf(name, sizeof(name) - 1, "/dev/%s", device_name); + name[STDIO_DEVICE_NAME_MAX - 1] = '\0'; + + if (mode == O_RDWR) file_mode = "r+"; + else if (mode == O_WRONLY) file_mode = "wb"; + else file_mode = "rb"; + + fp = fopen(name, file_mode); + if (fp) + { + setvbuf(fp, NULL, _IONBF, 0); + + if (std_console) + { + fclose(std_console); + std_console = NULL; + } + std_console = fp; + + if (mode == O_RDWR) + { + _GLOBAL_REENT->_stdin = std_console; + } + else + { + _GLOBAL_REENT->_stdin = NULL; + } + + if (mode == O_RDONLY) + { + _GLOBAL_REENT->_stdout = NULL; + _GLOBAL_REENT->_stderr = NULL; + } + else + { + _GLOBAL_REENT->_stdout = std_console; + _GLOBAL_REENT->_stderr = std_console; + } + + _GLOBAL_REENT->__sdidinit = 1; + } + + if (std_console) return fileno(std_console); + + return -1; +} + +int libc_stdio_get_console(void) { + if (std_console) + return fileno(std_console); + else + return -1; +} diff --git a/components/libc/compilers/gcc/newlib/syscalls.c b/components/libc/compilers/gcc/newlib/syscalls.c new file mode 100644 index 0000000000..8b7ff9efdb --- /dev/null +++ b/components/libc/compilers/gcc/newlib/syscalls.c @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 +#include +#include +#include +#include + +#define DBG_TAG "newlib.syscalls" +#define DBG_LVL DBG_INFO +#include + +#ifdef RT_USING_HEAP /* Memory routine */ +void *_malloc_r (struct _reent *ptr, size_t size) +{ + void* result; + + result = (void*)rt_malloc (size); + if (result == RT_NULL) + { + ptr->_errno = ENOMEM; + } + + return result; +} + +void *_realloc_r (struct _reent *ptr, void *old, size_t newlen) +{ + void* result; + + result = (void*)rt_realloc (old, newlen); + if (result == RT_NULL) + { + ptr->_errno = ENOMEM; + } + + return result; +} + +void *_calloc_r (struct _reent *ptr, size_t size, size_t len) +{ + void* result; + + result = (void*)rt_calloc (size, len); + if (result == RT_NULL) + { + ptr->_errno = ENOMEM; + } + + return result; +} + +void _free_r (struct _reent *ptr, void *addr) +{ + rt_free (addr); +} + +#else +void * +_sbrk_r(struct _reent *ptr, ptrdiff_t incr) +{ + LOG_E("Please enable RT_USING_HEAP or RT_USING_LIBC"); + RT_ASSERT(0); + return RT_NULL; +} +#endif /*RT_USING_HEAP*/ + +void __libc_init_array(void) +{ + /* we not use __libc init_aray to initialize C++ objects */ + /* __libc_init_array is ARM code, not Thumb; it will cause a hardfault. */ +} + +#ifdef RT_USING_LIBC +#include +#include +#include "libc.h" +#ifdef RT_USING_DFS +#include +#endif +#ifdef RT_USING_MODULE +#include +#endif + +/* Reentrant versions of system calls. */ + +#ifndef _REENT_ONLY +int *__errno () +{ + return _rt_errno(); +} +#endif + +int _getpid_r(struct _reent *ptr) +{ + return 0; +} + +int _close_r(struct _reent *ptr, int fd) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + return close(fd); +#endif +} + +int _execve_r(struct _reent *ptr, const char * name, char *const *argv, char *const *env) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _fcntl_r(struct _reent *ptr, int fd, int cmd, int arg) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _fork_r(struct _reent *ptr) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _fstat_r(struct _reent *ptr, int fd, struct stat *pstat) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _isatty_r(struct _reent *ptr, int fd) +{ + if (fd >=0 && fd < 3) + { + return 1; + } + else + { + return 0; + } +} + +int _kill_r(struct _reent *ptr, int pid, int sig) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _link_r(struct _reent *ptr, const char *old, const char *new) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +_off_t _lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + _off_t rc; + + rc = lseek(fd, pos, whence); + return rc; +#endif +} + +int _mkdir_r(struct _reent *ptr, const char *name, int mode) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = mkdir(name, mode); + return rc; +#endif +} + +int _open_r(struct _reent *ptr, const char *file, int flags, int mode) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = open(file, flags, mode); + return rc; +#endif +} + +_ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + _ssize_t rc; + if (libc_stdio_get_console() < 0 && fd == STDIN_FILENO) + { + LOG_W("Do not invoke standard input before initializing libc"); + return 0; + } + rc = read(fd, buf, nbytes); + return rc; +#endif +} + +int _rename_r(struct _reent *ptr, const char *old, const char *new) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = rename(old, new); + return rc; +#endif +} + +int _stat_r(struct _reent *ptr, const char *file, struct stat *pstat) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = stat(file, pstat); + return rc; +#endif +} + +int _unlink_r(struct _reent *ptr, const char *file) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + return unlink(file); +#endif +} + +int _wait_r(struct _reent *ptr, int *status) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes) +{ +#ifndef RT_USING_DFS +#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) + if (STDOUT_FILENO == fd) + { + rt_device_t console; + + console = rt_console_get_device(); + if (console) return rt_device_write(console, -1, buf, nbytes); + } + + return 0; +#else + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#endif /*RT_USING_DEVICE*/ +#else + _ssize_t rc; + if (libc_stdio_get_console() < 0 && fd == STDOUT_FILENO) + { + LOG_W("Do not invoke standard output before initializing libc"); + return 0; + } + rc = write(fd, buf, nbytes); + return rc; +#endif +} + +void _system(const char *s) +{ + extern int __rt_libc_system(const char *string); + __rt_libc_system(s); +} + +/* for exit() and abort() */ +__attribute__ ((noreturn)) void _exit (int status) +{ + extern void __rt_libc_exit(int status); + __rt_libc_exit(status); + while(1); +} + +mode_t umask(mode_t mask) +{ + return 022; +} + +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); +*/ + +#endif /* RT_USING_LIBC */ diff --git a/components/libc/compilers/gcc/partial/SConscript b/components/libc/compilers/gcc/partial/SConscript new file mode 100644 index 0000000000..4c815c49b8 --- /dev/null +++ b/components/libc/compilers/gcc/partial/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/gcc/partial/mips/SConscript b/components/libc/compilers/gcc/partial/mips/SConscript new file mode 100644 index 0000000000..7651233d46 --- /dev/null +++ b/components/libc/compilers/gcc/partial/mips/SConscript @@ -0,0 +1,20 @@ +from shutil import copy +from building import * + +Import('rtconfig') + +src = [] +cwd = GetCurrentDir() +CPPPATH = [cwd] +group = [] + +if rtconfig.PLATFORM == 'gcc' and ('mips' in rtconfig.PREFIX): # identify mips gcc tool chain + try: + # There is no 'sys/select.h' in tthe mips gcc toolchain; it will be copied from 'nogcc/sys/select.h' + copy("../../../common/nogcc/sys/select.h", "./sys/select.h") + except: + pass + + group = DefineGroup('libc', src, depend = [], CPPPATH = CPPPATH) + +Return('group') diff --git a/components/libc/compilers/gcc/partial/mips/readme.md b/components/libc/compilers/gcc/partial/mips/readme.md new file mode 100644 index 0000000000..a3eeb06c5d --- /dev/null +++ b/components/libc/compilers/gcc/partial/mips/readme.md @@ -0,0 +1,4 @@ +These files don't exist in the mips gcc toolchain. They will be generated by scons automatically , and **DO NOT** change them: + +- sys/select.h + diff --git a/components/libc/compilers/gcc/partial/mips/sys/select.h b/components/libc/compilers/gcc/partial/mips/sys/select.h new file mode 100644 index 0000000000..575ad3a1b5 --- /dev/null +++ b/components/libc/compilers/gcc/partial/mips/sys/select.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-07-21 Meco Man The first version + */ + +#ifndef __SYS_SELECT_H__ +#define __SYS_SELECT_H__ + +#include +#include +#include + +#ifndef FD_SETSIZE +#define FD_SETSIZE 32 +#endif + +#ifdef SAL_USING_POSIX +#ifdef FD_SETSIZE +#undef FD_SETSIZE +#endif +#define FD_SETSIZE DFS_FD_MAX +#endif /* SAL_USING_POSIX */ + +#define NBBY 8 /* number of bits in a byte */ + +typedef long fd_mask; + +#define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ +#ifndef howmany +#define howmany(x,y) (((x)+((y)-1))/(y)) +#endif + +#ifndef _SYS_TYPES_FD_SET /* MIPS */ +typedef struct _types_fd_set { + fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} _types_fd_set; +#define fd_set _types_fd_set + +#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS))) +#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS))) +#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS))) +#define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p))) +#endif /* _SYS_TYPES_FD_SET */ + +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); + +#endif /* __SYS_SELECT_H__ */ diff --git a/components/libc/compilers/gcc/partial/readme.md b/components/libc/compilers/gcc/partial/readme.md new file mode 100644 index 0000000000..959fc29f35 --- /dev/null +++ b/components/libc/compilers/gcc/partial/readme.md @@ -0,0 +1,2 @@ +This folder is for some particular targets. + diff --git a/components/libc/compilers/newlib/README.md b/components/libc/compilers/newlib/README.md deleted file mode 100644 index 385f329a4f..0000000000 --- a/components/libc/compilers/newlib/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# 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 deleted file mode 100644 index cef546e17c..0000000000 --- a/components/libc/compilers/newlib/SConscript +++ /dev/null @@ -1,28 +0,0 @@ -from building import * -Import('rtconfig') - -src = [] -cwd = GetCurrentDir() -group = [] -LIBS = [] -CPPDEFINES = [] -CPPPATH = [cwd] - -if rtconfig.PLATFORM == 'gcc': - if GetDepend('RT_USING_LIBC'): - CPPDEFINES += ['RT_USING_NEWLIB'] - # link with libc and libm: - # libm is a frequently used lib. Newlib is compiled with -ffunction-sections in - # recent GCC tool chains. The linker would just link in the functions that have - # been referenced. So setting this won't result in bigger text size. - LIBS += ['c', 'm'] - - src += Glob('*.c') - if GetDepend('RT_USING_MODULE') == False: - SrcRemove(src, ['libc_syms.c']) - else: - src += ['syscalls.c'] - - group = DefineGroup('libc', src, depend = [], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS) - -Return('group') diff --git a/components/libc/compilers/newlib/libc.c b/components/libc/compilers/newlib/libc.c deleted file mode 100644 index 9834a9a015..0000000000 --- a/components/libc/compilers/newlib/libc.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017/10/15 bernard the first version - */ -#include -#include -#include -#include -#include - -#include "libc.h" - -#ifdef RT_USING_PTHREADS -#include -#endif - -int _EXFUN(putenv,(char *__string)); - -int libc_system_init(void) -{ -#if defined(RT_USING_DFS) & defined(RT_USING_DFS_DEVFS) & defined(RT_USING_CONSOLE) - rt_device_t dev_console; - - dev_console = rt_console_get_device(); - if (dev_console) - { - #if defined(RT_USING_POSIX) - libc_stdio_set_console(dev_console->parent.name, O_RDWR); - #else - libc_stdio_set_console(dev_console->parent.name, O_WRONLY); - #endif - } - - /* set PATH and HOME */ - putenv("PATH=/bin"); - putenv("HOME=/home"); -#endif - -#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT - pthread_system_init(); -#endif - - return 0; -} -INIT_COMPONENT_EXPORT(libc_system_init); diff --git a/components/libc/compilers/newlib/libc.h b/components/libc/compilers/newlib/libc.h deleted file mode 100644 index c470698aa6..0000000000 --- a/components/libc/compilers/newlib/libc.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017/10/15 bernard the first version - */ -#ifndef __RTT_LIBC_H__ -#define __RTT_LIBC_H__ - -#ifndef _EXFUN -#define _EXFUN(name, proto) name proto -#endif - -#ifdef __cplusplus -extern "C" { -#endif -int libc_system_init(void); -int libc_stdio_get_console(void); -int libc_stdio_set_console(const char* device_name, int mode); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/components/libc/compilers/newlib/libc_syms.c b/components/libc/compilers/newlib/libc_syms.c deleted file mode 100644 index aaf6980d6b..0000000000 --- a/components/libc/compilers/newlib/libc_syms.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017/10/15 bernard the first version - */ -#include -#include - -#include -#include -#include - -RTM_EXPORT(strcpy); -RTM_EXPORT(strncpy); -RTM_EXPORT(strlen); -RTM_EXPORT(strcat); -RTM_EXPORT(strstr); -RTM_EXPORT(strchr); -RTM_EXPORT(strcmp); -RTM_EXPORT(strtol); -RTM_EXPORT(strtoul); -RTM_EXPORT(strncmp); - -RTM_EXPORT(memcpy); -RTM_EXPORT(memcmp); -RTM_EXPORT(memmove); -RTM_EXPORT(memset); -RTM_EXPORT(memchr); - -RTM_EXPORT(putchar); -RTM_EXPORT(puts); -RTM_EXPORT(printf); -RTM_EXPORT(sprintf); -RTM_EXPORT(snprintf); - -RTM_EXPORT(fwrite); - -#include -RTM_EXPORT(longjmp); -RTM_EXPORT(setjmp); - -RTM_EXPORT(exit); -RTM_EXPORT(abort); - -RTM_EXPORT(rand); - -#include -RTM_EXPORT(__assert_func); diff --git a/components/libc/compilers/newlib/machine/time.h b/components/libc/compilers/newlib/machine/time.h deleted file mode 100644 index ff754d2473..0000000000 --- a/components/libc/compilers/newlib/machine/time.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _MACHTIME_H_ -#define _MACHTIME_H_ - -#include -#define _CLOCKS_PER_SEC_ RT_TICK_PER_SECOND - -#ifdef __SPU__ -#include -int nanosleep (const struct timespec *, struct timespec *); -#endif - -#endif /* _MACHTIME_H_ */ diff --git a/components/libc/compilers/newlib/stdio.c b/components/libc/compilers/newlib/stdio.c deleted file mode 100644 index baccafad87..0000000000 --- a/components/libc/compilers/newlib/stdio.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017/10/15 bernard the first version - */ -#include -#include -#include -#include -#include "libc.h" - -#define STDIO_DEVICE_NAME_MAX 32 - -int _EXFUN(fileno, (FILE *)); - -static FILE* std_console = NULL; - -int libc_stdio_set_console(const char* device_name, int mode) -{ - FILE *fp; - char name[STDIO_DEVICE_NAME_MAX]; - char *file_mode; - - snprintf(name, sizeof(name) - 1, "/dev/%s", device_name); - name[STDIO_DEVICE_NAME_MAX - 1] = '\0'; - - if (mode == O_RDWR) file_mode = "r+"; - else if (mode == O_WRONLY) file_mode = "wb"; - else file_mode = "rb"; - - fp = fopen(name, file_mode); - if (fp) - { - setvbuf(fp, NULL, _IONBF, 0); - - if (std_console) - { - fclose(std_console); - std_console = NULL; - } - std_console = fp; - - if (mode == O_RDWR) - { - _GLOBAL_REENT->_stdin = std_console; - } - else - { - _GLOBAL_REENT->_stdin = NULL; - } - - if (mode == O_RDONLY) - { - _GLOBAL_REENT->_stdout = NULL; - _GLOBAL_REENT->_stderr = NULL; - } - else - { - _GLOBAL_REENT->_stdout = std_console; - _GLOBAL_REENT->_stderr = std_console; - } - - _GLOBAL_REENT->__sdidinit = 1; - } - - if (std_console) return fileno(std_console); - - return -1; -} - -int libc_stdio_get_console(void) { - if (std_console) - return fileno(std_console); - else - return -1; -} diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c deleted file mode 100644 index 4c1dc82ad3..0000000000 --- a/components/libc/compilers/newlib/syscalls.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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 -#include -#include -#include -#include - -#define DBG_TAG "newlib.syscalls" -#define DBG_LVL DBG_INFO -#include - -#ifdef RT_USING_HEAP /* Memory routine */ -void *_malloc_r (struct _reent *ptr, size_t size) -{ - void* result; - - result = (void*)rt_malloc (size); - if (result == RT_NULL) - { - ptr->_errno = ENOMEM; - } - - return result; -} - -void *_realloc_r (struct _reent *ptr, void *old, size_t newlen) -{ - void* result; - - result = (void*)rt_realloc (old, newlen); - if (result == RT_NULL) - { - ptr->_errno = ENOMEM; - } - - return result; -} - -void *_calloc_r (struct _reent *ptr, size_t size, size_t len) -{ - void* result; - - result = (void*)rt_calloc (size, len); - if (result == RT_NULL) - { - ptr->_errno = ENOMEM; - } - - return result; -} - -void _free_r (struct _reent *ptr, void *addr) -{ - rt_free (addr); -} - -#else -void * -_sbrk_r(struct _reent *ptr, ptrdiff_t incr) -{ - LOG_E("Please enable RT_USING_HEAP or RT_USING_LIBC"); - RT_ASSERT(0); - return RT_NULL; -} -#endif /*RT_USING_HEAP*/ - -void __libc_init_array(void) -{ - /* we not use __libc init_aray to initialize C++ objects */ - /* __libc_init_array is ARM code, not Thumb; it will cause a hardfault. */ -} - -#ifdef RT_USING_LIBC -#include -#include -#ifdef RT_USING_DFS -#include -#endif -#ifdef RT_USING_MODULE -#include -#endif - -#define DBG_TAG "newlib.syscalls" -#define DBG_LVL DBG_INFO -#include - -/* Reentrant versions of system calls. */ - -#ifndef _REENT_ONLY -int *__errno () -{ - return _rt_errno(); -} -#endif - -int _getpid_r(struct _reent *ptr) -{ - return 0; -} - -int _close_r(struct _reent *ptr, int fd) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - return close(fd); -#endif -} - -int _execve_r(struct _reent *ptr, const char * name, char *const *argv, char *const *env) -{ - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -} - -int _fcntl_r(struct _reent *ptr, int fd, int cmd, int arg) -{ - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -} - -int _fork_r(struct _reent *ptr) -{ - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -} - -int _fstat_r(struct _reent *ptr, int fd, struct stat *pstat) -{ - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -} - -int _isatty_r(struct _reent *ptr, int fd) -{ - if (fd >=0 && fd < 3) - { - return 1; - } - else - { - return 0; - } -} - -int _kill_r(struct _reent *ptr, int pid, int sig) -{ - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -} - -int _link_r(struct _reent *ptr, const char *old, const char *new) -{ - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -} - -_off_t _lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - _off_t rc; - - rc = lseek(fd, pos, whence); - return rc; -#endif -} - -int _mkdir_r(struct _reent *ptr, const char *name, int mode) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - int rc; - - rc = mkdir(name, mode); - return rc; -#endif -} - -int _open_r(struct _reent *ptr, const char *file, int flags, int mode) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - int rc; - - rc = open(file, flags, mode); - return rc; -#endif -} - -_ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - _ssize_t rc; - if (libc_stdio_get_console() < 0 && fd == STDIN_FILENO) - { - LOG_W("Do not invoke standard input before initializing libc"); - return 0; - } - rc = read(fd, buf, nbytes); - return rc; -#endif -} - -int _rename_r(struct _reent *ptr, const char *old, const char *new) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - int rc; - - rc = rename(old, new); - return rc; -#endif -} - -int _stat_r(struct _reent *ptr, const char *file, struct stat *pstat) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - int rc; - - rc = stat(file, pstat); - return rc; -#endif -} - -int _unlink_r(struct _reent *ptr, const char *file) -{ -#ifndef RT_USING_DFS - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#else - return unlink(file); -#endif -} - -int _wait_r(struct _reent *ptr, int *status) -{ - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -} - -_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes) -{ -#ifndef RT_USING_DFS -#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) - if (STDOUT_FILENO == fd) - { - rt_device_t console; - - console = rt_console_get_device(); - if (console) return rt_device_write(console, -1, buf, nbytes); - } - - return 0; -#else - /* return "not supported" */ - ptr->_errno = ENOTSUP; - return -1; -#endif /*RT_USING_DEVICE*/ -#else - _ssize_t rc; - if (libc_stdio_get_console() < 0 && fd == STDOUT_FILENO) - { - LOG_W("Do not invoke standard output before initializing libc"); - return 0; - } - rc = write(fd, buf, nbytes); - return rc; -#endif -} - -void _system(const char *s) -{ - extern int __rt_libc_system(const char *string); - __rt_libc_system(s); -} - -/* for exit() and abort() */ -__attribute__ ((noreturn)) void _exit (int status) -{ - extern void __rt_libc_exit(int status); - __rt_libc_exit(status); - while(1); -} - -mode_t umask(mode_t mask) -{ - return 022; -} - -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); -*/ - -#endif /* RT_USING_LIBC */ -- cgit v1.3.1 From c80688126a013c53334464799e28fcf2e4f4fb8c Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Mon, 27 Sep 2021 22:20:21 -0400 Subject: [libc] 优化system 支持gcc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/finsh/msh.c | 15 --------------- components/libc/compilers/armlibc/syscalls.c | 10 ---------- components/libc/compilers/common/stdlib.c | 20 +++++++++++++++----- components/libc/compilers/dlib/syscalls.c | 7 ------- components/libc/compilers/gcc/newlib/syscalls.c | 6 ------ 5 files changed, 15 insertions(+), 43 deletions(-) diff --git a/components/finsh/msh.c b/components/finsh/msh.c index 86985c561c..18182ca264 100644 --- a/components/finsh/msh.c +++ b/components/finsh/msh.c @@ -257,21 +257,6 @@ int msh_exec_module(const char *cmd_line, int size) rt_free(pg_name); return ret; } - -int system(const char *command) -{ - int ret = -RT_ENOMEM; - char *cmd = rt_strdup(command); - - if (cmd) - { - ret = msh_exec(cmd, rt_strlen(cmd)); - rt_free(cmd); - } - - return ret; -} -RTM_EXPORT(system); #endif /* defined(RT_USING_MODULE) && defined(RT_USING_DFS) */ static int _msh_exec_cmd(char *cmd, rt_size_t length, int *retp) diff --git a/components/libc/compilers/armlibc/syscalls.c b/components/libc/compilers/armlibc/syscalls.c index 7d8ec2e8b4..3b1627d82a 100644 --- a/components/libc/compilers/armlibc/syscalls.c +++ b/components/libc/compilers/armlibc/syscalls.c @@ -319,16 +319,6 @@ int remove(const char *filename) #endif } -#if defined(RT_USING_FINSH) && defined(RT_USING_MODULE) && defined(RT_USING_DFS) -/* use system(const char *string) implementation in the msh */ -#else -int system(const char *string) -{ - extern int __rt_libc_system(const char *string); - return __rt_libc_system(string); -} -#endif - #ifdef __MICROLIB #include diff --git a/components/libc/compilers/common/stdlib.c b/components/libc/compilers/common/stdlib.c index 16a13afb83..6cc0b9fdac 100644 --- a/components/libc/compilers/common/stdlib.c +++ b/components/libc/compilers/common/stdlib.c @@ -25,11 +25,21 @@ void __rt_libc_exit(int status) } } -int __rt_libc_system(const char *string) -{ #ifdef RT_USING_MSH +int system(const char *command) +{ extern int msh_exec(char *cmd, rt_size_t length); - msh_exec((char*)string, rt_strlen(string)); -#endif - return 0; + + int ret = -RT_ENOMEM; + char *cmd = rt_strdup(command); + + if (cmd) + { + ret = msh_exec(cmd, rt_strlen(cmd)); + rt_free(cmd); + } + + return ret; } +RTM_EXPORT(system); +#endif diff --git a/components/libc/compilers/dlib/syscalls.c b/components/libc/compilers/dlib/syscalls.c index e1c9562b3a..1ee6a3bc12 100644 --- a/components/libc/compilers/dlib/syscalls.c +++ b/components/libc/compilers/dlib/syscalls.c @@ -6,7 +6,6 @@ * Change Logs: * Date Author Notes * 2021-02-13 Meco Man implement exit() and abort() - * 2021-02-20 Meco Man add system() */ #include @@ -17,9 +16,3 @@ void __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/gcc/newlib/syscalls.c b/components/libc/compilers/gcc/newlib/syscalls.c index 8b7ff9efdb..f5a2c16ecc 100644 --- a/components/libc/compilers/gcc/newlib/syscalls.c +++ b/components/libc/compilers/gcc/newlib/syscalls.c @@ -308,12 +308,6 @@ _ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes) #endif } -void _system(const char *s) -{ - extern int __rt_libc_system(const char *string); - __rt_libc_system(s); -} - /* for exit() and abort() */ __attribute__ ((noreturn)) void _exit (int status) { -- cgit v1.3.1