通道计数器的最大值是10000h,所对应的时钟中断频率是1193181/(65536)=18.2HZ,也就是说,此时一秒钟之内将产生18.2次时钟中断 。
2、 PIT的I/O端口
在i386平台上,8254芯片的各寄存器的I/O端口地址如下:
Port Description;
40h Channel 0 counter(read/write);
41h Channel 1 counter(read/write);
42h Channel 2 counter(read/write);
43h PIT control word(write only)
其中,由于通道0、1、2的计数器是一个16位寄存器,而相应的端口却都是8位的,因此读写通道计数器必须进行进行两次I/O端口读写操作,分别对应于计数器的高字节和低字节,至于是先读写高字节再读写低字节,还是先读写低字节再读写高字节,则由PIT的控制寄存器来决定 。8254 PIT的控制寄存器的格式如下:
(1)bit[7:6]——Select Counter,选择对那个计数器进行操作 。“00”表示选择Counter 0,“01”表示选择Counter 1,“10”表示选择Counter 2,“11”表示Read-Back Command(仅对于8254,对于8253无效) 。
(2)bit[5:4]——Read/Write/Latch格式位 。“00”表示锁存(Latch)当前计数器的值;“01”只读写计数器的高字节(MSB);“10”只读写计数器的低字节(LSB);“11”表示先读写计数器的LSB,再读写MSB 。
(3)bit[3:1]——Mode bits,控制各通道的工作模式 。“000”对应Mode 0;“001”对应Mode 1;“010”对应Mode 2;“011”对应Mode 3;“100”对应Mode 4;“101”对应Mode 5 。
(4)bit[0]——控制计数器的存储模式 。0表示以二进制格式存储,1表示计数器中的值以BCD格式存储 。
2.1 PIT通道的工作模式
PIT各通道可以工作在下列6种模式下:
1. Mode 0:当通道处于“Terminal count”状态时产生中断信号 。
2. Mode 1:Hardware retriggerable one-shot 。
3. Mode 2:Rate Generator 。这种模式典型地被用来产生实时时钟中断 。此时通道的信号输出管脚OUT初始时被设置为高电平,并以此持续到计数器的值减到1 。然后在接下来的这个clock-cycle期间,OUT管脚将变为低电平,直到计数器的值减到0 。当计数器的值被自动地重新加载后,OUT管脚又变成高电平,然后重复上述过程 。通道0通常工作在这个模式下 。
4. Mode 3:方波信号发生器 。
5. Mode 4:Software triggered strobe 。
6. Mode 5:Hardware triggered strobe 。
2.2 锁存计数器(Latch Counter)
当控制寄存器中的bit[5:4]设置成0时,将把当前通道的计数器值锁存 。此时通过I/O端口可以读到一个稳定的计数器值,因为计数器表面上已经停止向下计数(PIT芯片内部并没有停止向下计数) 。NOTE!一旦发出了锁存命令,就要马上读计数器的值 。
2.3 时间戳记数器TSC
从Pentium开始,所有的Intel 80x86 CPU就都又包含一个64位的时间戳记数器(TSC)的寄存器 。该寄存器实际上是一个不断增加的计数器,它在CPU的每个时钟信号到来时加1(也即每一个clock-cycle输入CPU时,该计数器的值就加1) 。
汇编指令rdtsc可以用于读取TSC的值 。利用CPU的TSC,操作系统通常可以得到更为精准的时间度量 。假如clock-cycle的频率是400MHZ,那么TSC就将每2.5纳秒增加一次 。
推荐阅读
- Linux操作系统内核抢占补丁的基本原理
- 如何远程实现为Linux服务器添加新分区
- Linux操作系统内核和设备文件对话
- 在Linux系统下清除操作信息的记录
- Linux应用软件谈之远程桌面控制篇
- Linux服务器前台常出现的提示及含意
- Linux操作系统下的软中断问题分析
- 全面剖析Linux操作系统单用户方式
- Linux操作系统不同对象全面升级方法介绍
- Linux系统小型日程表挑战大型群件