Merge pull request #5087 from mysterywolf/libc_stdio

[libc标准化][syscall]移除libc_stdio_read/write函数,优化syscall
This commit is contained in:
guo 2021-09-27 21:36:53 +08:00 committed by GitHub
commit b7903b2938
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 79 additions and 63 deletions

View File

@ -10,17 +10,14 @@
#ifndef __RTT_LIBC_H__ #ifndef __RTT_LIBC_H__
#define __RTT_LIBC_H__ #define __RTT_LIBC_H__
#include <stddef.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
int libc_system_init(void);
int libc_stdio_set_console(const char* device_name, int mode); int libc_system_init(void);
int libc_stdio_get_console(void); int libc_stdio_get_console(void);
int libc_stdio_read(void* buffer, size_t size); int libc_stdio_set_console(const char* device_name, int mode);
int libc_stdio_write(const void* buffer, size_t size);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -21,6 +21,7 @@
#define STDIO_DEVICE_NAME_MAX 32 #define STDIO_DEVICE_NAME_MAX 32
static int std_fd = -1; static int std_fd = -1;
int libc_stdio_set_console(const char* device_name, int mode) int libc_stdio_set_console(const char* device_name, int mode)
{ {
int fd; int fd;
@ -47,29 +48,4 @@ int libc_stdio_get_console(void)
return std_fd; return std_fd;
} }
int libc_stdio_read(void *buffer, size_t size)
{
if (std_fd >= 0)
{
return read(std_fd, buffer, size);
}
else
{
rt_kprintf("Illegal stdio input!\n");
return 0;
}
}
int libc_stdio_write(const void *buffer, size_t size)
{
if (std_fd >= 0)
{
return write(std_fd, buffer, size);
}
else
{
rt_kprintf("Illegal stdio output!\n");
return size;
}
}
#endif #endif

View File

@ -25,6 +25,10 @@
#include <dfs_posix.h> #include <dfs_posix.h>
#endif #endif
#define DBG_TAG "armlibc.syscalls"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#ifdef __CLANG_ARM #ifdef __CLANG_ARM
__asm(".global __use_no_semihosting\n\t"); __asm(".global __use_no_semihosting\n\t");
#else #else
@ -146,16 +150,22 @@ int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode)
if (fh == STDIN) if (fh == STDIN)
{ {
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
size = libc_stdio_read(buf, len); if (libc_stdio_get_console() < 0)
{
LOG_W("Do not invoke standard output before initializing libc");
return 0;
}
size = read(STDIN_FILENO, buf, len);
return len - size; return len - size;
#else #else
/* no stdin */ /* no stdin */
return -1; return -1;
#endif #endif
} }
else if ((fh == STDOUT) || (fh == STDERR))
if ((fh == STDOUT) || (fh == STDERR)) {
return -1; return -1;
}
#ifndef RT_USING_DFS #ifndef RT_USING_DFS
return 0; return 0;
@ -185,7 +195,12 @@ int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
return 0; return 0;
#else #else
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
size = libc_stdio_write(buf, len); if (libc_stdio_get_console() < 0)
{
LOG_W("Do not invoke standard input before initializing libc");
return 0;
}
size = write(STDOUT_FILENO, buf, len);
return len - size; return len - size;
#else #else
if (rt_console_get_device()) if (rt_console_get_device())
@ -198,8 +213,10 @@ int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
#endif #endif
#endif #endif
} }
else if (fh == STDIN)
if (fh == STDIN) return -1; {
return -1;
}
#ifndef RT_USING_DFS #ifndef RT_USING_DFS
return 0; return 0;

View File

@ -11,17 +11,14 @@
#ifndef __RTT_LIBC_H__ #ifndef __RTT_LIBC_H__
#define __RTT_LIBC_H__ #define __RTT_LIBC_H__
#include <stddef.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
int libc_system_init(void);
int libc_stdio_set_console(const char* device_name, int mode); int libc_system_init(void);
int libc_stdio_get_console(void); int libc_stdio_get_console(void);
int libc_stdio_read(void* buffer, size_t size); int libc_stdio_set_console(const char* device_name, int mode);
int libc_stdio_write(const void* buffer, size_t size);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -46,13 +46,4 @@ int libc_stdio_get_console(void) {
return std_fd; return std_fd;
} }
int libc_stdio_read(void *buffer, size_t size)
{
return read(std_fd, buffer, size);
}
int libc_stdio_write(const void *buffer, size_t size)
{
return write(std_fd, buffer, size);
}
#endif #endif

View File

@ -15,6 +15,10 @@
#include <yfuns.h> #include <yfuns.h>
#include "libc.h" #include "libc.h"
#define DBG_TAG "dlib.syscall_read"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#pragma module_name = "?__read" #pragma module_name = "?__read"
size_t __read(int handle, unsigned char *buf, size_t len) size_t __read(int handle, unsigned char *buf, size_t len)
{ {
@ -25,14 +29,20 @@ size_t __read(int handle, unsigned char *buf, size_t len)
if (handle == _LLIO_STDIN) if (handle == _LLIO_STDIN)
{ {
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
return libc_stdio_read(buf, len); if (libc_stdio_get_console() < 0)
{
LOG_W("Do not invoke standard input before initializing libc");
return 0;
}
return read(STDIN_FILENO, buf, len);
#else #else
return _LLIO_ERROR; return _LLIO_ERROR;
#endif #endif
} }
else if ((handle == _LLIO_STDOUT) || (handle == _LLIO_STDERR))
if ((handle == _LLIO_STDOUT) || (handle == _LLIO_STDERR)) {
return _LLIO_ERROR; return _LLIO_ERROR;
}
#ifndef RT_USING_DFS #ifndef RT_USING_DFS
return _LLIO_ERROR; return _LLIO_ERROR;

View File

@ -15,6 +15,10 @@
#include <yfuns.h> #include <yfuns.h>
#include "libc.h" #include "libc.h"
#define DBG_TAG "dlib.syscall_write"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#pragma module_name = "?__write" #pragma module_name = "?__write"
size_t __write(int handle, const unsigned char *buf, size_t len) size_t __write(int handle, const unsigned char *buf, size_t len)
@ -30,19 +34,29 @@ size_t __write(int handle, const unsigned char *buf, size_t len)
#else #else
#ifdef RT_USING_POSIX #ifdef RT_USING_POSIX
return libc_stdio_write((void*)buf, len); if (libc_stdio_get_console() < 0)
{
LOG_W("Do not invoke standard output before initializing libc");
return 0;
}
return write(STDOUT_FILENO, (void*)buf, len);
#else #else
rt_device_t console_device; rt_device_t console_device;
console_device = rt_console_get_device(); console_device = rt_console_get_device();
if (console_device != 0) rt_device_write(console_device, 0, buf, len); if (console_device != 0)
{
rt_device_write(console_device, 0, buf, len);
}
return len; return len;
#endif #endif
#endif #endif
} }
else if (handle == _LLIO_STDIN)
if (handle == _LLIO_STDIN) return _LLIO_ERROR; {
return _LLIO_ERROR;
}
#ifndef RT_USING_DFS #ifndef RT_USING_DFS
return _LLIO_ERROR; return _LLIO_ERROR;

View File

@ -18,8 +18,8 @@
extern "C" { extern "C" {
#endif #endif
int libc_system_init(void); int libc_system_init(void);
int libc_stdio_set_console(const char* device_name, int mode);
int libc_stdio_get_console(void); int libc_stdio_get_console(void);
int libc_stdio_set_console(const char* device_name, int mode);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -11,8 +11,10 @@
* 2020-02-24 Meco Man fix bug of _isatty_r() * 2020-02-24 Meco Man fix bug of _isatty_r()
*/ */
#include <reent.h>
#include <rtthread.h> #include <rtthread.h>
#include <stddef.h> #include <stddef.h>
#include <unistd.h>
#include <sys/errno.h> #include <sys/errno.h>
#define DBG_TAG "newlib.syscalls" #define DBG_TAG "newlib.syscalls"
@ -90,6 +92,10 @@ void __libc_init_array(void)
#include <dlmodule.h> #include <dlmodule.h>
#endif #endif
#define DBG_TAG "newlib.syscalls"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
/* Reentrant versions of system calls. */ /* Reentrant versions of system calls. */
#ifndef _REENT_ONLY #ifndef _REENT_ONLY
@ -219,7 +225,11 @@ _ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
return -1; return -1;
#else #else
_ssize_t rc; _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); rc = read(fd, buf, nbytes);
return rc; return rc;
#endif #endif
@ -275,7 +285,7 @@ _ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{ {
#ifndef RT_USING_DFS #ifndef RT_USING_DFS
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
if (fileno(stdout) == fd) if (STDOUT_FILENO == fd)
{ {
rt_device_t console; rt_device_t console;
@ -291,7 +301,11 @@ _ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
#endif /*RT_USING_DEVICE*/ #endif /*RT_USING_DEVICE*/
#else #else
_ssize_t rc; _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); rc = write(fd, buf, nbytes);
return rc; return rc;
#endif #endif