Merge pull request #5236 from mysterywolf/posix

[libc][posix] 解决RT_LIBC_USING_FILEIO范围过大的问题
This commit is contained in:
guo 2021-10-27 18:06:54 +08:00 committed by GitHub
commit 4107d7bea2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 68 additions and 22 deletions

View File

@ -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

View File

@ -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;

View File

@ -145,10 +145,17 @@ 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();
#else
char ch = 0;
#ifdef RT_USING_POSIX
if(read(STDIN_FILENO, &ch, 1) > 0)
{
return ch;
}
else
{
return -1; /* EOF */
}
#else
rt_device_t device;
RT_ASSERT(shell != RT_NULL);
@ -163,14 +170,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 +443,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)
{

View File

@ -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

View File

@ -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();

View File

@ -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
}

View File

@ -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 */