Bladeren bron

[libc][posix] 解决RT_LIBC_USING_FILEIO范围过大的问题

Meco Man 3 jaren geleden
bovenliggende
commit
25bd908fb7

+ 1 - 1
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

+ 4 - 4
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;

+ 13 - 5
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)
     {

+ 1 - 1
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
 

+ 2 - 2
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();

+ 2 - 2
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
 }

+ 45 - 6
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 */