LATCH 宏中定义了要写往 PIT (8254) 计数器0 中的值,该值可以让计数器周期性的产生中断。LATCH 定义在 include/linux/jiffies.h 中:
[C++] 纯文本查看 复制代码 /* LATCH is used in the interval timer and ftape setup. */
#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */
其中 CLOCK_TICK_RATE 被定义为 1193182 。
CLOCK_TICK_RATE 为 1 秒内的时钟脉冲个数;假设要让 1 秒内计数器发出中断 HZ 次,那么每个 HZ 就需要 (CLOCK_TICK_RATE / HZ) 个时钟,即 :
LATCH = CLOCK_TICK_RATE / HZ
也就是,在将 LATCH 写往 PIT 的 计数器0 后,计数器每当一个时钟脉冲过来,它就会减 1,当为 0 时,就在 IRQ0 上产生一次时钟中断,也就是一次时钟滴答(clock tick) 。
上面的宏中,CLOCK_TICK_RATE 加上 HZ/2 后再除以 HZ 是为了获得最接近的整数值,故而采取了四舍五入法。举个例子来说,先假设 CLOCK_TICK_RATE 为 1193182 ,而 HZ 为 1000,那么 1193182/1000 = 1193,而 1193182%1000 = 182 ;那如果将 CLOCK_TICK_RATE 设为 1193882,那 1193882 / 1000 = 1193, 但 1193882%1000 = 882,可见在此情况下损失了不少精度,所以要用四舍五入。 |