ソースを参照

Merge pull request #48 from RT-Thread/master

sycn
Meco Jianting Man 4 年 前
コミット
6d57515316

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

+ 1 - 9
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 */

+ 12 - 14
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 <rdent@iinet.net.au>
  * 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);
 

+ 4 - 5
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)