曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4596|回复: 0
打印 上一主题 下一主题

产生HZ的PIT设置值 | LATCH

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-3-31 21:22:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,可见在此情况下损失了不少精度,所以要用四舍五入。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-11-1 07:53 , Processed in 0.073880 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表