阅读:1448回复:5
【散分散分】一个关于读写中断服务的问题
关于中断服务的问题一直困扰着我,请大侠指导:
我的设备不支持DMA。 1.服务的时候是否IRP_MJ_WRITE一定要在StartIO中发送第一个字节,然后硬件必须在这个时候发生中断,然后激发DpcForIsr,在DpcForIsr中发送其它字节,start next IO?可是设备不一定就会按照驱动程序的要求产生中断啊! 2.如果设备有数据需要上传,则会发出中断。这时又启动DpcForIsr可是没有一个IRP_MJ_READ与之对应啊!这怎么办啊?所以我的理解是:设备不要主动产生中断,如果驱动正在服务IRP_MJ_READ,则通知设备产生中断,以激发DpcForIsr完成当前IRP。 3.可是实际设备都是随时可以产生中毒的啊!这又与上面的矛盾了。 以上问题困扰我多时了,请大侠赐教!谢谢了! 给分给分! |
|
|
沙发#
发布于:2002-11-14 19:56
谢谢!基本上明白了。改改我的硬件设计就行了。反正硬件也是我设计的!
|
|
|
板凳#
发布于:2002-11-14 18:43
你的意思是你的硬件不会产生“发送结束”中断吗?
那你怎么知道你写给硬件数据它已经正确接受了呢? 在STARTIO中守成也没什么不妥,应该用KySync....,只是别占时太长。 |
|
|
地板#
发布于:2002-11-14 18:07
串口的的确是这样工作的。
如果在写我的硬件的时候,不能够发出中断信号怎么办? 还有就是如果我在StartIo中正在连续写数据给硬件,这时候突然发生中断,执行完DpcforIsr后会start next IRP,那么我对前面的IRP的处理就出错了!可否考虑在startio中使用KeSynchronizeExecution(interropt_object,...,...) 在startIO中完成对IRP_MJ_WRITE的所有工作。这样是否妥当? |
|
|
地下室#
发布于:2002-11-14 17:16
在WRITE时即发送的时候,一般在StartIO中会写小部分数据到硬件(多少视硬件一次能接收量而定,实质上谁都希望一次性写完),在这部分数据硬件处理完后,一般的硬件会产生“发送结束”中断,进入ISR再到DPC,由DPC将剩下的数据再发至硬件,然后就会再次ISR、DPC直到所有数据处理完毕,结束IRP。
在接收视你的硬件而定,如果你的硬件要求在上层应用没有发出读请求时硬件所接收到的数据也必须保留,则你需要在驱程中申请一块缓冲,当有ISR接收中断时,由DPC将数据读入缓冲,应用发出READ IRP时先检查并读取缓冲,不足时再由DPC继续读,直到读取指定量数据完成IRP。当然如果不要在没有发出READ IRP时的数据直接丢弃就是。 你看看NTDDK中的串口例子,以后流程就会更清晰。 |
|
|
5楼#
发布于:2002-11-14 17:14
在WRITE时即发送的时候,一般在StartIO中会写小部分数据到硬件(多少视硬件一次能接收量而定,实质上谁都希望一次性写完),在这部分数据硬件处理完后,一般的硬件会产生“发送结束”中断,进入ISR再到DPC,由DPC将剩下的数据再发至硬件,然后就会再次ISR、DPC直到所有数据处理完毕,结束IRP。
在接收视你的硬件而定,如果你的硬件要求在上层应用没有发出读请求时硬件所接收到的数据也必须保留,则你需要在驱程中申请一块缓冲,当有ISR接收中断时,由DPC将数据读入缓冲,应用发出READ IRP时先检查并读取缓冲,不足时再由DPC继续读,直到读取指定量数据完成IRP。 你看看NTDDK中的串口例子,以后流程就会更清晰。 |
|
|