x86 汇编/可编程间隔定时器
外观
< 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