既然时钟源对外提供了计数能力,那么可以通过哪些接口呢?


 


这里需要唯一说明的是,整个时钟源模块对外只有一个接口,即提供到timekeeping使用,其读取计数值计数,计算时间。


核心函数是timekeeping_notify();


 


这个函数在选取合适的clocksource后被调用。


/**
 * timekeeping_notify - Install a new clock source
 * @clock:  pointer to the clock source
 *
 * This function is called from clocksource.c after a new, better clock
 * source has been registered. The caller holds the clocksource_mutex.
 */
int timekeeping_notify(struct clocksource *clock)
{
 struct timekeeper *tk = &tk_core.timekeeper;
 if (tk->tkr_mono.clock == clock)
  return 0;
 stop_machine(change_clocksource, clock, NULL);
 tick_clock_notify();
 return tk->tkr_mono.clock == clock ? 0 : -1;
}

当然在timer在oneshot模式下,即配置CONFIG_TICK_ONESHOT时,通知tick sched模块。
/**
 * Async notification about clocksource changes
 */
void tick_clock_notify(void)
{
 int cpu;
 for_each_possible_cpu(cpu)
  set_bit(0, &per_cpu(tick_cpu_sched, cpu).check_clocks);
}