跳到內容

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
華夏公益教科書