Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Mozi
rt-thread
提交
dfeacfb6
R
rt-thread
项目概览
Mozi
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
0
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,发现更多精彩内容 >>
未验证
提交
dfeacfb6
编写于
4月 15, 2021
作者:
B
Bernard Xiong
提交者:
GitHub
4月 15, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4614 from armink/fix_rtc
Add feature of millisecond time
上级
288ed103
4d968a87
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
83 addition
and
39 deletion
+83
-39
bsp/simulator/drivers/drv_rtc.c
bsp/simulator/drivers/drv_rtc.c
+21
-5
components/libc/compilers/common/time.c
components/libc/compilers/common/time.c
+58
-32
include/rtdef.h
include/rtdef.h
+4
-2
未找到文件。
bsp/simulator/drivers/drv_rtc.c
浏览文件 @
dfeacfb6
...
@@ -48,7 +48,7 @@ static void soft_rtc_alarm_update(struct rt_rtc_wkalarm *palarm)
...
@@ -48,7 +48,7 @@ static void soft_rtc_alarm_update(struct rt_rtc_wkalarm *palarm)
static
rt_err_t
soft_rtc_control
(
rt_device_t
dev
,
int
cmd
,
void
*
args
)
static
rt_err_t
soft_rtc_control
(
rt_device_t
dev
,
int
cmd
,
void
*
args
)
{
{
__time32_t
*
t
;
__time32_t
*
t
;
struct
tm
*
newtime
;
struct
tm
newtime
;
RT_ASSERT
(
dev
!=
RT_NULL
);
RT_ASSERT
(
dev
!=
RT_NULL
);
...
@@ -57,10 +57,16 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
...
@@ -57,10 +57,16 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
case
RT_DEVICE_CTRL_RTC_GET_TIME
:
case
RT_DEVICE_CTRL_RTC_GET_TIME
:
{
{
t
=
(
__time32_t
*
)
args
;
t
=
(
__time32_t
*
)
args
;
_time32
(
t
);
SYSTEMTIME
sys_time
;
/* TODO The libc time module not support timezone now. So get the time from locatime. */
newtime
=
_localtime32
(
t
);
GetSystemTime
(
&
sys_time
);
*
t
=
_mkgmtime32
(
newtime
);
newtime
.
tm_year
=
sys_time
.
wYear
-
1900
;
newtime
.
tm_mon
=
sys_time
.
wMonth
-
1
;
newtime
.
tm_mday
=
sys_time
.
wDay
;
newtime
.
tm_hour
=
sys_time
.
wHour
;
newtime
.
tm_min
=
sys_time
.
wMinute
;
newtime
.
tm_sec
=
sys_time
.
wSecond
;
*
t
=
timegm
(
&
newtime
);
break
;
break
;
}
}
case
RT_DEVICE_CTRL_RTC_SET_TIME
:
case
RT_DEVICE_CTRL_RTC_SET_TIME
:
...
@@ -79,6 +85,16 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
...
@@ -79,6 +85,16 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
soft_rtc_alarm_update
(
&
wkalarm
);
soft_rtc_alarm_update
(
&
wkalarm
);
break
;
break
;
#endif
#endif
case
RT_DEVICE_CTRL_RTC_GET_TIME_US
:
{
long
*
tv_usec
=
(
long
*
)
args
;
SYSTEMTIME
sys_time
;
GetSystemTime
(
&
sys_time
);
*
tv_usec
=
sys_time
.
wMilliseconds
*
1000UL
;
break
;
}
default:
return
-
RT_ERROR
;
}
}
return
RT_EOK
;
return
RT_EOK
;
...
...
components/libc/compilers/common/time.c
浏览文件 @
dfeacfb6
...
@@ -120,7 +120,7 @@ struct tm* localtime_r(const time_t* t, struct tm* r)
...
@@ -120,7 +120,7 @@ struct tm* localtime_r(const time_t* t, struct tm* r)
time_t
local_tz
;
time_t
local_tz
;
int
utc_plus
;
int
utc_plus
;
utc_plus
=
0
;
/* GTM: UTC+0
*/
utc_plus
=
8
;
/* GMT: UTC+8
*/
local_tz
=
*
t
+
utc_plus
*
3600
;
local_tz
=
*
t
+
utc_plus
*
3600
;
return
gmtime_r
(
&
local_tz
,
r
);
return
gmtime_r
(
&
local_tz
,
r
);
}
}
...
@@ -183,18 +183,16 @@ char* ctime(const time_t *tim_p)
...
@@ -183,18 +183,16 @@ char* ctime(const time_t *tim_p)
}
}
RTM_EXPORT
(
ctime
);
RTM_EXPORT
(
ctime
);
/**
/*-1 failure; 1 success*/
* Returns the current time.
static
int
get_timeval
(
struct
timeval
*
tv
)
*
* @param time_t * t the timestamp pointer, if not used, keep NULL.
*
* @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.
*
*/
RT_WEAK
time_t
time
(
time_t
*
t
)
{
{
time_t
time_now
=
((
time_t
)
-
1
);
/* default is not available */
if
(
tv
==
RT_NULL
)
return
-
1
;
/* default is not available */
tv
->
tv_sec
=
-
1
;
/* default is 0 */
tv
->
tv_usec
=
0
;
#ifdef RT_USING_RTC
#ifdef RT_USING_RTC
static
rt_device_t
device
=
RT_NULL
;
static
rt_device_t
device
=
RT_NULL
;
...
@@ -210,26 +208,50 @@ RT_WEAK time_t time(time_t *t)
...
@@ -210,26 +208,50 @@ RT_WEAK time_t time(time_t *t)
{
{
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_control
(
device
,
RT_DEVICE_CTRL_RTC_GET_TIME
,
&
tv
->
tv_sec
);
rt_device_control
(
device
,
RT_DEVICE_CTRL_RTC_GET_TIME_US
,
&
tv
->
tv_usec
);
rt_device_close
(
device
);
rt_device_close
(
device
);
}
}
}
}
#endif
/* RT_USING_RTC */
#endif
/* RT_USING_RTC */
/* if t is not NULL, write timestamp to *t */
if
(
tv
->
tv_sec
==
(
time_t
)
-
1
)
if
(
t
!=
RT_NULL
)
{
*
t
=
time_now
;
}
if
(
time_now
==
(
time_t
)
-
1
)
{
{
/* 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 turned on */
rt_kprintf
(
"Cannot find a RTC device to provide time!
\r\n
"
);
rt_kprintf
(
"Cannot find a RTC device to provide time!
\r\n
"
);
errno
=
ENOSYS
;
tv
->
tv_sec
=
0
;
return
-
1
;
}
}
return
time_now
;
return
1
;
}
/**
* Returns the current time.
*
* @param time_t * t the timestamp pointer, if not used, keep NULL.
*
* @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.
*
*/
RT_WEAK
time_t
time
(
time_t
*
t
)
{
struct
timeval
now
;
if
(
get_timeval
(
&
now
)
>
0
)
{
if
(
t
)
{
*
t
=
now
.
tv_sec
;
}
return
now
.
tv_sec
;
}
else
{
errno
=
EFAULT
;
return
-
1
;
}
}
}
RTM_EXPORT
(
time
);
RTM_EXPORT
(
time
);
...
@@ -254,13 +276,13 @@ int stime(const time_t *t)
...
@@ -254,13 +276,13 @@ int stime(const time_t *t)
else
else
{
{
LOG_W
(
"Cannot find a RTC device to provide time!"
);
LOG_W
(
"Cannot find a RTC device to provide time!"
);
errno
=
E
NOSYS
;
errno
=
E
FAULT
;
return
-
1
;
return
-
1
;
}
}
return
0
;
return
0
;
#else
#else
LOG_W
(
"Cannot find a RTC device to provide time!"
);
LOG_W
(
"Cannot find a RTC device to provide time!"
);
errno
=
E
NOSYS
;
errno
=
E
FAULT
;
return
-
1
;
return
-
1
;
#endif
/* RT_USING_RTC */
#endif
/* RT_USING_RTC */
}
}
...
@@ -344,17 +366,13 @@ RTM_EXPORT(timegm);
...
@@ -344,17 +366,13 @@ RTM_EXPORT(timegm);
/* TODO: timezone */
/* TODO: timezone */
int
gettimeofday
(
struct
timeval
*
tv
,
struct
timezone
*
tz
)
int
gettimeofday
(
struct
timeval
*
tv
,
struct
timezone
*
tz
)
{
{
time_t
t
=
time
(
RT_NULL
);
if
(
tv
!=
RT_NULL
&&
get_timeval
(
tv
)
>
0
)
if
(
tv
!=
RT_NULL
&&
t
!=
(
time_t
)
-
1
)
{
{
tv
->
tv_sec
=
t
;
tv
->
tv_usec
=
0
;
return
0
;
return
0
;
}
}
else
else
{
{
errno
=
E
NOSYS
;
errno
=
E
FAULT
;
return
-
1
;
return
-
1
;
}
}
}
}
...
@@ -365,11 +383,19 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
...
@@ -365,11 +383,19 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
{
{
if
(
tv
!=
RT_NULL
)
if
(
tv
!=
RT_NULL
)
{
{
return
stime
((
const
time_t
*
)
&
tv
->
tv_sec
);
if
(
tv
->
tv_sec
>=
0
&&
tv
->
tv_usec
>=
0
)
{
return
stime
((
const
time_t
*
)
&
tv
->
tv_sec
);
}
else
{
errno
=
EINVAL
;
return
-
1
;
}
}
}
else
else
{
{
errno
=
E
NOSYS
;
errno
=
E
FAULT
;
return
-
1
;
return
-
1
;
}
}
}
}
...
...
include/rtdef.h
浏览文件 @
dfeacfb6
...
@@ -962,10 +962,12 @@ enum rt_device_class_type
...
@@ -962,10 +962,12 @@ enum rt_device_class_type
#define RT_DEVICE_CTRL_BLK_AUTOREFRESH 0x13
/**< block device : enter/exit auto refresh mode */
#define RT_DEVICE_CTRL_BLK_AUTOREFRESH 0x13
/**< block device : enter/exit auto refresh mode */
#define RT_DEVICE_CTRL_NETIF_GETMAC 0x10
/**< get mac address */
#define RT_DEVICE_CTRL_NETIF_GETMAC 0x10
/**< get mac address */
#define RT_DEVICE_CTRL_MTD_FORMAT 0x10
/**< format a MTD device */
#define RT_DEVICE_CTRL_MTD_FORMAT 0x10
/**< format a MTD device */
#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10
/**< get time */
#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10
/**< get
second
time */
#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11
/**< set time */
#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11
/**< set
second
time */
#define RT_DEVICE_CTRL_RTC_GET_ALARM 0x12
/**< get alarm */
#define RT_DEVICE_CTRL_RTC_GET_ALARM 0x12
/**< get alarm */
#define RT_DEVICE_CTRL_RTC_SET_ALARM 0x13
/**< set alarm */
#define RT_DEVICE_CTRL_RTC_SET_ALARM 0x13
/**< set alarm */
#define RT_DEVICE_CTRL_RTC_GET_TIME_US 0x14
/**< get microsecond time */
#define RT_DEVICE_CTRL_RTC_SET_TIME_US 0x15
/**< set microsecond time */
typedef
struct
rt_device
*
rt_device_t
;
typedef
struct
rt_device
*
rt_device_t
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录