时间子系统15_获取系统时间

简介:
//	获取系统时间
//	注:将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);
}

目录
相关文章
|
定位技术 C#
C#编程练习(03):北斗时间系统、GPS时间系统及其与UTC时间系统之间的转换
C#编程练习(03):北斗时间系统、GPS时间系统及其与UTC时间系统之间的转换
C#编程练习(03):北斗时间系统、GPS时间系统及其与UTC时间系统之间的转换
封装时间戳转具体时间工具
封装时间戳转具体时间工具
143 0
封装时间戳转具体时间工具
|
传感器 芯片
使用系统定时器SysTick实现精确延时微秒和毫秒函数
使用系统定时器SysTick实现精确延时微秒和毫秒函数
432 0
使用系统定时器SysTick实现精确延时微秒和毫秒函数
|
Ubuntu Linux 芯片
嵌入式Linux 硬件时间-系统时间-时区设置
Linux系统时间分为两种:系统时间和硬件时间。系统时间为Linux内核时间,硬件时间一般为BOIS中的RTC时间。Linux内核在启动时,会尝试读取BIOS中的RTC时间,并以此为基准设置系统时间。内核启动之后,系统时间和硬件即为两个独立的时间,各自运行。
928 0
|
Linux
介绍Linux下时间处理的相关操作(RTC、延时、闹钟、转换)
介绍Linux下时间处理的相关操作(RTC、延时、闹钟、转换)
512 0
介绍Linux下时间处理的相关操作(RTC、延时、闹钟、转换)
QT应用编程: 获取系统当前时间以及1970到现在的总秒数
QT应用编程: 获取系统当前时间以及1970到现在的总秒数
490 0