📄 可编程间隔定时器.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 + -