admin 管理员组文章数量: 1184232
// 获取系统时间
// 注:将timespec转换为timeval
1.1 void do_gettimeofday(struct timeval *tv)
{
struct timespec now;
getnstimeofday(&now);
tv->tv_sec = now.tv_sec;
tv->tv_usec = now.tv_nsec/1000;
}
// 获取纳秒级系统时间
// 函数任务:
// 1.获取墙上时间t
// 2.获取距离上次更新xtime以来经历的纳秒deltat
// 3.t+deltat计算精确的当前时间
1.2 void getnstimeofday(struct timespec *ts)
{
unsigned long seq;
s64 nsecs;
do {
seq = read_seqbegin(&xtime_lock);
//获取墙上时间t
*ts = xtime;
//获取距离上次更新xtime以来经历的纳秒deltat
nsecs = timekeeping_get_ns();
} while (read_seqretry(&xtime_lock, seq));
//t+deltat得到精确时间
timespec_add_ns(ts, nsecs);
}
// 计算距离上次更新xtime以来经历的纳秒数
// 函数任务:
// 1.使用timerkeeper的时钟源读取当前的cycle
// 2.计算距离上次更新xtime以来的cycle delta
// 3.转换cycle delta到ns
// 注:
// 使用ntp矫正过的shift和mult,转换cycle delta到ns.
1.3 static inline s64 timekeeping_get_ns(void)
{
cycle_t cycle_now, cycle_delta;
struct clocksource *clock;
/* read clocksource: */
clock = timekeeper.clock;
cycle_now = clock->read(clock);
cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
return clocksource_cyc2ns(cycle_delta, timekeeper.mult,
timekeeper.shift);
}
// 获取系统单调时间
// 函数任务:
// 1.获取单调时间t
// 2.计算距离上次更新xtime以来的deltat
// 3.t+deltat得到精确时间
// 注:
// 1.ktime_get获取自系统启动以来的单调时间
// 2.墙上时间(xtime)加上wall_to_monotonic获取单调时间
2.1 ktime_t ktime_get(void)
{
unsigned int seq;
s64 secs, nsecs;
do {
seq = read_seqbegin(&xtime_lock);
//获取单调时间t
secs = xtime.tv_sec + wall_to_monotonic.tv_sec;
nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec;
//计算距离上次更新xtime以来的deltat
nsecs += timekeeping_get_ns();
} while (read_seqretry(&xtime_lock, seq));
//t+deltat得到精确时间
return ktime_add_ns(ktime_set(secs, 0), nsecs);
}版权声明:本文标题:时间掌控者:如何在Flash中心利用系统时间子系统 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1773481500a3562425.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论