我使用的是偶尔会错过硬件中断的设备驱动程序。
要从设备读取数据,我使用该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设备会发生什么?
您需要切换到异步I / O。 打开提供FILE_FLAG_OVERLAPPED标志给CreateFile的设备驱动程序,然后在调用ReadFile时传递重叠结构。 当I / O完成时,句柄将被发送信号,所以你可以使用WaitForSingleObject来传递给ReadFile的句柄和一个超时。
并非所有设备驱动程序都支持异步I / O,所以这可能不适合您。 如果是这种情况, ReadFile将仍然阻塞,不返回“ERROR_PENDING_IO”。
如果超时,则应在重叠结构超出范围之前调用CancelIO来终止 ReadFile。 否则,如果碰巧晚些时候完成,它会尝试将内存写入用于存储的重叠结构。
异步I / O有点棘手,所以仔细阅读文档。
更新:我发现一个替代方案可以从看门狗线程中调用CancelIEx 。 作为一个更新的API,它可能不会出现在你必须支持的平台上。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。