linux 时钟中断

80x86体系结构上,内核必须显式的与四种时钟打交道 

1、实时时钟Real time clock,RTC

2、时间戳计数器Time stamp counter,TSC

3、可编程间隔定时器Programmable interval timer, PIT


实时时钟:rtc
基本上所有的PC都包含实时时钟,独立于CPU与所有其他芯片,依靠一个独立的小电池供电给RTC中的振荡器.即使关闭PC电源,还会继续运转.Linux本身只使用RTC获得时间和日期.对应的设备文件为/dev/rtc(可以通过设备文件对其编程).内核通过0x70和0x71两个端口访问RTC,系统管理员可以通过执行时钟程序设置时钟


时间戳计数器TSC

在80x86微处理器中,有一个CLK输入引线接收外部振荡器的时钟信号.从pentium开始,很多80x86微处理器都引入了一个TSC一个64位的、用作时间戳计数器的寄存器它在每个时钟信号(CLK)到来时+1例如时钟频率400MHz的微处理器,TSC每2.5ns就+1rdtsc指令用于读该寄存器注意使用这个寄存器时,内核必须考虑时钟信号的频率.在Linux2.6.26中,rdtscll()和rdtscl()用来读取TSC的值。

static __always_inline unsigned long long __native_read_tsc(void)

{

DECLARE_ARGS(val, low, high);

asm volatile("rdtsc" : EAX_EDX_RET(val, low, high));

return EAX_EDX_VAL(val, low, high);

}

与后面介绍的可编程间隔定时器相比,TSC可以获得更精确的时钟为此,Linux在系统初始化的时候必须确定时钟信号CLK的频率(即CPU的实际频率),实际上通过使用tsc_calibrate来获取的。其原理是:根据在一个相对较长的时间间隔内(约5ms)所发生的TSC计数的个数进行计算,那个间隔由可编程间隔定时器给出,由于只在系统初始化的时候运行一次,因此本程序可以执行较长时间,而不会引起问题。经过适当编程后,可以周期性的给出时钟中断。通常是8254 CMOS芯片

使用I/O端口0x40~0x43,Linux将PIT编程为:100Hz、1000Hz

通过IRQ0发出时钟中断每若干毫秒(100Hz为10ms)产生一次时钟中断,即一个tick。 

static struct irqaction irq0  = {

.handler = timer_interrupt,

.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,

.name = "timer"

};

一下使用引用别人的文章:http://blog.chinaunix.net/uid-23951161-id-206711.html
这里介绍一个与系统时钟相关的宏定义:

HZ   :宏定义Hz记录了不同体系结构下,系统时钟所要求的可编程定时器产生中断的频率。

CLOCK_TICK_RATE:

宏定义CLOCK_TICK_RATE记录了不同体系结构下,驱动可编程定时器工作的输入时钟频率。
LATCH:

宏定义LATCH记录了上述两个宏定义的比值,用于在内核初始化过程中设置可编程定时器中计数器寄存器counter的初始值。

三个宏的关系为:
#define LATCH  ((CLOCK_TICK_RATE + HZ/2) / HZ)

 其中 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,可见在此情况下损失了不少精度,所以要用四舍五入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值