?? 可編程間隔定時器.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0068)http://rammaker.cosoft.org.cn/store/bkerndev_zh_CN_beta/Docs/pit.htm -->
<HTML><HEAD><TITLE>Bran的內核開發指南:可編程間隔定時器(PIT)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=GB2312"><LINK
href="layout.css" type=text/css rel=stylesheet>
<META content="MSHTML 6.00.2900.3199" name=GENERATOR></HEAD>
<BODY>
<H2><FONT face=Tahoma>可編程間隔定時器:一個系統時鐘</FONT></H2>
<P><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">可編程間隔定時器(</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">Programmable Interval
Timer</SPAN><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">,</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">PIT</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">,</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"> 8253</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">或</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">8254</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">模型),也叫做系統時鐘,是一個非常有用的芯片,可以在一定時間間隔精確地產生中斷。芯片本身有</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">3</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">個通道:通道</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">綁定到</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">IRQ0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">,在可預知和規則的時間中斷</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">CPU</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">;通道</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">1</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">特定于系統;通道</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">2</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">則連接到系統揚聲器。就像你看到的一樣,單個的芯片為系統提供了幾個非常重要的服務。</SPAN></P>
<P><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">你所需要關注的通道是通道</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">和通道</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">2</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">。你可以利用通道</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">2</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">讓計算機發出“嘟嘟”聲。在本指南的這一節,我們只關注映射到</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">IRQ0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">的通道</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">。計時器的這個通道使你可以精確地調度進程,使其開始運行,也可以讓當前任務等待一段時間(這將簡單地證明)。默認情況下,計時器的這個通道被設置為每秒產生</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">18.222</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">次</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">IRQ0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">。這是</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">IBM</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">兼容機</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">BIOS</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">的默認設置。本指南的一個讀者告訴我,這個</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">18.222Hz </SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">的嘀噠速率是用來適應</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0.055</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">秒的時鐘周期的。如果使用一個</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">16</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">位的時鐘滴嗒計數器,計數器將每個小時溢出一次并回繞至零。</SPAN></P>
<P><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">要設置計時器的通道</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">激活</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">IRQ0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">的速率,我們必須使用我們的“</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">outportb</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">”函數來向</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">I/O</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">做寫操作。計時器的</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">3</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">個通道都有一個數據寄存器,分別位于</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0x40</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">,</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0x41</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">和</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0x42</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">,在</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0x43</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">還有一個指令寄存器。數據速率實際上是這個設備的一個“除數”寄存器。
計時器將用你所給出的、存放在數據寄存器的值去除它的輸入時鐘——</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">1.19MHz</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">(</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">1193180Hz</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">),從而得到每秒需要激活的信號數。在寫入數據</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">/</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">除數寄存器之前,你首先需要選擇所要通過指令寄存器進行更新的通道。下面兩個表所展示的是指令寄存器每位的定義以及一些計時模式。</SPAN><FONT
face=Tahoma> </FONT></P>
<TABLE>
<TBODY>
<TR>
<TD vAlign=top width=300>
<TABLE>
<TBODY>
<TR>
<TD>
<TABLE cols=25>
<TBODY>
<TR>
<TD align=left width=25><FONT face=Tahoma>7</FONT></TD>
<TD align=right width=25><FONT face=Tahoma>6</FONT></TD>
<TD align=left width=25><FONT face=Tahoma>5</FONT></TD>
<TD align=right width=25><FONT face=Tahoma>4</FONT></TD>
<TD align=left width=50><FONT face=Tahoma>3</FONT></TD>
<TD align=right width=25><FONT face=Tahoma>1</FONT></TD>
<TD align=middle width=25><FONT
face=Tahoma>0</FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD>
<TABLE borderColor=#808080 cols=50 border=1>
<TBODY>
<TR>
<TD width=50><FONT face=Tahoma>CNTR</FONT></TD>
<TD width=50><FONT face=Tahoma>RW</FONT></TD>
<TD width=75><FONT face=Tahoma>Mode</FONT></TD>
<TD width=25><FONT
face=Tahoma>BCD</FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">CNTR</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">-計數器號(</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">0</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">-</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">2</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">)</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"><BR>RW</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">-讀寫模式</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"><BR>(1 =
LSB, 2 = MSB, 3 = LSB then MSB)<BR>Mode</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">-見右表</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"><BR>BCD - (0
= 16</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">位計數器,</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"><BR>1 = 4x
BCD</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">十進制計數器</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">)
</SPAN></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE borderColor=#808080 width=251 border=1>
<TBODY>
<TR>
<TH><B><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">模式</SPAN></B></TH>
<TH width=185><B><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">描述</SPAN></B></TH></TR>
<TR>
<TD><FONT face=Tahoma>0</FONT></TD>
<TD width=185><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma">中端計數中斷</SPAN></TD></TR>
<TR>
<TD><FONT face=Tahoma>1</FONT></TD>
<TD width=185>硬件可重觸發單穩態方式</TD></TR>
<TR>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -