我使用的是偶尔会错过硬件中断的设备驱动程序。
要从设备读取数据,我使用该function
BOol WINAPI Readfile( __in HANDLE hfile,__out LPVOID lpBuffer,__in DWORD nNumberOfBytesToRead,__out_opt LPDWORD lpNumberOfBytesRead,__inout_opt LPOVERLAPPED lpOverlapped );
当设备驱动程序错过一个中断时,该function永远阻塞。 这导致程序停滞,并且必须重新启动窗口来解决它。
要解决这个问题,我想调用Readfile()时使用超时限制。 但是当我使用
是否有可能检索创builDWDFREQUEST的cpu?
为什么我的IOCTL调用与copy_from_user协同工作,而不是与get_user协同工作?
世界上最简单的windows驱动程序
测量设备驱动程序由我的程序引起的cpu / IO利用率
如何打包windows驱动程序进行部署?
BOol WINAPI SetCommTimeouts( __in HANDLE hfile,__in LPCOMMTIMEOUTS lpCommTimeouts );
它会失败,错误代码87(无效的参数)。 显然,我不能在设备驱动程序句柄上使用这个超时的东西。 我怎样才能解决这个问题? 有没有其他方法来设置设备驱动程序的超时限制?
谢谢
关于在terminal上打印KERNEL消息
生产者消费者在块设备驱动程序中的实现?
如何在代码中的SATA控制器上从PIO切换到DMA模式?
当你插入一个新的USB设备会发生什么?
如何以编程方式创build自定义input/输出设备?
您需要切换到异步I / O。 打开提供file_FLAG_OVERLAPPED标志给Createfile的设备驱动程序,然后在调用Readfile时传递重叠结构。 当I / O完成时,句柄将被发送信号,所以你可以使用WaitForSingleObject来传递给Readfile的句柄和一个超时。
并非所有设备驱动程序都支持异步I / O,所以这可能不适合您。 如果是这种情况, Readfile将仍然阻塞,不返回“ERROR_PENDING_IO”。
如果超时,则应在重叠结构超出范围之前调用CanceliO来终止 Readfile。 否则,如果碰巧晚些时候完成,它会尝试将内存写入用于存储的重叠结构。
异步I / O有点棘手,所以仔细阅读文档。
更新:我发现一个替代方案可以从看门狗线程中调用CancelIEx 。 作为一个更新的API,它可能不会出现在你必须支持的平台上。
总结以上是内存溢出为你收集整理的设备驱动程序:Windows ReadFile函数超时全部内容,希望文章能够帮你解决设备驱动程序:Windows ReadFile函数超时所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)