Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243874
  • 博文数量: 49
  • 博客积分: 1595
  • 博客等级: 上尉
  • 技术积分: 497
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 15:22
文章分类

全部博文(49)

文章存档

2011年(19)

2010年(30)

我的朋友

分类: LINUX

2011-04-04 13:45:10

LATCH 宏中定义了要写往 PIT (8254) 计数器0 中的值,该值可以让计数器周期性的产生中断。LATCH 定义在 include/linux/jiffies.h 中:
1
2
/* LATCH is used in the interval timer and ftape setup. */
#define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ)    /* For divider */

其中 被定义为 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,可见在此情况下损失了不少精度,所以要用四舍五入。
阅读(3006) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~