利用系统定时中断

来源:互联网 发布:双色球参选数据准不准 编辑:程序博客网 时间:2024/05/01 18:21
利用系统定时中断
  在PC机中采用了可编程定时/计数芯片8253,计数器0工作在方式3,用OUT0产生时钟信号。OUT0作为中断请求信号接可编程中断控制器8259A的IR0(系统中IRQ0)。由于fCLK≈1.19MHz,TCLK≈840ns,因此8253初值为65536时,大约每840ns*65536≈55ms中断一次。可以读取计数器的当前计数值,计数器值每减一,代表时间840ns,另加上计数器是否计满的判断,则可计算出时间的精确值。 
  8253的6种工作方式的设置是在初始化时用输出指令写控制字来实现的,其中,方式0为在结束计数时中断。
  调用VC++运行库函数clock(),可以获得本次程序运行由处理器用去的ms时间,由此可判断出计数器是否计满。具体程序代码如下: 
// 延时函数
void Ddelay(unsigned long n) 
{
 unsigned long Told;
 unsigned long nn,old_Clock, new_Clock, low, high, v_8253;
 unsigned long old_8253, new_8253, int_Time;
 // nn单位: 840ns 
 nn =(unsigned long)((float)n*1000/840); 
 // 锁定8253计数值
 _outp(0x43,0x00); 
 // 读取8253计数值
 low = _inp(0x40); 
 high = _inp(0x40);
 v_8253 = low + 256 * high;
 old_8253 = v_8253;
 old_Clock=clock();
 Told=old_Clock;
 int_Time=0;
 while(int_Time < nn)
 {
  _outp(0x43,0x00);
  low = _inp(0x40);
  high = _inp(0x40);
  v_8253 = low + 256 * high;
  new_8253 = v_8253;
  new_Clock=clock();
  if(old_8253< new_8253 && new_Clock-Told< 55)
    int_Time=(old_8253-new_8253)+((new_Clock-old_Clock)/55+1)*65536lu;
  else 
    int_Time=(old_8253-new_8253)+((new_Clock-old_Clock)/55)*65536lu;
  Told=new_Clock;
 }
}
 
 
原创粉丝点击