硬件可以事件通知方式与驱动程序通信吗解决思路
硬件可以事件通知方式与驱动程序通信吗
有要求说:硬件内发生某些事件时能通知驱动程序,比如缓冲区数据满的时候通知驱动程序取数据等等。敢问各路高手,这种要求是否可以实现?如何实现?据我目前所能做到的就是靠驱动程序轮询硬件“有什么事吗”这样的方式来解决,但是并非领导的本意啊,还请高手指点才行,万分感激!
------解决方案--------------------
硬件产生中断啊,然后再查询。
------解决方案--------------------
有中断了,驱动就会收到呀。
------解决方案--------------------
不知道楼主是什么OS,比如说Windows CE。
驱动在Init阶段,可以创建一个IST(中断服务线程), 在IST中完成使能中断,创建事件,获取系统中断号并关联先前创建的事件以及实际的中断处理等工作。
在IST中会有一个死循环,在循环中等待一个事件。如:
在WinCE系统中,有一个异常向量表,相当于通常所说的中断向量表。这样当发生物理中断时,系统会自动跳转到相应的异常处理程序(ISR)如IRQHandler。
在异常处理程序,如IRQHandler函数中通常是屏蔽中断,然后调用OEMInterruptHandler函数获取中断源(物理中断号IRQ),然后根据IRQ返回一个系统中断号,IRQHandler函数根据返回的系统中断号调用OEMNotifyIntrOccurs设置与该SYSINTR(系统中断号)相关联的事件为有效状态。
这个时候上面IST中的WaitForSingleObject(ResetButtonIntrEvent, INFINITE);事件有效,这个时候可以执行死循环中下面的代码。也就是实际处理,比如楼主的“缓冲区数据满”。处理完之后,继续Wait下一次事件。因为WaitForSingleObject的第二个参数是INFINITE,所以平时IST是不进行实际工作的,只在这里一直等待中断的通知。中断没有进行事件通知,IST就什么都不做。
------解决方案--------------------
USB设备硬件这边如果缓冲区数据满的时候,通知驱动程序去取数据
他要求硬件设备主动通知驱动程序
这么说硬件会主动发出一些东西来告诉你缓冲区满吧?而不是被动的等你查询
------解决方案--------------------
WINDOWS XP是没有的
有要求说:硬件内发生某些事件时能通知驱动程序,比如缓冲区数据满的时候通知驱动程序取数据等等。敢问各路高手,这种要求是否可以实现?如何实现?据我目前所能做到的就是靠驱动程序轮询硬件“有什么事吗”这样的方式来解决,但是并非领导的本意啊,还请高手指点才行,万分感激!
------解决方案--------------------
硬件产生中断啊,然后再查询。
------解决方案--------------------
有中断了,驱动就会收到呀。
------解决方案--------------------
不知道楼主是什么OS,比如说Windows CE。
驱动在Init阶段,可以创建一个IST(中断服务线程), 在IST中完成使能中断,创建事件,获取系统中断号并关联先前创建的事件以及实际的中断处理等工作。
在IST中会有一个死循环,在循环中等待一个事件。如:
for (;;)
{
WaitForSingleObject(ResetButtonIntrEvent, INFINITE);
// 实际的中断处理(代码省略)
// 通知系统中断处理已经完成,重新使能该中断
InterruptDone(ResetButtonSysIntr);
}
在WinCE系统中,有一个异常向量表,相当于通常所说的中断向量表。这样当发生物理中断时,系统会自动跳转到相应的异常处理程序(ISR)如IRQHandler。
IMPORT UndefException
IMPORT SWIHandler
IMPORT PrefetchAbort
IMPORT DataAbortHandler
IMPORT IRQHandler
IMPORT FIQHandler
EXPORT VectorTable
VectorTable
DCD -1 ; reset
DCD UndefException ; undefined instruction
DCD SWIHandler ; SVC
DCD PrefetchAbort ; Prefetch abort
DCD DataAbortHandler ; data abort
DCD -1 ; unused vector
DCD IRQHandler ; IRQ
DCD FIQHandler ; FIQ
在异常处理程序,如IRQHandler函数中通常是屏蔽中断,然后调用OEMInterruptHandler函数获取中断源(物理中断号IRQ),然后根据IRQ返回一个系统中断号,IRQHandler函数根据返回的系统中断号调用OEMNotifyIntrOccurs设置与该SYSINTR(系统中断号)相关联的事件为有效状态。
这个时候上面IST中的WaitForSingleObject(ResetButtonIntrEvent, INFINITE);事件有效,这个时候可以执行死循环中下面的代码。也就是实际处理,比如楼主的“缓冲区数据满”。处理完之后,继续Wait下一次事件。因为WaitForSingleObject的第二个参数是INFINITE,所以平时IST是不进行实际工作的,只在这里一直等待中断的通知。中断没有进行事件通知,IST就什么都不做。
------解决方案--------------------
USB设备硬件这边如果缓冲区数据满的时候,通知驱动程序去取数据
他要求硬件设备主动通知驱动程序
这么说硬件会主动发出一些东西来告诉你缓冲区满吧?而不是被动的等你查询
------解决方案--------------------
WINDOWS XP是没有的