From 25bd908fb7ea04e0e9218597b10f75814bf77a4f Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Wed, 27 Oct 2021 02:52:04 -0400 Subject: [PATCH] =?UTF-8?q?[libc][posix]=20=E8=A7=A3=E5=86=B3RT=5FLIBC=5FU?= =?UTF-8?q?SING=5FFILEIO=E8=8C=83=E5=9B=B4=E8=BF=87=E5=A4=A7=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/lm3s8962/applications/startup.c | 2 +- components/dfs/src/dfs.c | 8 +-- components/finsh/shell.c | 18 +++++-- components/finsh/shell.h | 2 +- components/libc/compilers/gcc/newlib/libc.c | 4 +- components/libc/compilers/gcc/newlib/libc.h | 4 +- components/libc/compilers/gcc/newlib/stdio.c | 51 +++++++++++++++++--- 7 files changed, 68 insertions(+), 21 deletions(-) diff --git a/bsp/lm3s8962/applications/startup.c b/bsp/lm3s8962/applications/startup.c index 0769ffbde6..2d8e55b554 100644 --- a/bsp/lm3s8962/applications/startup.c +++ b/bsp/lm3s8962/applications/startup.c @@ -119,7 +119,7 @@ void rtthread_startup(void) #ifdef RT_USING_FINSH /* init finsh */ finsh_system_init(); -#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE) +#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE) finsh_set_device("uart1"); #endif #endif diff --git a/components/dfs/src/dfs.c b/components/dfs/src/dfs.c index 8cf642a2f9..ed8d8094aa 100644 --- a/components/dfs/src/dfs.c +++ b/components/dfs/src/dfs.c @@ -18,9 +18,9 @@ #include #endif -#ifdef RT_LIBC_USING_FILEIO +#ifdef RT_USING_POSIX #include -#endif +#endif /* RT_USING_POSIX */ /* Global variables */ const struct dfs_filesystem_ops *filesystem_operation_table[DFS_FILESYSTEM_TYPES_MAX]; @@ -216,10 +216,10 @@ struct dfs_fd *fd_get(int fd) struct dfs_fd *d; struct dfs_fdtable *fdt; -#ifdef RT_LIBC_USING_FILEIO +#ifdef RT_USING_POSIX if ((0 <= fd) && (fd <= 2)) fd = libc_stdio_get_console(); -#endif +#endif /* RT_USING_POSIX */ fdt = dfs_fdtable_get(); fd = fd - DFS_FD_OFFSET; diff --git a/components/finsh/shell.c b/components/finsh/shell.c index 16aaaac27b..7305bb0370 100644 --- a/components/finsh/shell.c +++ b/components/finsh/shell.c @@ -145,8 +145,16 @@ void finsh_set_prompt_mode(rt_uint32_t prompt_mode) int finsh_getchar(void) { #ifdef RT_USING_DEVICE -#ifdef RT_LIBC_USING_FILEIO - return getchar(); +#ifdef RT_USING_POSIX + int c; + if(read(STDIN_FILENO,&c,1)>0) + { + return c; + } + else + { + return -1; /* EOF */ + } #else char ch = 0; rt_device_t device; @@ -163,14 +171,14 @@ int finsh_getchar(void) rt_sem_take(&shell->rx_sem, RT_WAITING_FOREVER); return ch; -#endif /* RT_LIBC_USING_FILEIO */ +#endif /* RT_USING_POSIX */ #else extern char rt_hw_console_getchar(void); return rt_hw_console_getchar(); #endif /* RT_USING_DEVICE */ } -#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE) +#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE) static rt_err_t finsh_rx_ind(rt_device_t dev, rt_size_t size) { RT_ASSERT(shell != RT_NULL); @@ -436,7 +444,7 @@ void finsh_thread_entry(void *parameter) shell->echo_mode = 0; #endif -#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE) +#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE) /* set console device as shell device */ if (shell->device == RT_NULL) { diff --git a/components/finsh/shell.h b/components/finsh/shell.h index 6082c77fd5..985d3b3fbd 100644 --- a/components/finsh/shell.h +++ b/components/finsh/shell.h @@ -78,7 +78,7 @@ struct finsh_shell rt_uint16_t line_position; rt_uint16_t line_curpos; -#if !defined(RT_LIBC_USING_FILEIO) && defined(RT_USING_DEVICE) +#if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE) rt_device_t device; #endif diff --git a/components/libc/compilers/gcc/newlib/libc.c b/components/libc/compilers/gcc/newlib/libc.c index 943d127eed..86af026429 100644 --- a/components/libc/compilers/gcc/newlib/libc.c +++ b/components/libc/compilers/gcc/newlib/libc.c @@ -20,7 +20,7 @@ int libc_system_init(void) { -#ifdef RT_LIBC_USING_FILEIO +#ifdef RT_USING_POSIX rt_device_t dev_console; dev_console = rt_console_get_device(); @@ -28,7 +28,7 @@ int libc_system_init(void) { libc_stdio_set_console(dev_console->parent.name, O_RDWR); } -#endif /* RT_LIBC_USING_FILEIO */ +#endif /* RT_USING_POSIX */ #if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT pthread_system_init(); diff --git a/components/libc/compilers/gcc/newlib/libc.h b/components/libc/compilers/gcc/newlib/libc.h index fdb0a45472..0ae1057730 100644 --- a/components/libc/compilers/gcc/newlib/libc.h +++ b/components/libc/compilers/gcc/newlib/libc.h @@ -15,10 +15,10 @@ extern "C" { #endif int libc_system_init(void); -#ifdef RT_LIBC_USING_FILEIO +#ifdef RT_USING_POSIX int libc_stdio_get_console(void); int libc_stdio_set_console(const char* device_name, int mode); -#endif /* RT_LIBC_USING_FILEIO */ +#endif /* RT_USING_POSIX */ #ifdef __cplusplus } diff --git a/components/libc/compilers/gcc/newlib/stdio.c b/components/libc/compilers/gcc/newlib/stdio.c index 5f9dd2de4c..c0da1b1cec 100644 --- a/components/libc/compilers/gcc/newlib/stdio.c +++ b/components/libc/compilers/gcc/newlib/stdio.c @@ -8,15 +8,15 @@ * 2017/10/15 bernard the first version */ #include - -#ifdef RT_LIBC_USING_FILEIO #include -#include #include #include "libc.h" #define STDIO_DEVICE_NAME_MAX 32 +#ifdef RT_LIBC_USING_FILEIO +#include + static FILE* std_console = NULL; int libc_stdio_set_console(const char* device_name, int mode) @@ -28,9 +28,18 @@ int libc_stdio_set_console(const char* device_name, int 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"; + 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) @@ -80,4 +89,34 @@ int libc_stdio_get_console(void) return -1; } +#elif defined(RT_USING_POSIX) +#include +static int std_fd = -1; + +int libc_stdio_set_console(const char* device_name, int mode) +{ + int fd; + char name[STDIO_DEVICE_NAME_MAX]; + + snprintf(name, sizeof(name) - 1, "/dev/%s", device_name); + name[STDIO_DEVICE_NAME_MAX - 1] = '\0'; + + fd = open(name, mode, 0); + if (fd >= 0) + { + if (std_fd >= 0) + { + close(std_fd); + } + std_fd = fd; + } + + return std_fd; +} + +int libc_stdio_get_console(void) +{ + return std_fd; +} + #endif /* RT_LIBC_USING_FILEIO */ -- GitLab