Linux 时钟管理
void tick_setup_sched_timer(void) { struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); ktime_t now = ktime_get(); u64 offset; /* * Emulate tick processing via per-CPU hrtimers: */ hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); ts->sched_timer.function = tick_sched_timer; . . . . for (;;) { hrtimer_forward(&ts->sched_timer, now, tick_period); hrtimer_start_expires(&ts->sched_timer, HRTIMER_MODE_ABS_PINNED); /* Check, if the timer was already in the past */ if (hrtimer_active(&ts->sched_timer)) break; now = ktime_get(); } . . . . } 这个函数使用 tick_cpu_sched 这个 per-CPU 变量来模拟原来 tick device 的功能。tick_cpu_sched 本身绑定了一个 hrtimer,这个 hrtimer 的超时值为下一个 tick,回调函数为 tick_sched_timer。因此,每过一个 tick,tick_sched_timer 就会被调用一次,在这个回调函数中首先完成原来 tick device 的工作,然后设置下一次的超时值为再下一个 tick,从而达到了模拟周期运行的 tick device 的功能。如果所有的 CPU 在同一时间点被唤醒,并发执行 tick 时可能会出现 lock 竞争以及 cache-line 冲突,为此 Linux 内核做了特别处理:如果假设 CPU 的个数为 N,则所有的 CPU 都在 tick_period 前 1/2 的时间内执行 tick 工作,并且每个 CPU 的执行间隔是 tick_period / (2N),见清单 8 所示: 清单 8. hrtimer 在高精度模式下 tick 执行周期的设置
|
- stm8s开发(五) TIMER的使用:定时!(09-18)
- STM8S Timer2_OC1_PWM1输出模式(12-03)
- TimerA流水灯问题分析(12-02)
- LPC2103之timer0 ang timer1(11-29)
- MSP430F5529 (六)定时器Timer_A-1(11-28)
- MSP430F5529 (六)定时器Timer_A-2(11-28)