利用系统定时中断

    技术2022-05-11  81

    利用系统定时中断   在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;  } }    

    最新回复(0)