跳转到内容

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
华夏公益教科书