閱讀904 返回首頁    go 阿裏雲 go 技術社區[雲棲]


時間子係統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);
}

最後更新:2017-04-03 14:54:43

  上一篇:go 調度子係統1_調度子係統初始化
  下一篇:go 劍指Offer之和為S的兩個數字