zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:3138回复:22

中断线,与系统SysIntr的关系?

楼主#
更多 发布于:2004-12-13 17:29
已经获得了板卡的InterruptLine, 是不是就可以用这个值来调用InterruptInitialize()?

没有概念的说。 :)
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-14 08:28
zhuyanjv兄弟,你得到的应该是设备的硬件中断irq,通过调用LoadIntchainHandler或Hookinterrupt可以把这个中断和你的ISR勾连起来。另外,如果你需要IST的话,你还要定义一个逻辑中断值SysIntr并创建一个事件,通过调用InterruptInitialize()可以将这个事件和这个SysIntr的关联起来。
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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,等一系列工作,运行发现只要一开启中断线程,程序就运行不下去了,总是提示所有线程都被挂起,很郁闷,不知什么原因,该如何解决?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-14 10:27
(1)没有关系的,即使是oem商已经定制好的系统,你也可以写你自己的isr,这个isr就放在你的isr dll里面,关于这个dll你可以参看pb的文档。开发好的驱动你可以把它放在你的外存里面(如CF,DOC)。
(2)你写的驱动是单片还是分层的?
(3)其实,逻辑中断号可以由你自己来定义,只要与你的isr相关联就可以了。
(4)当你创建完你的ist后,这个ist就会挂起的,直到它等待的事件被激活。你说”。。总是提示所有线程都被挂起。。“,这里所有线程是什么意思?

你试试看。 :cool:
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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”,不能继续运行下去。
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-14 11:53
那你调用KernelIoControl后,*pSysIntr是多少?原来的irq是多少?
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-14 12:32
原来的IRQ是9, 得到的*pSysIntr是29
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
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等工作,看看会怎样?
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-14 15:09
更正一下:是"DM0024, All threads are suspended"
还有我的驱动是单片的。

问题还没有解决,不知道是不是29这个中断号一直有中断过来,导致JDV_InterruptThread一直在运行,所以其他的线程都被挂起了

另外,我没有查到LoadIntchainHandler与Hookinterrupt,不知道这是哪里的函数?

自己写的ISR要专门做成一个DLL吗。

wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-14 15:19
(1)自己写的ISR要专门做成一个DLL
(2)在你的XXX_Init函数中调用LoadIntchainHandler将你的irq和isr相联,这个函数使用方法pb的帮助里肯定有,我就不详细说了。
(3)另外你试试我刚才建议,SysIntr直接指定为0x19
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-15 09:39
我上边提到的问题发现是在Init函数里设断点单步执行的时候出现,而且因为让系统加载驱动没法设断点,我用的是直接调用Init函数的方法。
现在调用ActivateDevice让系统加载驱动,每次都能加载成功,驱动的代码没有一点变化,所以可以肯丁Init函数运行成功了
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-15 09:48
恭喜恭喜:))

(1)如果让系统在启动时自动加载你的驱动,能够成功吗?
(2)你前面说“。。。总是提示所有线程都被挂起”,找到原因了吗?
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-15 11:54
我现在用指定的系统中断号,0x19,已经可以捕捉到硬件中断,现在有两事不明,
1 这个0x19是wwei_wang兄如何给出的,是随便给的吗?
2 既然我用指定的中断号已经可以连接到我的IST,我还用不用自己写ISR和连接了。具体的终端处理我可以在IST中完成呀


另外回答wwei_wang兄的问题:
1 可以让系统在启动时加载,只要把注册表项放在builtin中,驱动放在cf卡上
2 “。。。总是提示所有线程都被挂起”我感觉是我在自己调用init函数时用单步调试造成的,我不调试,就没有出现了
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-15 12:45
(1)其实逻辑中断号sysintr可以任由你定义,不要与其他的重复就行,具体你可以参考OEMInit()函数。
(2)ISR肯定要写的。因为和ist所等待的事件相关联的是sysintr不是irq。你的irq要和isr勾连,这样中断发生后就会先进入isr,当你的isr返回前面指定的sysintr时,你的ist才会被释放。
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-15 13:21
那么为什么我自己没有写ISR就用0x19,我的IST里就等到了与0x19关联的中断事件呢,然后我在IST里触发一个与APP共享的事件,当我的硬件产生中断以后,我的APP里就等到了这个共享事件。
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-12-15 14:04
"那么为什么我自己没有写ISR就用0x19,我的IST里就等到了与0x19关联的中断事件呢" ,可能的情况是其他设备驱动程序的ist也把它自己等待的event与sysintr=0x19相关联了。这样当那个设备产生中断进入它的isr后,并从isr返回时,激活了你的事件,释放了你的ist。
我认为,即使确实进入到了你的ist里面,也不能说明是由你的设备的中断引起的(即使此时你的设备也产生中断了)。说了这么多,不知是否说清楚了。

另外,你的sysintr可以试试其他的值。
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-15 17:31
我试了其他值,只有0x19可以
那么ISR都写些什么,我查帮助没有详细的介绍,wwei_wang兄给大概介绍一下吧

wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-12-16 08:21
“我试了其他值,只有0x19可以”,你是说只有当sysintr=0x19时,你的ist才能进去是吧?那是因为有其他的设备产生中断,而它的systintr也是0x19。
既然你使用了ist,那么你的isr主要完成下面的工作就可以了:
(1)确认是否是你的设备产生的中断,如果是,且需要进一步的处理,则返回你的systintr;如果不需要进一步的处理,返回SYSINTR_NOP就行了。
(2)如果不是你的设备产生的中断,返回SYSINTR_CHAIN就可以了。
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-16 13:51
那么ISR动态连接库的就口函数有没有统一的名字?如果有是什么?
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-16 14:02
接口函数, 呵呵
上一页
游客

返回顶部