summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeco Man <[email protected]>2021-10-27 02:52:04 -0400
committerMeco Man <[email protected]>2021-10-27 03:04:05 -0400
commit25bd908fb7ea04e0e9218597b10f75814bf77a4f (patch)
treeef436b820dcc00cdc46ae24a86d86e654ae60896
parent4d256eb308f4e9f7abc1644dda3fd675e560d518 (diff)
[libc][posix] 解决RT_LIBC_USING_FILEIO范围过大的问题
-rw-r--r--bsp/lm3s8962/applications/startup.c2
-rw-r--r--components/dfs/src/dfs.c8
-rw-r--r--components/finsh/shell.c18
-rw-r--r--components/finsh/shell.h2
-rw-r--r--components/libc/compilers/gcc/newlib/libc.c4
-rw-r--r--components/libc/compilers/gcc/newlib/libc.h4
-rw-r--r--components/libc/compilers/gcc/newlib/stdio.c51
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 <lwp.h>
#endif
-#ifdef RT_LIBC_USING_FILEIO
+#ifdef RT_USING_POSIX
#include <libc.h>
-#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 <rtthread.h>
-
-#ifdef RT_LIBC_USING_FILEIO
#include <stdio.h>
-#include <stdlib.h>
#include <fcntl.h>
#include "libc.h"
#define STDIO_DEVICE_NAME_MAX 32
+#ifdef RT_LIBC_USING_FILEIO
+#include <stdlib.h>
+
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 <unistd.h>
+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 */