diff options
| author | Meco Man <[email protected]> | 2024-03-30 02:31:07 -0400 |
|---|---|---|
| committer | Meco Man <[email protected]> | 2024-04-20 00:57:17 -0400 |
| commit | 792c3c0603f8d4dbadacee8b9e2bdca95be3a322 (patch) | |
| tree | 7edc8f135fa1660471c2dbfb8f607f9cc45bcfbf | |
| parent | 52f39d1edf8756dae06fc6a3b0bd7666f22dc764 (diff) | |
[kernel] move errno functions into klibc
| -rw-r--r-- | include/rtklibc.h | 10 | ||||
| -rw-r--r-- | include/rtthread.h | 10 | ||||
| -rw-r--r-- | src/klibc/kstdio.c | 153 | ||||
| -rw-r--r-- | src/kservice.c | 130 |
4 files changed, 162 insertions, 141 deletions
diff --git a/include/rtklibc.h b/include/rtklibc.h index dea2fdbb27..9a50c71b88 100644 --- a/include/rtklibc.h +++ b/include/rtklibc.h @@ -25,6 +25,16 @@ int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list args); int rt_sprintf(char *buf, const char *format, ...); int rt_snprintf(char *buf, rt_size_t size, const char *format, ...); +rt_err_t rt_get_errno(void); +void rt_set_errno(rt_err_t no); +int *_rt_errno(void); +const char *rt_strerror(rt_err_t error); +#if !defined(RT_USING_NEWLIBC) && !defined(_WIN32) +#ifndef errno +#define errno *_rt_errno() +#endif +#endif /* !defined(RT_USING_NEWLIBC) && !defined(_WIN32) */ + /* kstring */ #ifndef RT_KSERVICE_USING_STDLIB_MEMORY diff --git a/include/rtthread.h b/include/rtthread.h index c8993dd7e6..5e70c5dd63 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -728,16 +728,6 @@ rt_device_t rt_console_get_device(void); #endif /* RT_USING_THREADSAFE_PRINTF */ #endif /* defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE) */ -rt_err_t rt_get_errno(void); -void rt_set_errno(rt_err_t no); -int *_rt_errno(void); -const char *rt_strerror(rt_err_t error); -#if !defined(RT_USING_NEWLIBC) && !defined(_WIN32) -#ifndef errno -#define errno *_rt_errno() -#endif -#endif /* !defined(RT_USING_NEWLIBC) && !defined(_WIN32) */ - int __rt_ffs(int value); void rt_show_version(void); diff --git a/src/klibc/kstdio.c b/src/klibc/kstdio.c index 8ed1a9298d..3e47dc2ad7 100644 --- a/src/klibc/kstdio.c +++ b/src/klibc/kstdio.c @@ -21,7 +21,6 @@ #endif /* defined (RT_DEBUG_DEVICE) */ #include <rtdbg.h> -/* private function */ #define _ISDIGIT(c) ((unsigned)((c) - '0') < 10) /** @@ -684,3 +683,155 @@ int rt_sprintf(char *buf, const char *format, ...) return n; } RTM_EXPORT(rt_sprintf); + +/* errno functions */ + +/** + * @brief A global variable used to store the error code. + * + * This volatile static integer is used to store the most recent error code globally. + * Its volatile nature ensures that every read operation fetches the most current value, + * providing real-time error status across different parts of the program. + */ +static volatile int __rt_errno; + +/** + * @struct _errno_str_t + * @brief Structure for mapping error codes to corresponding error strings. + * + * This structure is used to create a mapping that associates an rt_err_t type error code + * with a corresponding error description string. + */ +struct _errno_str_t +{ + rt_err_t error; /**< Error code of type rt_err_t, representing different kinds of errors. */ + const char *str; /**< Pointer to the error description string. */ +}; + +/** + * @brief An array containing mappings of error codes to their corresponding error strings. + * + * This array uses the _errno_str_t structure to define several error codes and their + * corresponding error description strings. These mappings can be used at runtime + * to provide more readable error information. + */ +static struct _errno_str_t rt_errno_strs[] = +{ + {RT_EOK , "OK "}, /**< Operation successful. */ + {RT_ERROR , "ERROR "}, /**< General error. */ + {RT_ETIMEOUT, "ETIMOUT"}, /**< Operation timed out. */ + {RT_EFULL , "ERSFULL"}, /**< Resource is full. */ + {RT_EEMPTY , "ERSEPTY"}, /**< Resource is empty. */ + {RT_ENOMEM , "ENOMEM "}, /**< Not enough memory. */ + {RT_ENOSYS , "ENOSYS "}, /**< Function not implemented. */ + {RT_EBUSY , "EBUSY "}, /**< Resource is busy. */ + {RT_EIO , "EIO "}, /**< Input/output error. */ + {RT_EINTR , "EINTRPT"}, /**< Interrupted system call. */ + {RT_EINVAL , "EINVAL "}, /**< Invalid argument. */ + {RT_ENOENT , "ENOENT "}, /**< No such file or directory. */ + {RT_ENOSPC , "ENOSPC "}, /**< No space left on device. */ + {RT_EPERM , "EPERM "}, /**< Operation not permitted. */ + {RT_ETRAP , "ETRAP "}, /**< Trap error. */ +}; + +/** + * @brief This function return a pointer to a string that contains the + * message of error. + * + * @param error the errorno code + * @return a point to error message string + */ +const char *rt_strerror(rt_err_t error) +{ + int i = 0; + + if (error < 0) + error = -error; + + for (i = 0; i < sizeof(rt_errno_strs) / sizeof(rt_errno_strs[0]); i++) + { + if (rt_errno_strs[i].error == error) + return rt_errno_strs[i].str; + } + + return "EUNKNOW"; +} +RTM_EXPORT(rt_strerror); + +/** + * @brief This function gets the global errno for the current thread. + * + * @return errno + */ +rt_err_t rt_get_errno(void) +{ + rt_thread_t tid = RT_NULL; + + if (rt_interrupt_get_nest() != 0) + { + /* it's in interrupt context */ + return __rt_errno; + } + + tid = rt_thread_self(); + if (tid == RT_NULL) + { + return __rt_errno; + } + + return tid->error; +} +RTM_EXPORT(rt_get_errno); + +/** + * @brief This function sets the global errno for the current thread. + * + * @param error is the errno shall be set. + */ +void rt_set_errno(rt_err_t error) +{ + rt_thread_t tid = RT_NULL; + + if (rt_interrupt_get_nest() != 0) + { + /* it's in interrupt context */ + __rt_errno = error; + + return; + } + + tid = rt_thread_self(); + if (tid == RT_NULL) + { + __rt_errno = error; + + return; + } + + tid->error = error; +} +RTM_EXPORT(rt_set_errno); + +/** + * @brief This function returns the address of the current thread errno. + * + * @return The errno address. + */ +int *_rt_errno(void) +{ + rt_thread_t tid = RT_NULL; + + if (rt_interrupt_get_nest() != 0) + { + return (int *)&__rt_errno; + } + + tid = rt_thread_self(); + if (tid != RT_NULL) + { + return (int *) & (tid->error); + } + + return (int *)&__rt_errno; +} +RTM_EXPORT(_rt_errno); diff --git a/src/kservice.c b/src/kservice.c index 7c0cb0b58c..596fe69379 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -54,9 +54,6 @@ * @{ */ -/* global errno in RT-Thread */ -static volatile int __rt_errno; - #if defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE) static rt_device_t _console_device = RT_NULL; #endif @@ -112,133 +109,6 @@ rt_weak const char *rt_hw_cpu_arch(void) return "unknown"; } -struct _errno_str_t -{ - rt_err_t error; - const char *str; -}; - -static struct _errno_str_t rt_errno_strs[] = -{ - {RT_EOK , "OK "}, - {RT_ERROR , "ERROR "}, - {RT_ETIMEOUT, "ETIMOUT"}, - {RT_EFULL , "ERSFULL"}, - {RT_EEMPTY , "ERSEPTY"}, - {RT_ENOMEM , "ENOMEM "}, - {RT_ENOSYS , "ENOSYS "}, - {RT_EBUSY , "EBUSY "}, - {RT_EIO , "EIO "}, - {RT_EINTR , "EINTRPT"}, - {RT_EINVAL , "EINVAL "}, - {RT_ENOENT , "ENOENT "}, - {RT_ENOSPC , "ENOSPC "}, - {RT_EPERM , "EPERM "}, - {RT_ETRAP , "ETRAP "}, -}; - -/** - * @brief This function return a pointer to a string that contains the - * message of error. - * - * @param error the errorno code - * @return a point to error message string - */ -const char *rt_strerror(rt_err_t error) -{ - int i = 0; - - if (error < 0) - error = -error; - - for (i = 0; i < sizeof(rt_errno_strs) / sizeof(rt_errno_strs[0]); i++) - { - if (rt_errno_strs[i].error == error) - return rt_errno_strs[i].str; - } - - return "EUNKNOW"; -} -RTM_EXPORT(rt_strerror); - -/** - * @brief This function gets the global errno for the current thread. - * - * @return errno - */ -rt_err_t rt_get_errno(void) -{ - rt_thread_t tid = RT_NULL; - - if (rt_interrupt_get_nest() != 0) - { - /* it's in interrupt context */ - return __rt_errno; - } - - tid = rt_thread_self(); - if (tid == RT_NULL) - { - return __rt_errno; - } - - return tid->error; -} -RTM_EXPORT(rt_get_errno); - -/** - * @brief This function sets the global errno for the current thread. - * - * @param error is the errno shall be set. - */ -void rt_set_errno(rt_err_t error) -{ - rt_thread_t tid = RT_NULL; - - if (rt_interrupt_get_nest() != 0) - { - /* it's in interrupt context */ - __rt_errno = error; - - return; - } - - tid = rt_thread_self(); - if (tid == RT_NULL) - { - __rt_errno = error; - - return; - } - - tid->error = error; -} -RTM_EXPORT(rt_set_errno); - -/** - * @brief This function returns the address of the current thread errno. - * - * @return The errno address. - */ -int *_rt_errno(void) -{ - rt_thread_t tid = RT_NULL; - - if (rt_interrupt_get_nest() != 0) - { - return (int *)&__rt_errno; - } - - tid = rt_thread_self(); - if (tid != RT_NULL) - { - return (int *) & (tid->error); - } - - return (int *)&__rt_errno; -} -RTM_EXPORT(_rt_errno); - /** * @brief This function will show the version of rt-thread rtos */ |
