Pārlūkot izejas kodu

add function settimeofday & stime

Meco Man 4 gadi atpakaļ
vecāks
revīzija
6c7dd30532

+ 3 - 1
components/libc/compilers/common/sys/time.h

@@ -48,8 +48,10 @@ struct timezone {
   int tz_dsttime;       /* type of dst correction */
 };
 
-int gettimeofday(struct timeval *tp, struct timezone *tz);
+int stime(const time_t *t);
 time_t timegm(struct tm * const t);
+int gettimeofday(struct timeval *tv, struct timezone *tz);
+int settimeofday(const struct timeval *tv, const struct timezone *tz);
 
 #ifdef __cplusplus
 }

+ 52 - 19
components/libc/compilers/common/time.c

@@ -8,6 +8,8 @@
  * 2019-08-21     zhangjun     copy from minilibc
  * 2020-09-07     Meco Man     combine gcc armcc iccarm
  * 2021-02-05     Meco Man     add timegm()
+ * 2021-02-07     Meco Man     fixed gettimeofday() time()
+ * 2021-02-08     Meco Man     add settimeofday() stime()
  */
 
 #include <sys/time.h>
@@ -175,24 +177,15 @@ time_t time(time_t *t)
 #endif
 {
     time_t time_now = 0;
-
 #ifdef RT_USING_RTC
-    static rt_device_t device = RT_NULL;
-
-    /* optimization: find rtc device only first. */
-    if (device == RT_NULL)
-    {
-        device = rt_device_find("rtc");
-    }
+    rt_device_t device;
 
     /* read timestamp from RTC device. */
-    if (device != RT_NULL)
+    device = rt_device_find("rtc");
+    if (rt_device_open(device, 0) == RT_EOK)
     {
-        if (rt_device_open(device, 0) == RT_EOK)
-        {
-            rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
-            rt_device_close(device);
-        }
+        rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
+        rt_device_close(device);
     }
 #endif /* RT_USING_RTC */
 
@@ -210,15 +203,27 @@ RT_WEAK clock_t clock(void)
     return rt_tick_get();
 }
 
-/* TODO: timezone */
-int gettimeofday(struct timeval *tp, struct timezone *tz)
+int stime(const time_t *t)
 {
-    if (tp != RT_NULL)
+#ifdef RT_USING_RTC
+    rt_device_t device;
+
+    /* read timestamp from RTC device. */
+    device = rt_device_find("rtc");
+    if (rt_device_open(device, 0) == RT_EOK)
+    {
+        rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, (void*)t);
+        rt_device_close(device);
+    }
+    else
     {
-        tp->tv_sec = time(RT_NULL);
-        tp->tv_usec = 0;
+        return -1;
     }
     return 0;
+
+#else
+    return -1;
+#endif /* RT_USING_RTC */
 }
 
 time_t timegm(struct tm * const t)
@@ -294,3 +299,31 @@ time_t timegm(struct tm * const t)
     i = 60;
     return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
 }
+
+/* TODO: timezone */
+int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+    if (tv != RT_NULL)
+    {
+        tv->tv_sec = time(RT_NULL);
+        tv->tv_usec = 0;
+        return 0;
+    }
+    else
+    {
+        return -1;
+    }
+}
+
+/* TODO: timezone */
+int settimeofday(const struct timeval *tv, const struct timezone *tz)
+{
+    if (tv != RT_NULL)
+    {
+        return stime(&tv->tv_sec);
+    }
+    else
+    {
+        return -1;
+    }
+}