阅读:3138回复:22
中断线,与系统SysIntr的关系?
已经获得了板卡的InterruptLine, 是不是就可以用这个值来调用InterruptInitialize()?
没有概念的说。 :) |
|
沙发#
发布于:2004-12-14 08:28
zhuyanjv兄弟,你得到的应该是设备的硬件中断irq,通过调用LoadIntchainHandler或Hookinterrupt可以把这个中断和你的ISR勾连起来。另外,如果你需要IST的话,你还要定义一个逻辑中断值SysIntr并创建一个事件,通过调用InterruptInitialize()可以将这个事件和这个SysIntr的关联起来。
|
|
|
板凳#
发布于:2004-12-14 10:03
wwei_wang兄,我用的是oem商已经定制好的系统,是不是自己就不能再写ISR了,如果是,LoadIntchainHandler或Hookinterrupt还能调用吗?如果不是,我怎么写,放在哪?是放在驱动的DLL里边吗?
我看了一些例子,发现在PCIBUS.c里有个函数直接调用KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), pSysIntr, sizeof(*pSysIntr), NULL);来获取逻辑中断号, 不知道这是怎么回事? 我试了这个函数,得到一个中断号,然后做了CreateEvent, InterruptInitialize,CreateThread,等一系列工作,运行发现只要一开启中断线程,程序就运行不下去了,总是提示所有线程都被挂起,很郁闷,不知什么原因,该如何解决? |
|
地板#
发布于:2004-12-14 10:27
(1)没有关系的,即使是oem商已经定制好的系统,你也可以写你自己的isr,这个isr就放在你的isr dll里面,关于这个dll你可以参看pb的文档。开发好的驱动你可以把它放在你的外存里面(如CF,DOC)。
(2)你写的驱动是单片还是分层的? (3)其实,逻辑中断号可以由你自己来定义,只要与你的isr相关联就可以了。 (4)当你创建完你的ist后,这个ist就会挂起的,直到它等待的事件被激活。你说”。。总是提示所有线程都被挂起。。“,这里所有线程是什么意思? 你试试看。 :cool: |
|
|
地下室#
发布于:2004-12-14 10:53
是这样,我定义了一个thread如下,
ULONG JDV_InterruptThread( VOID ) { while(!bExit) { WaitForSingleObject(hJDInterrupt, INFINITE); InterruptDone(gIntrJDV); } return TRUE; } 在初始化函数里,创建事件,初始化事件和中断号的连接,此处的中断号就是我用KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), pSysIntr, sizeof(*pSysIntr), NULL);获取的,没有自己定义,ISR也没有自己写。 然后CreateThread, 成功以后,按F10想继续运行下边的语句,EVC就会跳出一个对话框,上写“DM2004, All threads are suspended”,不能继续运行下去。 |
|
5楼#
发布于:2004-12-14 11:53
那你调用KernelIoControl后,*pSysIntr是多少?原来的irq是多少?
|
|
|
6楼#
发布于:2004-12-14 12:32
原来的IRQ是9, 得到的*pSysIntr是29
|
|
7楼#
发布于:2004-12-14 15:09
你先不要写isr也不要通过调用KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), pSysIntr, sizeof(*pSysIntr), NULL);来得到SysIntr。你试试指定SysIntr为0x19,然后再做CreateEvent, InterruptInitialize,CreateThread等工作,看看会怎样?
|
|
|
8楼#
发布于:2004-12-14 15:09
更正一下:是"DM0024, All threads are suspended"
还有我的驱动是单片的。 问题还没有解决,不知道是不是29这个中断号一直有中断过来,导致JDV_InterruptThread一直在运行,所以其他的线程都被挂起了 另外,我没有查到LoadIntchainHandler与Hookinterrupt,不知道这是哪里的函数? 自己写的ISR要专门做成一个DLL吗。 |
|
9楼#
发布于:2004-12-14 15:19
(1)自己写的ISR要专门做成一个DLL
(2)在你的XXX_Init函数中调用LoadIntchainHandler将你的irq和isr相联,这个函数使用方法pb的帮助里肯定有,我就不详细说了。 (3)另外你试试我刚才建议,SysIntr直接指定为0x19 |
|
|
10楼#
发布于:2004-12-15 09:39
我上边提到的问题发现是在Init函数里设断点单步执行的时候出现,而且因为让系统加载驱动没法设断点,我用的是直接调用Init函数的方法。
现在调用ActivateDevice让系统加载驱动,每次都能加载成功,驱动的代码没有一点变化,所以可以肯丁Init函数运行成功了 |
|
11楼#
发布于:2004-12-15 09:48
恭喜恭喜:))
(1)如果让系统在启动时自动加载你的驱动,能够成功吗? (2)你前面说“。。。总是提示所有线程都被挂起”,找到原因了吗? |
|
|
12楼#
发布于:2004-12-15 11:54
我现在用指定的系统中断号,0x19,已经可以捕捉到硬件中断,现在有两事不明,
1 这个0x19是wwei_wang兄如何给出的,是随便给的吗? 2 既然我用指定的中断号已经可以连接到我的IST,我还用不用自己写ISR和连接了。具体的终端处理我可以在IST中完成呀 另外回答wwei_wang兄的问题: 1 可以让系统在启动时加载,只要把注册表项放在builtin中,驱动放在cf卡上 2 “。。。总是提示所有线程都被挂起”我感觉是我在自己调用init函数时用单步调试造成的,我不调试,就没有出现了 |
|
13楼#
发布于:2004-12-15 12:45
(1)其实逻辑中断号sysintr可以任由你定义,不要与其他的重复就行,具体你可以参考OEMInit()函数。
(2)ISR肯定要写的。因为和ist所等待的事件相关联的是sysintr不是irq。你的irq要和isr勾连,这样中断发生后就会先进入isr,当你的isr返回前面指定的sysintr时,你的ist才会被释放。 |
|
|
14楼#
发布于:2004-12-15 13:21
那么为什么我自己没有写ISR就用0x19,我的IST里就等到了与0x19关联的中断事件呢,然后我在IST里触发一个与APP共享的事件,当我的硬件产生中断以后,我的APP里就等到了这个共享事件。
|
|
15楼#
发布于:2004-12-15 14:04
"那么为什么我自己没有写ISR就用0x19,我的IST里就等到了与0x19关联的中断事件呢" ,可能的情况是其他设备驱动程序的ist也把它自己等待的event与sysintr=0x19相关联了。这样当那个设备产生中断进入它的isr后,并从isr返回时,激活了你的事件,释放了你的ist。
我认为,即使确实进入到了你的ist里面,也不能说明是由你的设备的中断引起的(即使此时你的设备也产生中断了)。说了这么多,不知是否说清楚了。 另外,你的sysintr可以试试其他的值。 |
|
|
16楼#
发布于:2004-12-15 17:31
我试了其他值,只有0x19可以
那么ISR都写些什么,我查帮助没有详细的介绍,wwei_wang兄给大概介绍一下吧 |
|
17楼#
发布于:2004-12-16 08:21
“我试了其他值,只有0x19可以”,你是说只有当sysintr=0x19时,你的ist才能进去是吧?那是因为有其他的设备产生中断,而它的systintr也是0x19。
既然你使用了ist,那么你的isr主要完成下面的工作就可以了: (1)确认是否是你的设备产生的中断,如果是,且需要进一步的处理,则返回你的systintr;如果不需要进一步的处理,返回SYSINTR_NOP就行了。 (2)如果不是你的设备产生的中断,返回SYSINTR_CHAIN就可以了。 |
|
|
18楼#
发布于:2004-12-16 13:51
那么ISR动态连接库的就口函数有没有统一的名字?如果有是什么?
|
|
19楼#
发布于:2004-12-16 14:02
接口函数, 呵呵
|
|
上一页
下一页