Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
rt-thread
提交
291fe361
R
rt-thread
项目概览
BaiXuePrincess
/
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,发现更多精彩内容 >>
提交
291fe361
编写于
2月 12, 2021
作者:
mysterywolf
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[pthread][libc] move 'clock_time' to libc
上级
f0805a79
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
228 addition
and
253 deletion
+228
-253
components/libc/compilers/common/sys/time.h
components/libc/compilers/common/sys/time.h
+33
-0
components/libc/compilers/common/time.c
components/libc/compilers/common/time.c
+162
-1
components/libc/pthreads/posix_sleep.c
components/libc/pthreads/posix_sleep.c
+0
-0
components/libc/pthreads/pthread.c
components/libc/pthreads/pthread.c
+33
-0
components/libc/time/SConscript
components/libc/time/SConscript
+0
-12
components/libc/time/clock_time.c
components/libc/time/clock_time.c
+0
-188
components/libc/time/clock_time.h
components/libc/time/clock_time.h
+0
-52
未找到文件。
components/libc/compilers/common/sys/time.h
浏览文件 @
291fe361
...
...
@@ -10,6 +10,7 @@
#ifndef _SYS_TIME_H_
#define _SYS_TIME_H_
#include <rtconfig.h>
#include <time.h>
#ifdef __cplusplus
...
...
@@ -53,6 +54,38 @@ 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 RT_USING_PTHREADS
/* posix clock and timer */
#define MILLISECOND_PER_SECOND 1000UL
#define MICROSECOND_PER_SECOND 1000000UL
#define NANOSECOND_PER_SECOND 1000000000UL
#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND)
#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
#ifndef CLOCK_REALTIME
#define CLOCK_REALTIME 1
#endif
#define CLOCK_CPUTIME_ID 2
#ifndef CLOCK_PROCESS_CPUTIME_ID
#define CLOCK_PROCESS_CPUTIME_ID CLOCK_CPUTIME_ID
#endif
#ifndef CLOCK_THREAD_CPUTIME_ID
#define CLOCK_THREAD_CPUTIME_ID CLOCK_CPUTIME_ID
#endif
#ifndef CLOCK_MONOTONIC
#define CLOCK_MONOTONIC 4
#endif
int
clock_getres
(
clockid_t
clockid
,
struct
timespec
*
res
);
int
clock_gettime
(
clockid_t
clockid
,
struct
timespec
*
tp
);
int
clock_settime
(
clockid_t
clockid
,
const
struct
timespec
*
tp
);
#endif
/*RT_USING_PTHREADS*/
#ifdef __cplusplus
}
#endif
...
...
components/libc/compilers/common/time.c
浏览文件 @
291fe361
...
...
@@ -14,6 +14,9 @@
* 2021-02-11 Meco Man fix bug #3183 - align days[] and months[] to 4 bytes
* add difftime()
* 2021-02-12 Meco Man add errno
* 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
*/
#include <sys/time.h>
...
...
@@ -26,7 +29,7 @@
#define SPD 24*60*60
/* days per month -- nonleap! */
const
short
__spm
[
13
]
=
static
const
short
__spm
[
13
]
=
{
0
,
(
31
),
...
...
@@ -97,12 +100,14 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r)
r
->
tm_isdst
=
0
;
return
r
;
}
RTM_EXPORT
(
gmtime_r
);
struct
tm
*
gmtime
(
const
time_t
*
t
)
{
static
struct
tm
tmp
;
return
gmtime_r
(
t
,
&
tmp
);
}
RTM_EXPORT
(
gmtime
);
/*TODO: timezone */
struct
tm
*
localtime_r
(
const
time_t
*
t
,
struct
tm
*
r
)
...
...
@@ -114,18 +119,21 @@ struct tm* localtime_r(const time_t* t, struct tm* r)
local_tz
=
*
t
+
utc_plus
*
3600
;
return
gmtime_r
(
&
local_tz
,
r
);
}
RTM_EXPORT
(
localtime_r
);
struct
tm
*
localtime
(
const
time_t
*
t
)
{
static
struct
tm
tmp
;
return
localtime_r
(
t
,
&
tmp
);
}
RTM_EXPORT
(
localtime
);
/* TODO: timezone */
time_t
mktime
(
struct
tm
*
const
t
)
{
return
timegm
(
t
);
}
RTM_EXPORT
(
mktime
);
char
*
asctime_r
(
const
struct
tm
*
t
,
char
*
buf
)
{
...
...
@@ -147,28 +155,33 @@ char* asctime_r(const struct tm *t, char *buf)
buf
[
24
]
=
'\n'
;
return
buf
;
}
RTM_EXPORT
(
asctime_r
);
char
*
asctime
(
const
struct
tm
*
timeptr
)
{
static
char
buf
[
25
];
return
asctime_r
(
timeptr
,
buf
);
}
RTM_EXPORT
(
asctime
);
char
*
ctime_r
(
const
time_t
*
tim_p
,
char
*
result
)
{
struct
tm
tm
;
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
));
}
RTM_EXPORT
(
ctime
);
double
difftime
(
time_t
tim1
,
time_t
tim2
)
{
return
(
double
)(
tim1
-
tim2
);
}
RTM_EXPORT
(
difftime
);
/**
* Returns the current time.
...
...
@@ -216,11 +229,13 @@ RT_WEAK time_t time(time_t *t)
return
time_now
;
}
RTM_EXPORT
(
time
);
RT_WEAK
clock_t
clock
(
void
)
{
return
rt_tick_get
();
}
RTM_EXPORT
(
clock
);
int
stime
(
const
time_t
*
t
)
{
...
...
@@ -246,6 +261,7 @@ int stime(const time_t *t)
return
-
1
;
#endif
/* RT_USING_RTC */
}
RTM_EXPORT
(
stime
);
time_t
timegm
(
struct
tm
*
const
t
)
{
...
...
@@ -320,6 +336,7 @@ time_t timegm(struct tm * const t)
i
=
60
;
return
((
day
+
t
->
tm_hour
)
*
i
+
t
->
tm_min
)
*
i
+
t
->
tm_sec
;
}
RTM_EXPORT
(
timegm
);
/* TODO: timezone */
int
gettimeofday
(
struct
timeval
*
tv
,
struct
timezone
*
tz
)
...
...
@@ -338,6 +355,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz)
return
-
1
;
}
}
RTM_EXPORT
(
gettimeofday
);
/* TODO: timezone */
int
settimeofday
(
const
struct
timeval
*
tv
,
const
struct
timezone
*
tz
)
...
...
@@ -352,3 +370,146 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
return
-
1
;
}
}
RTM_EXPORT
(
settimeofday
);
#ifdef RT_USING_PTHREADS
static
struct
timeval
_timevalue
;
static
int
clock_time_system_init
()
{
time_t
time
;
rt_tick_t
tick
;
rt_device_t
device
;
time
=
0
;
device
=
rt_device_find
(
"rtc"
);
if
(
device
!=
RT_NULL
)
{
/* get realtime seconds */
rt_device_control
(
device
,
RT_DEVICE_CTRL_RTC_GET_TIME
,
&
time
);
}
/* get tick */
tick
=
rt_tick_get
();
_timevalue
.
tv_usec
=
(
tick
%
RT_TICK_PER_SECOND
)
*
MICROSECOND_PER_TICK
;
_timevalue
.
tv_sec
=
time
-
tick
/
RT_TICK_PER_SECOND
-
1
;
return
0
;
}
INIT_COMPONENT_EXPORT
(
clock_time_system_init
);
int
clock_getres
(
clockid_t
clockid
,
struct
timespec
*
res
)
{
int
ret
=
0
;
if
(
res
==
RT_NULL
)
{
rt_set_errno
(
EINVAL
);
return
-
1
;
}
switch
(
clockid
)
{
case
CLOCK_REALTIME
:
res
->
tv_sec
=
0
;
res
->
tv_nsec
=
NANOSECOND_PER_SECOND
/
RT_TICK_PER_SECOND
;
break
;
#ifdef RT_USING_CPUTIME
case
CLOCK_CPUTIME_ID
:
res
->
tv_sec
=
0
;
res
->
tv_nsec
=
clock_cpu_getres
();
break
;
#endif
default:
ret
=
-
1
;
rt_set_errno
(
EINVAL
);
break
;
}
return
ret
;
}
RTM_EXPORT
(
clock_getres
);
int
clock_gettime
(
clockid_t
clockid
,
struct
timespec
*
tp
)
{
int
ret
=
0
;
if
(
tp
==
RT_NULL
)
{
rt_set_errno
(
EINVAL
);
return
-
1
;
}
switch
(
clockid
)
{
case
CLOCK_REALTIME
:
{
/* get tick */
int
tick
=
rt_tick_get
();
tp
->
tv_sec
=
_timevalue
.
tv_sec
+
tick
/
RT_TICK_PER_SECOND
;
tp
->
tv_nsec
=
(
_timevalue
.
tv_usec
+
(
tick
%
RT_TICK_PER_SECOND
)
*
MICROSECOND_PER_TICK
)
*
1000
;
}
break
;
#ifdef RT_USING_CPUTIME
case
CLOCK_CPUTIME_ID
:
{
float
unit
=
0
;
long
long
cpu_tick
;
unit
=
clock_cpu_getres
();
cpu_tick
=
clock_cpu_gettime
();
tp
->
tv_sec
=
((
int
)(
cpu_tick
*
unit
))
/
NANOSECOND_PER_SECOND
;
tp
->
tv_nsec
=
((
int
)(
cpu_tick
*
unit
))
%
NANOSECOND_PER_SECOND
;
}
break
;
#endif
default:
rt_set_errno
(
EINVAL
);
ret
=
-
1
;
}
return
ret
;
}
RTM_EXPORT
(
clock_gettime
);
int
clock_settime
(
clockid_t
clockid
,
const
struct
timespec
*
tp
)
{
int
second
;
rt_tick_t
tick
;
rt_device_t
device
;
if
((
clockid
!=
CLOCK_REALTIME
)
||
(
tp
==
RT_NULL
))
{
rt_set_errno
(
EINVAL
);
return
-
1
;
}
/* get second */
second
=
tp
->
tv_sec
;
/* get tick */
tick
=
rt_tick_get
();
/* update timevalue */
_timevalue
.
tv_usec
=
MICROSECOND_PER_SECOND
-
(
tick
%
RT_TICK_PER_SECOND
)
*
MICROSECOND_PER_TICK
;
_timevalue
.
tv_sec
=
second
-
tick
/
RT_TICK_PER_SECOND
-
1
;
/* update for RTC device */
device
=
rt_device_find
(
"rtc"
);
if
(
device
!=
RT_NULL
)
{
/* set realtime seconds */
rt_device_control
(
device
,
RT_DEVICE_CTRL_RTC_SET_TIME
,
&
second
);
}
else
return
-
1
;
return
0
;
}
RTM_EXPORT
(
clock_settime
);
#endif
/*RT_USING_PTHREADS*/
components/libc/
time
/posix_sleep.c
→
components/libc/
pthreads
/posix_sleep.c
浏览文件 @
291fe361
文件已移动
components/libc/pthreads/pthread.c
浏览文件 @
291fe361
...
...
@@ -13,6 +13,7 @@
#include <rthw.h>
#include <pthread.h>
#include <sched.h>
#include <sys/time.h>
#include "pthread_internal.h"
RT_DEFINE_SPINLOCK
(
pth_lock
);
...
...
@@ -688,3 +689,35 @@ int pthread_cancel(pthread_t thread)
}
RTM_EXPORT
(
pthread_cancel
);
int
clock_time_to_tick
(
const
struct
timespec
*
time
)
{
int
tick
;
int
nsecond
,
second
;
struct
timespec
tp
;
RT_ASSERT
(
time
!=
RT_NULL
);
tick
=
RT_WAITING_FOREVER
;
if
(
time
!=
NULL
)
{
/* get current tp */
clock_gettime
(
CLOCK_REALTIME
,
&
tp
);
if
((
time
->
tv_nsec
-
tp
.
tv_nsec
)
<
0
)
{
nsecond
=
NANOSECOND_PER_SECOND
-
(
tp
.
tv_nsec
-
time
->
tv_nsec
);
second
=
time
->
tv_sec
-
tp
.
tv_sec
-
1
;
}
else
{
nsecond
=
time
->
tv_nsec
-
tp
.
tv_nsec
;
second
=
time
->
tv_sec
-
tp
.
tv_sec
;
}
tick
=
second
*
RT_TICK_PER_SECOND
+
nsecond
*
RT_TICK_PER_SECOND
/
NANOSECOND_PER_SECOND
;
if
(
tick
<
0
)
tick
=
0
;
}
return
tick
;
}
RTM_EXPORT
(
clock_time_to_tick
);
components/libc/time/SConscript
已删除
100644 → 0
浏览文件 @
f0805a79
# RT-Thread building script for component
from
building
import
*
cwd
=
GetCurrentDir
()
src
=
Glob
(
'*.c'
)
+
Glob
(
'*.cpp'
)
CPPPATH
=
[
cwd
]
group
=
DefineGroup
(
'libc'
,
src
,
depend
=
[
'RT_USING_PTHREADS'
],
CPPPATH
=
CPPPATH
)
Return
(
'group'
)
components/libc/time/clock_time.c
已删除
100644 → 0
浏览文件 @
f0805a79
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-12-08 Bernard fix the issue of _timevalue.tv_usec initialization,
* which found by Rob <rdent@iinet.net.au>
*/
#include <rtthread.h>
#include <pthread.h>
#include "clock_time.h"
static
struct
timeval
_timevalue
;
int
clock_time_system_init
()
{
time_t
time
;
rt_tick_t
tick
;
rt_device_t
device
;
time
=
0
;
device
=
rt_device_find
(
"rtc"
);
if
(
device
!=
RT_NULL
)
{
/* get realtime seconds */
rt_device_control
(
device
,
RT_DEVICE_CTRL_RTC_GET_TIME
,
&
time
);
}
/* get tick */
tick
=
rt_tick_get
();
_timevalue
.
tv_usec
=
(
tick
%
RT_TICK_PER_SECOND
)
*
MICROSECOND_PER_TICK
;
_timevalue
.
tv_sec
=
time
-
tick
/
RT_TICK_PER_SECOND
-
1
;
return
0
;
}
INIT_COMPONENT_EXPORT
(
clock_time_system_init
);
int
clock_time_to_tick
(
const
struct
timespec
*
time
)
{
int
tick
;
int
nsecond
,
second
;
struct
timespec
tp
;
RT_ASSERT
(
time
!=
RT_NULL
);
tick
=
RT_WAITING_FOREVER
;
if
(
time
!=
NULL
)
{
/* get current tp */
clock_gettime
(
CLOCK_REALTIME
,
&
tp
);
if
((
time
->
tv_nsec
-
tp
.
tv_nsec
)
<
0
)
{
nsecond
=
NANOSECOND_PER_SECOND
-
(
tp
.
tv_nsec
-
time
->
tv_nsec
);
second
=
time
->
tv_sec
-
tp
.
tv_sec
-
1
;
}
else
{
nsecond
=
time
->
tv_nsec
-
tp
.
tv_nsec
;
second
=
time
->
tv_sec
-
tp
.
tv_sec
;
}
tick
=
second
*
RT_TICK_PER_SECOND
+
nsecond
*
RT_TICK_PER_SECOND
/
NANOSECOND_PER_SECOND
;
if
(
tick
<
0
)
tick
=
0
;
}
return
tick
;
}
RTM_EXPORT
(
clock_time_to_tick
);
int
clock_getres
(
clockid_t
clockid
,
struct
timespec
*
res
)
{
int
ret
=
0
;
if
(
res
==
RT_NULL
)
{
rt_set_errno
(
EINVAL
);
return
-
1
;
}
switch
(
clockid
)
{
case
CLOCK_REALTIME
:
res
->
tv_sec
=
0
;
res
->
tv_nsec
=
NANOSECOND_PER_SECOND
/
RT_TICK_PER_SECOND
;
break
;
#ifdef RT_USING_CPUTIME
case
CLOCK_CPUTIME_ID
:
res
->
tv_sec
=
0
;
res
->
tv_nsec
=
clock_cpu_getres
();
break
;
#endif
default:
ret
=
-
1
;
rt_set_errno
(
EINVAL
);
break
;
}
return
ret
;
}
RTM_EXPORT
(
clock_getres
);
int
clock_gettime
(
clockid_t
clockid
,
struct
timespec
*
tp
)
{
int
ret
=
0
;
if
(
tp
==
RT_NULL
)
{
rt_set_errno
(
EINVAL
);
return
-
1
;
}
switch
(
clockid
)
{
case
CLOCK_REALTIME
:
{
/* get tick */
int
tick
=
rt_tick_get
();
tp
->
tv_sec
=
_timevalue
.
tv_sec
+
tick
/
RT_TICK_PER_SECOND
;
tp
->
tv_nsec
=
(
_timevalue
.
tv_usec
+
(
tick
%
RT_TICK_PER_SECOND
)
*
MICROSECOND_PER_TICK
)
*
1000
;
}
break
;
#ifdef RT_USING_CPUTIME
case
CLOCK_CPUTIME_ID
:
{
float
unit
=
0
;
long
long
cpu_tick
;
unit
=
clock_cpu_getres
();
cpu_tick
=
clock_cpu_gettime
();
tp
->
tv_sec
=
((
int
)(
cpu_tick
*
unit
))
/
NANOSECOND_PER_SECOND
;
tp
->
tv_nsec
=
((
int
)(
cpu_tick
*
unit
))
%
NANOSECOND_PER_SECOND
;
}
break
;
#endif
default:
rt_set_errno
(
EINVAL
);
ret
=
-
1
;
}
return
ret
;
}
RTM_EXPORT
(
clock_gettime
);
int
clock_settime
(
clockid_t
clockid
,
const
struct
timespec
*
tp
)
{
int
second
;
rt_tick_t
tick
;
rt_device_t
device
;
if
((
clockid
!=
CLOCK_REALTIME
)
||
(
tp
==
RT_NULL
))
{
rt_set_errno
(
EINVAL
);
return
-
1
;
}
/* get second */
second
=
tp
->
tv_sec
;
/* get tick */
tick
=
rt_tick_get
();
/* update timevalue */
_timevalue
.
tv_usec
=
MICROSECOND_PER_SECOND
-
(
tick
%
RT_TICK_PER_SECOND
)
*
MICROSECOND_PER_TICK
;
_timevalue
.
tv_sec
=
second
-
tick
/
RT_TICK_PER_SECOND
-
1
;
/* update for RTC device */
device
=
rt_device_find
(
"rtc"
);
if
(
device
!=
RT_NULL
)
{
/* set realtime seconds */
rt_device_control
(
device
,
RT_DEVICE_CTRL_RTC_SET_TIME
,
&
second
);
}
else
return
-
1
;
return
0
;
}
RTM_EXPORT
(
clock_settime
);
components/libc/time/clock_time.h
已删除
100644 → 0
浏览文件 @
f0805a79
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2017-12-31 Bernard the first version
*/
#ifndef CLOCK_TIME_H__
#define CLOCK_TIME_H__
#ifdef __cplusplus
extern
"C"
{
#endif
/* posix clock and timer */
#define MILLISECOND_PER_SECOND 1000UL
#define MICROSECOND_PER_SECOND 1000000UL
#define NANOSECOND_PER_SECOND 1000000000UL
#define MILLISECOND_PER_TICK (MILLISECOND_PER_SECOND / RT_TICK_PER_SECOND)
#define MICROSECOND_PER_TICK (MICROSECOND_PER_SECOND / RT_TICK_PER_SECOND)
#define NANOSECOND_PER_TICK (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND)
#ifndef CLOCK_REALTIME
#define CLOCK_REALTIME 1
#endif
#define CLOCK_CPUTIME_ID 2
#ifndef CLOCK_PROCESS_CPUTIME_ID
#define CLOCK_PROCESS_CPUTIME_ID CLOCK_CPUTIME_ID
#endif
#ifndef CLOCK_THREAD_CPUTIME_ID
#define CLOCK_THREAD_CPUTIME_ID CLOCK_CPUTIME_ID
#endif
#ifndef CLOCK_MONOTONIC
#define CLOCK_MONOTONIC 4
#endif
int
clock_getres
(
clockid_t
clockid
,
struct
timespec
*
res
);
int
clock_gettime
(
clockid_t
clockid
,
struct
timespec
*
tp
);
int
clock_settime
(
clockid_t
clockid
,
const
struct
timespec
*
tp
);
#ifdef __cplusplus
}
#endif
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录