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