我用 PCI 板卡定时产生外部中断信号给PC机,PC机每收到一次中断就把计数器累计1并显示出来。但是我遇到的问题是:
1、计数器有误差。
2、经常死(死进程或者死机)
下面把我的工作以及思路都说一下。请热心人指点。
系统配置是:普通PC机,Celerone 2.6G, 1G RAM。Win XP. VC6
板卡是 PCI 板卡,本地主频是8M。
实验一
把板卡的8M分频,得到1Hz的外部中断,送给PC。PC每响应一次中断,屏幕的计数器累计1. 同时用PC自身的时钟做为对比。观察了几千秒,计数器、PC时钟都一致。表明板卡的8M晶振是很准的,而且PC也没有遗漏中断或者多响应(即一次中断响应两次)的情况。同时还观察到程序占用的内存越来越大,开始是4508K,但最终稳定在4512K。
实验二
把板卡的8M分频,得到1KHz的外部中断,送给PC。PC每响应 1000 次中断,屏幕的计数器累计1. 结果只观察几百秒,就发现计数器比PC时钟快了约1%(注意是“快”,从来没有慢过)。而且PC还会死掉。有时是进程死掉,用任务管理器也杀不掉。有时是整个机器死掉,还有两次蓝屏。同时还观察到程序占用的内存从4496K增长到4500K(后面就不知道了,因为死掉了)
罗列所有可能的原因如下 :
1、板卡的晶振不准
2、PC多响应中断,即一次中断响应了两次,结果计数器就多累加了。
3、中断服务程序里申请了空间,但是没有释放。
前两个原因,根据实验一,基本被我否决了。
第三个原因,我看了代码,没有申请空间。
请问还有什么可能呢?
顺便再说一下PC端的程序结构,请看看有没有什么问题:
计数器是全局变量,中断服务程序把计数器加1就退出。另外一个线程反复把计数器显示到屏幕上,线程每次显示完了都 Sleep(1)。 |