Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
AdRainty
rt-thread
提交
a4dd106d
R
rt-thread
项目概览
AdRainty
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
a4dd106d
编写于
2月 11, 2021
作者:
B
Bernard Xiong
提交者:
GitHub
2月 11, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4316 from mysterywolf/gettimeofday
[libc][time] 修复多处bug;增加time相关函数
上级
ff9ef1a5
ce4fabe1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
89 addition
and
40 deletion
+89
-40
components/libc/compilers/common/sys/time.h
components/libc/compilers/common/sys/time.h
+3
-1
components/libc/compilers/common/time.c
components/libc/compilers/common/time.c
+86
-39
未找到文件。
components/libc/compilers/common/sys/time.h
浏览文件 @
a4dd106d
...
...
@@ -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
}
...
...
components/libc/compilers/common/time.c
浏览文件 @
a4dd106d
...
...
@@ -8,6 +8,12 @@
* 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()
* 2021-02-08 Meco Man add settimeofday() stime()
* 2021-02-10 Meco Man add ctime_r() and re-implement ctime()
* 2021-02-11 Meco Man fix bug #3183 - align days[] and months[] to 4 bytes
* add difftime()
* 2021-02-12 Meco Man add errno
*/
#include <sys/time.h>
...
...
@@ -16,9 +22,6 @@
#include <rtdevice.h>
#endif
#if !defined (__IAR_SYSTEMS_ICC__)
/* seconds per day */
#define SPD 24*60*60
...
...
@@ -39,8 +42,9 @@ const short __spm[13] =
(
31
+
28
+
31
+
30
+
31
+
30
+
31
+
31
+
30
+
31
+
30
),
(
31
+
28
+
31
+
30
+
31
+
30
+
31
+
31
+
30
+
31
+
30
+
31
),
};
static
const
char
days
[]
=
"Sun Mon Tue Wed Thu Fri Sat "
;
static
const
char
months
[]
=
"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "
;
ALIGN
(
4
)
static
const
char
days
[]
=
"Sun Mon Tue Wed Thu Fri Sat "
;
ALIGN
(
4
)
static
const
char
months
[]
=
"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "
;
static
int
__isleap
(
int
year
)
{
...
...
@@ -89,6 +93,8 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r)
;
r
->
tm_mon
=
i
;
r
->
tm_mday
+=
work
-
__spm
[
i
];
r
->
tm_isdst
=
0
;
return
r
;
}
...
...
@@ -102,10 +108,10 @@ struct tm* gmtime(const time_t* t)
struct
tm
*
localtime_r
(
const
time_t
*
t
,
struct
tm
*
r
)
{
time_t
local_tz
;
int
timezone
;
int
utc_plus
;
timezone
=
0
*
3600
*
8
;
/* GTM: UTC+0 */
local_tz
=
*
t
+
timezone
;
utc_plus
=
0
;
/* GTM: UTC+0 */
local_tz
=
*
t
+
utc_plus
*
3600
;
return
gmtime_r
(
&
local_tz
,
r
);
}
...
...
@@ -148,44 +154,45 @@ char* asctime(const struct tm *timeptr)
return
asctime_r
(
timeptr
,
buf
);
}
char
*
ctime
(
const
time_t
*
timep
)
char
*
ctime_r
(
const
time_t
*
tim_p
,
char
*
result
)
{
return
asctime
(
localtime
(
timep
));
struct
tm
tm
;
return
asctime_r
(
localtime_r
(
tim_p
,
&
tm
),
result
);
}
#endif
/* __IAR_SYSTEMS_ICC__ */
char
*
ctime
(
const
time_t
*
tim_p
)
{
return
asctime
(
localtime
(
tim_p
));
}
double
difftime
(
time_t
tim1
,
time_t
tim2
)
{
return
(
double
)(
tim1
-
tim2
);
}
/**
* Returns the current time.
*
* @param time_t * t the timestamp pointer, if not used, keep NULL.
*
* @return time_t return timestamp current.
* @return The value ((time_t)-1) is returned if the calendar time is not available.
* If timer is not a NULL pointer, the return value is also stored in timer.
*
*/
#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000
/* for IAR 6.2 later Compiler */
#pragma module_name = "?time"
#if _DLIB_TIME_USES_64
time_t
__time64
(
time_t
*
t
)
#else
time_t
__time32
(
time_t
*
t
)
#endif
#else
/* Keil & GCC */
time_t
time
(
time_t
*
t
)
#endif
RT_WEAK
time_t
time
(
time_t
*
t
)
{
time_t
time_now
=
0
;
time_t
time_now
=
((
time_t
)
-
1
);
/* default is not available */
#ifdef RT_USING_RTC
static
rt_device_t
device
=
RT_NULL
;
/* optimization: find rtc device only first
.
*/
/* optimization: find rtc device only first */
if
(
device
==
RT_NULL
)
{
device
=
rt_device_find
(
"rtc"
);
}
/* read timestamp from RTC device
.
*/
/* read timestamp from RTC device */
if
(
device
!=
RT_NULL
)
{
if
(
rt_device_open
(
device
,
0
)
==
RT_EOK
)
...
...
@@ -202,6 +209,11 @@ time_t time(time_t *t)
*
t
=
time_now
;
}
if
(
time_now
==
(
time_t
)
-
1
)
{
errno
=
ENOSYS
;
}
return
time_now
;
}
...
...
@@ -210,26 +222,29 @@ 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
)
{
time_t
time
=
0
;
#ifdef RT_USING_DEVICE
#ifdef RT_USING_RTC
rt_device_t
device
;
/* read timestamp from RTC device. */
device
=
rt_device_find
(
"rtc"
);
RT_ASSERT
(
device
!=
RT_NULL
);
rt_device_control
(
device
,
RT_DEVICE_CTRL_RTC_GET_TIME
,
&
time
);
if
(
tp
!=
RT_NULL
)
if
(
rt_device_open
(
device
,
0
)
==
RT_EOK
)
{
tp
->
tv_sec
=
time
;
tp
->
tv_usec
=
0
;
rt_device_control
(
device
,
RT_DEVICE_CTRL_RTC_SET_TIME
,
(
void
*
)
t
)
;
rt_device_close
(
device
)
;
}
#else
tv
->
tv_sec
=
0
;
tv
->
tv_usec
=
0
;
#endif
else
{
errno
=
ENOSYS
;
return
-
1
;
}
return
0
;
return
time
;
#else
errno
=
ENOSYS
;
return
-
1
;
#endif
/* RT_USING_RTC */
}
time_t
timegm
(
struct
tm
*
const
t
)
...
...
@@ -305,3 +320,35 @@ 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
)
{
time_t
t
=
time
(
RT_NULL
);
if
(
tv
!=
RT_NULL
&&
t
!=
(
time_t
)
-
1
)
{
tv
->
tv_sec
=
t
;
tv
->
tv_usec
=
0
;
return
0
;
}
else
{
errno
=
ENOSYS
;
return
-
1
;
}
}
/* TODO: timezone */
int
settimeofday
(
const
struct
timeval
*
tv
,
const
struct
timezone
*
tz
)
{
if
(
tv
!=
RT_NULL
)
{
return
stime
((
const
time_t
*
)
&
tv
->
tv_sec
);
}
else
{
errno
=
ENOSYS
;
return
-
1
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录