lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1579回复:3

KEvent事件对象在哪里声明?

楼主#
更多 发布于:2002-11-27 13:44
用DRIVERSTUDIO写一个带有一个系统线程的PCI驱动,希望在驱动收到一个硬中断时,置一个事件,通知系统线程启动数据输出操作。问题如下:
1:KEvent事件对象在哪里声明?是作为设备类的成员?还是系统线程类的成员?还是定义全局变量?
一开始我把事件对象在设备类中声明,系统线程在设备类的构建函数中启动(Start(LinkTo(...,...))),结果计算机启动时,中途停止任何响应,蓝屏提示\"IRQL_NOT_LESS_OR_EQUAL\"。
后来把系统线程的启动函数放在OnStartDevice()中,结果一样。
后来又把KEvent对象声明为系统线程类的成员,结果也是一样。
再后来把KEvent对象换成另一种内核同步对象KSemaphore,作为系统线程类的成员,结果是计算机可以启动了,但系统极不稳定,不知道什么时间就会忽然当机,然后蓝屏报错。并且,只要一通过APP写数据下去,就会立刻重启。感觉上是KEvent对象在捣乱。

2:在设备类中定义的\"驱动管理队列\"(KDriverManagedQueueEx的子类实例)用于保存未处理的IRP,可否在系统线程中使用(取出IRP并且使用KMem对象获取IRP的写缓冲以及输出)?虽然KDriverManagedQueueEx的说明中指出这个类的对象可以执行在任意IRQL上,但心里没底。
lvhaow
QJE
QJE
驱动小牛
驱动小牛
  • 注册日期2001-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望49点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-27 14:16
1,作为设备类的成员
2,在DeviceControl函数里进行初始话

其实在帮助文件里有这方面的说明。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-11-27 16:29
用户被禁言,该主题自动屏蔽!
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-11-27 16:33
问题找到了,果然是KEvent在捣乱,是定义的KEvent对象在没有及时进行初始化。现在在设备类的构建函数中进行了初始化,就OK了!
不过还有问题,就是CPU的占用量问题,为什么已经使用系统线程输出了,而CPU的占用量却居高不下(100MS输出1M数据),达到80%左右,而在APP上的数据处理,在不输出到驱动的情况只占了10%的CPU,也就是说驱动占了近70%。

会不会仍是CPU的高速缓存在作怪?再改改APP的算法看看!
lvhaow
游客

返回顶部