阅读:1579回复:3
KEvent事件对象在哪里声明?
用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上,但心里没底。 |
|
|
沙发#
发布于:2002-11-27 14:16
1,作为设备类的成员
2,在DeviceControl函数里进行初始话 其实在帮助文件里有这方面的说明。 |
|
板凳#
发布于:2002-11-27 16:29
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2002-11-27 16:33
问题找到了,果然是KEvent在捣乱,是定义的KEvent对象在没有及时进行初始化。现在在设备类的构建函数中进行了初始化,就OK了!
不过还有问题,就是CPU的占用量问题,为什么已经使用系统线程输出了,而CPU的占用量却居高不下(100MS输出1M数据),达到80%左右,而在APP上的数据处理,在不输出到驱动的情况只占了10%的CPU,也就是说驱动占了近70%。 会不会仍是CPU的高速缓存在作怪?再改改APP的算法看看! |
|
|