阅读:1858回复:14
咄咄怪事!谁能解释?
我在测试NT驱动程序对硬件中断的响应时发现一个奇怪的现象,麻烦大家帮忙看看,能不能帮我分析一下。
我在硬件中断中读取系统时间,并保存,做中断计数。结果发现中断计数严格递增,但系统时间却出现了重复和缺失的现象。缺失好像可以理解为系统没有响应中断(但为什么?),出现连着两个中断读出来的系统时间一模一样(精确到毫秒),就很难解释了。(我的中断间隔为10ms)。 我用了不同的卡测试(包括PCI和ISA),结果一样。 另外,我用系统定时器代替中断,没有重复现象,但有缺失。 |
|
最新喜欢:![]()
|
沙发#
发布于:2002-03-25 18:05
我想你应该用DriverWorkBench来计算中断时间.
|
|
|
板凳#
发布于:2002-03-25 21:02
好像帮不上什么忙。DriverWorkBench不能记录每个中断被调用的时间。只有一个统计值。
|
|
|
地板#
发布于:2002-03-28 04:53
First of all, I should say what you saw here is reasonable on Windows. after all, Windows is not a RTOS.
我在硬件中断中读取系统时间,并保存,做中断计数。结果发现中断计数严格递增,但系统时间却出现了重复和缺失的现象。缺失好像可以理解为系统没有响应中断(但为什么?),出现连着两个中断读出来的系统时间一模一样(精确到毫秒),就很难解释了。(我的中断间隔为10ms)。 Although your hardware interrupts every 10ms, Windows cannot make sure your interrupt handler will be called every 10ms. sometimes it may take 20, 30 or more time for your handler being called, that\'s why you found there are some time missed. Whenever there is a hardware interrupt, if system is running in same/higher IRQL, Windows will register an DPR for it. When the IRQL is lowered to proper IRQL, Windows will execute these DPRs and execute a software interrupt to simulated the delayed hardware interrupt. So, when your interrupt handler is being called, mayber there are several DPR pended, so your handler may be called several times quickly (if no other higher priority interrupt), that\'s why you can see some identical time. 另外,我用系统定时器代替中断,没有重复现象,但有缺失。 That\'s because system timer interrupt runs in higher IRQL. |
|
|
地下室#
发布于:2002-03-28 11:01
完了,这下死菜了。我的程序若不能正常响应中断,整个项目就完蛋了。
我做了进一步的试验,用系统定时器,ISA板和PCI板在相同条件下测试。我发现10ms是一个临界点,这三种工具都会出现10ms的误差,所以假设10ms是由于系统时间造成的,我认为这属于正常范围。那么,系统定时器和ISA板的中断响应均能保证在10ms的误差范围内(其中,系统定时器能保证在3ms内),而只有PCI板会出现最高为70ms的误差。这会不会与PCI总线有关?我唯一能做的是让我的PCI卡独占一个中断号,但一点用也没有。那位大虾能够指点迷津? WindowsNT不是RTOS,但若没有其他中断的情况下,它应该保证中断的响应呀。系统时钟等级虽高,但响应时间应该很短,不应该有太大的影响。内核是不是故意排斥某个设备的频繁中断?? 我该怎么办? |
|
|
5楼#
发布于:2002-04-07 10:42
ymvv兄:我也在做一个和你类似的项目,我的中断间隔只有8MS,看到你的问题,我也心凉了半截!但我从你的问题里注意到一个细节,你说
\"我在硬件中断中读取系统时间,并保存,做中断计数。结果发现中断计数严格递增\", 你的中断计数是在哪里做的?也中断服务程序中还是硬件? 另:kanghai兄,有什么好办法可以解决中断响应速率问题,我愿意付您100分!! |
|
|
6楼#
发布于:2002-04-07 12:15
各位不要心凉!我也在做类似的东西,我需要的中断间隔更短(<=1ms),我都有信心实现它。我在国外的时候,曾经用过一个驱动程序,这个驱动程序可以做到10us左右的中断间隔,而且它还没有自己的硬件,它也是通过系统定时器来实现的。我估计有三种可能可以实现这么小的中断间隔:
1。修改NT的IDT入口,使得你所需要的中断向量的入口直接指向你所编写的中断陷阱程序,然后在你的中断陷阱程序中调用你自己写的ISR,为了避免其他因素的影响,你可以在你的ISR中关闭中断。 2。对系统可编程中断控制器(应该是8259A)进行编程,使得你自己的卡的中断优先级最高,看看有什么改变没有。 3。对系统定时器进行编程(应该为8254,我猜想),使得系统定时器的中断间隔达到你自己的要求,8254的工作频率为1.19MHz,最小定时间隔可以小于1us(1/1.19)。但是,这种情况下,你首先得保证要先把系统定时器的默认定时间隔保存在某个地方,然后每当系统定时器的默认定时间隔到期的时候,你必须调用原来系统定时器的ISR,以保证系统的完整性。 |
|
7楼#
发布于:2002-04-07 17:03
可否把您的原码贴出来?我想看看您是怎么做的,说不定有谁还能看出什么名堂! :D
|
|
|
8楼#
发布于:2002-04-07 21:43
我现在还正在研究,因为我现在定时卡还没有。我跟踪了一下Windows 2000的中断,发现在Windows 2000(Build 2195)下系统定时器的中断向量好象应该为0xD1,初步的结果,还有待检验,不过可是花了我好几个小时的时间:(。如果你有兴趣的话,你可以通过修改0xD1所对应的IDT入口,从而可以截获系统定时器中断。为了满足你自己的定时需要,你必须通过某种方式修改系统定时器的定时间隔(可以研究一下KeSetTimeIncrement例程),记得在合适的地方调用一下KeUpdateSystemTime例程以刷新系统日时钟。有进展的话别忘了告诉一声,大家交流一下。
|
|
9楼#
发布于:2002-04-08 15:43
我做了下列试验,大家看看说明什么问题及如何解决
我写PCI卡的某一端口,它开始产生1024个中断,在我的ISR中我读取数据,(该数据按中断递增)并保存,用于事后分析。 实验结果:数据出现丢失,另外,数据总数小于1024(中断个数)。 这说明,确实有中断丢失,没有进到我的ISR中。硬件中断是很稳定的,是8259没有响应还是内核没有调用我的ISR? xdjm: ---------------------------------------------------- 1。修改NT的IDT入口,使得你所需要的中断向量的入口直接指向你所编写的中断陷阱程序,然后在你的中断陷阱程序中调用你自己写的ISR,为了避免其他因素的影响,你可以在你的ISR中关闭中断。 2。对系统可编程中断控制器(应该是8259A)进行编程,使得你自己的卡的中断优先级最高,看看有什么改变没有。 ---------------------------------------------------- 不知如何才能在NT下修改IDT的入口或对8259进行编程?我从未做过。Have no idea at all. 有没有相关的文章或代码? 拜托了,我已经无路可走。 |
|
|
10楼#
发布于:2002-04-08 18:23
用系统定时器的方法不适用于我,我的中断是PCI硬件产生的,不关定时器什么事。改中断控制器的优先级也许可行,可怎么改呢??
|
|
|
11楼#
发布于:2002-04-09 08:44
在NT下修改IDT表可以参见UNDOCUMENT NT一书中HOOKINT这一段,书可在主页中的参考书籍中找到。
|
|
12楼#
发布于:2002-04-09 20:01
我发现在P3/Windows 2000 Build 2195系统上,2000并不是用系统定时器来实现多任务的,感觉好象是用CMOS实时时钟,不过我不能肯定。但是,系统定时器停止的时候,2000照样可以进行多任务切换,奇怪ing!
建议各位先用Windriver先测试一下硬件,看看硬件中断有什么问题。 |
|
13楼#
发布于:2002-04-12 08:38
我发现在P3/Windows 2000 Build 2195系统上,2000并不是用系统定时器来实现多任务的,感觉好象是用CMOS实时时钟,不过我不能肯定。但是,系统定时器停止的时候,2000照样可以进行多任务切换,奇怪ing! 不太明白你的意思:系统定时器停止?你指的是什么?系统定时器不是自己可以创建,启动,停止吗? |
|
|
14楼#
发布于:2002-04-12 09:08
先看一段引用:
“Windows 2000/XP并不以任何可控制的方式区分设备中断请求的优先顺序。” 《Windows操作系统原理》机械工业出版社, 55页 这是什么意思?设备中断请求不是通过中断号来完成优先级的控制吗?在系统内部,是通过IRQL来实现的,高IRQL可以打断低IRQL的任务。难道不是这样? 如Kanghai所说:Whenever there is a hardware interrupt, if system is running in same/higher IRQL, Windows will register an DPR for it. When the IRQL is lowered to proper IRQL, Windows will execute these DPRs and execute a software interrupt to simulated the delayed hardware interrupt. 在我做的实验中,中断间隔长达50ms, 中断仍有丢失的情况,这也太恐怖了吧?(1024个中断,有时丢失6、7个)。是操作系统的原因?硬件应该没有问题,好几个卡都是这样。还是跟PCI总线有关?在用系统时间来测试时,ISA卡的误差不超过10ms,比PCI卡好多了。(PCI可达60ms)。 修改系统的IDT可行吗?中断产生后,CPU把控制交给内核的陷阱处理程序,并传递中断向量,陷阱处理程序关中断,保存机器状态,调用中断调度程序,中断调度程序提高CPU的IRQL到中断源级别,开中断。这时候才开始查找IDT表,找到对应的ISR,并调用它。我认为IDT表中保存的本来就是我的ISR地址,修改它有什么用? PCI的中断号是系统分配的,能修改吗? |
|
|