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