x86 汇编/可编程间隔定时器
外观
< X86 汇编
可编程间隔定时器 (PIT) 是现代计算机中必不可少的组成部分,尤其是在多任务环境中。通过设置不同的寄存器值,PIT 芯片可以向上或向下计数,以特定速率计数,并在特定时间触发中断。定时器可以设置为循环模式,以便在触发时自动重新开始计数,也可以设置为一次性倒计时模式。
在较新的硬件上,很可能可以使用 HPET (高精度事件定时器),它是 PIT 概念的演进。
PIT 包含一个晶体振荡器,它发出一个 1193182 hz 的信号。此输出频率被三个不同的值除以,为 CPU 提供三个输出通道。通道 0 被大多数操作系统用作系统定时器。通道 1 用于刷新 DRAM,但现在不再使用,甚至可能无法访问。通道 2 用于控制 PC 扬声器。其中,通道 0 是最常遇到的通道。
要使 PIT 以特定频率 f 触发,您需要确定一个整数 x,使得 1193182 / x = f。这是一个容易解决的问题,公式如下
- x = 1193182 / f
这种除法的实际工作方式是,每个除数都存储在一个内部寄存器中。在每个时钟脉冲上,寄存器都会递减。只有当它达到 0 时,时钟脉冲才能继续传送到 CPU。较高的除数会导致较低的频率,反之亦然。
请注意,由于除数是 16 位,并且 0 的值被解释为 65536,因此可产生频率存在限制
- max = 1193182 / 1 = 1193182 hz
- min = 1193182 / 65536 ≈ 18.2065 hz
此最终值也是频率的分辨率,即每个连续的可能频率相差 18.2065 hz。
可以通过四个端口访问 PIT,三个用于三个通道,一个用于命令
通道 0 | 0x40 |
通道 1 | 0x41 |
通道 2 | 0x42 |
命令 | 0x43 |
一项常见的任务是设置通道 0(系统定时器)的频率。如果需要 100 hz 的频率,我们可以看到必要的除数是 1193182 / 100 = 11931。此值必须发送到 PIT,并拆分为高字节和低字节。
mov al, 0x36
out 0x43, al ;tell the PIT which channel we're setting
mov ax, 11931
out 0x40, al ;send low byte
mov al, ah
out 0x40, al ;send high byte