跳轉到內容

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