summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeco Jianting Man <[email protected]>2021-05-01 11:05:16 +0800
committerGitHub <[email protected]>2021-05-01 11:05:16 +0800
commit6d57515316bce0698d2998d807e904554db2f978 (patch)
tree0f3efbca3e6033f0c085453748a6437d8c2ee03a
parent79a452b26d5499466c111d6fceac5b628ff7fdf2 (diff)
parentbe3b5a950f8b0610b7f454769c2d5bf4a54afc8a (diff)
Merge pull request #48 from RT-Thread/master
sycn
-rw-r--r--components/libc/Kconfig8
-rw-r--r--components/libc/compilers/common/sys/time.h10
-rw-r--r--components/libc/compilers/common/time.c26
-rw-r--r--components/libc/compilers/newlib/SConscript9
4 files changed, 24 insertions, 29 deletions
diff --git a/components/libc/Kconfig b/components/libc/Kconfig
index 49b97481d1..8a790c298d 100644
--- a/components/libc/Kconfig
+++ b/components/libc/Kconfig
@@ -55,8 +55,14 @@ endif
if RT_USING_LIBC != y
config RT_LIBC_USING_TIME
- bool "Enable TIME FUNCTIONS WITHOUT COMPILER'S LIBC"
+ bool "Enable time functions without compiler's libc"
default y
endif
+config RT_LIBC_FIXED_TIMEZONE
+ depends on (RT_LIBC_USING_TIME || RT_USING_LIBC)
+ int "Manually set a fixed time zone (UTC+)"
+ range -12 12
+ default 8
+
endmenu
diff --git a/components/libc/compilers/common/sys/time.h b/components/libc/compilers/common/sys/time.h
index ef1c810608..24da0b6c77 100644
--- a/components/libc/compilers/common/sys/time.h
+++ b/components/libc/compilers/common/sys/time.h
@@ -18,14 +18,6 @@
extern "C" {
#endif
-/*
- * Skip define timespec for IAR version over 8.10.1 where __VER__ is 8010001.
- */
-#if defined ( __ICCARM__ ) && (__VER__ >= 8010001)
-#define _TIMESPEC_DEFINED
-#endif
-
-
#ifndef _TIMEVAL_DEFINED
#define _TIMEVAL_DEFINED
/*
@@ -40,7 +32,7 @@ struct timeval {
#endif
#endif /* _TIMEVAL_DEFINED */
-#if !(defined(__GNUC__) && !defined(__ARMCC_VERSION)/*GCC*/) && !defined (__ICCARM__) && !defined (_WIN32)
+#if !(defined(__GNUC__) && !defined(__ARMCC_VERSION)/*GCC*/) && !(defined(__ICCARM__) && (__VER__ >= 8010001)) && !defined(_WIN32)
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* and nanoseconds */
diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c
index 33d8907165..deda18a560 100644
--- a/components/libc/compilers/common/time.c
+++ b/components/libc/compilers/common/time.c
@@ -16,7 +16,7 @@
* 2012-12-08 Bernard <clock_time.c> fix the issue of _timevalue.tv_usec initialization,
* which found by Rob <[email protected]>
* 2021-02-12 Meco Man move all of the functions located in <clock_time.c> to this file
- * 2021-03-15 Meco Man fixed bug: https://club.rt-thread.org/ask/question/423650.html
+ * 2021-03-15 Meco Man fixed a bug of leaking memory in asctime()
*/
#include <sys/time.h>
@@ -30,6 +30,10 @@
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
+#ifndef RT_LIBC_FIXED_TIMEZONE
+#define RT_LIBC_FIXED_TIMEZONE 8 /* UTC+8 */
+#endif
+
/* seconds per day */
#define SPD 24*60*60
@@ -104,7 +108,7 @@ static int get_timeval(struct timeval *tv)
}
else
{
- /* LOG_W will cause a recursive printing if ulog timestamp function is turned on */
+ /* LOG_W will cause a recursive printing if ulog timestamp function is enabled */
rt_kprintf("Cannot find a RTC device to provide time!\r\n");
return -1;
}
@@ -112,7 +116,7 @@ static int get_timeval(struct timeval *tv)
return (rst < 0) ? -1 : 1;
#else
- /* LOG_W will cause a recursive printing if ulog timestamp function is turned on */
+ /* LOG_W will cause a recursive printing if ulog timestamp function is enabled */
rt_kprintf("Cannot find a RTC device to provide time!\r\n");
return -1;
#endif /* RT_USING_RTC */
@@ -208,14 +212,11 @@ struct tm* gmtime(const time_t* t)
}
RTM_EXPORT(gmtime);
-/*TODO: timezone */
struct tm* localtime_r(const time_t* t, struct tm* r)
{
time_t local_tz;
- int utc_plus;
- utc_plus = 8; /* GMT: UTC+8 */
- local_tz = *t + utc_plus * 3600;
+ local_tz = *t + RT_LIBC_FIXED_TIMEZONE * 3600;
return gmtime_r(&local_tz, r);
}
RTM_EXPORT(localtime_r);
@@ -227,15 +228,12 @@ struct tm* localtime(const time_t* t)
}
RTM_EXPORT(localtime);
-/* TODO: timezone */
time_t mktime(struct tm * const t)
{
time_t timestamp;
- int utc_plus;
- utc_plus = 8; /* GMT: UTC+8 */
timestamp = timegm(t);
- timestamp = timestamp - 3600 * utc_plus;
+ timestamp = timestamp - 3600 * RT_LIBC_FIXED_TIMEZONE;
return timestamp;
}
RTM_EXPORT(mktime);
@@ -270,16 +268,16 @@ char* asctime(const struct tm *timeptr)
}
RTM_EXPORT(asctime);
-char *ctime_r (const time_t * tim_p, char * result)
+char *ctime_r(const time_t * tim_p, char * result)
{
struct tm tm;
- return asctime_r (localtime_r (tim_p, &tm), result);
+ return asctime_r(localtime_r(tim_p, &tm), result);
}
RTM_EXPORT(ctime_r);
char* ctime(const time_t *tim_p)
{
- return asctime (localtime (tim_p));
+ return asctime(localtime(tim_p));
}
RTM_EXPORT(ctime);
diff --git a/components/libc/compilers/newlib/SConscript b/components/libc/compilers/newlib/SConscript
index b1ad6e4784..542cdecd40 100644
--- a/components/libc/compilers/newlib/SConscript
+++ b/components/libc/compilers/newlib/SConscript
@@ -4,17 +4,18 @@ Import('rtconfig')
src = []
cwd = GetCurrentDir()
group = []
-
+LIBS = []
+CPPDEFINES = []
CPPPATH = [cwd]
if rtconfig.PLATFORM == 'gcc':
if GetDepend('RT_USING_LIBC'):
- CPPDEFINES = ['RT_USING_NEWLIB']
+ CPPDEFINES += ['RT_USING_NEWLIB']
# link with libc and libm:
# libm is a frequently used lib. Newlib is compiled with -ffunction-sections in
# recent GCC tool chains. The linker would just link in the functions that have
# been referenced. So setting this won't result in bigger text size.
- LIBS = ['c', 'm']
+ LIBS += ['c', 'm']
src += Glob('*.c')
SrcRemove(src, ['minilib.c'])
@@ -22,8 +23,6 @@ if rtconfig.PLATFORM == 'gcc':
SrcRemove(src, ['libc_syms.c'])
else:
src += ['minilib.c']
- CPPDEFINES = []
- LIBS = []
group = DefineGroup('libc', src, depend = [], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS)