3452|9

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于一个硬件中断映射到几个系统中断和几个硬件中断映射到一个系统中断上的问题 [复制链接]

不怎么会写驱动
现在有如上问题.
1,是否可以将一个硬件中断映射到几个系统中断?
2,如果可以怎么实现.
3,我有一个外设使用4个外部中断,现在想共享一个中断,其他流做它用,该怎么处理?假设有A,B,C,D 我现在把硬件中断1,影射到A的系统中断,但为B申请中断1的系统中断时,系统会报,对应1的系统中断已经存在。怎么实现一个硬件中断共享?
4,几个硬件中断影射一个系统中断比较好处理。 像中断按键就是这么处理的。

最新回复

DeviceArrayIndex 这个是在IISR里查找被触发的设备时用的,如果有几个共享一个ISR,那么DeviceArrayIndex应该被设为不同的0,1,2... 所以你的if( DeviceArrayIndex == 0 ) 我就不明白了,为什么要这么做?  详情 回复 发表于 2009-4-28 14:58
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
使用LoadIntChainHandler函数来注册ISR来共享中断,1个SYSINTID对应不同的ISR HANDLE。。
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
使用静态中断可以。动态不行。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
我也觉得静态可以,但是到ISR内部还要改。因为如果A先处理中断,而此时该中断非A的那么 interruptdone后就会把中断清掉。其他的就没机会了。


 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 nick_TS16949 的回复:
使用LoadIntChainHandler函数来注册ISR来共享中断,1个SYSINTID对应不同的ISR HANDLE。。

你的意思可是使用 IISR?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
郁闷。。做过的大虾露个脸。。具体怎么搞啊。
谢谢 先。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 papapa123123 的回复:
引用 1 楼 nick_TS16949 的回复:
使用LoadIntChainHandler函数来注册ISR来共享中断,1个SYSINTID对应不同的ISR HANDLE。。

你的意思可是使用 IISR?


对的,IISR可以使多个设备共享同一个硬件IRQ,将ISR安装到平台中,需要这两个步骤:
1、调用LoadIntChainHandler函数来加载包含ISR代码的DLL
2、该ISR须把IRQ转化为某个SYSINTR_XXX并返回。

微软提供了IISR的示例程序GIISR,可在目录%_PUBLICROOT%\COMMON\OAK\DRIVERS\GIISR下找到
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
非常感谢6楼的哥们。

我的情况是这样的,用ce5.0自带的serial驱动改写了16c554的驱动。开始都用得是独立中断。现在想用共享中断把藤出来的3个中断用做其它用途。

自己clone了 ISR16550目录,并生成了isr16550.dll.根据PB help上讲的,这个isr16550.dll就是IISR了。
在注册表中添加:
    "IsrDll"="isr16550.dll"
    "IsrHandler"="ISRHandler"
我觉得这个东西已经在微软的里面做好了。
所以似乎不需要LoadIntChainHandler函数。 不知道理解是否对?

2、该ISR须把IRQ转化为某个SYSINTR_XXX并返回。
这个工作应该是在isr16550.dll中做的。

是否还要在pb中指定sysintr_xxx.
下面这个是pb的中给的一个注册表例子。
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
    "SysIntr"=dword:13
    "Irq"=dword:3
    "IoBase"=dword:02F8
    "IoLen"=dword:8
    "DeviceArrayIndex"=dword:0
    "Prefix"="COM"
    "Dll"="Com16550.Dll"
    "Order"=dword:0
    "Priority"=dword:0
    "IsrDll"="isr16550.dll"
    "IsrHandler"="ISRHandler
分析发现在
CPdd16550Isr::Init()
{
LoadIntChainHandler//调用
}
但是又发现要构造cpdd16550isr这个对象时。

  1. CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
  2. {
  3.     CSerialPDD * pSerialPDD = NULL;
  4.   if (DeviceArrayIndex == 0 ) { //这里的DeviceArrayIndex必须等于0时,这么理解那么我四个串口最多只有一个是0,那其它3个怎么办?不用构造了?
  5.           RETAILMSG (1, (TEXT("Create IISR for 16c554!\r\n")));
  6.         pSerialPDD = new CPdd16550Isr(lpActivePath,pMdd, pHwObj);//这里构造一个isr对象?
  7.         if (pSerialPDD && !pSerialPDD->Init()) { //并且初始化失败才执行下面if里的.
  8.             delete pSerialPDD;
  9.             pSerialPDD = NULL;
  10.          }
  11.     }
  12.     if (pSerialPDD == NULL) {
  13.         RETAILMSG (1, (TEXT("Create one object for 16c554!\r\n")));
  14.         pSerialPDD= new CPdd16550(lpActivePath,pMdd, pHwObj);
  15.         if (pSerialPDD && !pSerialPDD->Init()) {
  16.             delete pSerialPDD;
  17.             pSerialPDD = NULL;
  18.         }
  19.    }
  20.     return pSerialPDD;
  21. }
复制代码

我开始用独立中断时这样的


  1. CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
  2. {
  3.     CSerialPDD * pSerialPDD = NULL;
  4.   /*if (DeviceArrayIndex == 0 ) {
  5.           RETAILMSG (1, (TEXT("Create IISR for 16c554!\r\n")));
  6.         pSerialPDD = new CPdd16550Isr(lpActivePath,pMdd, pHwObj);
  7.         if (pSerialPDD && !pSerialPDD->Init()) {
  8.             delete pSerialPDD;
  9.             pSerialPDD = NULL;
  10.          }
  11.     }
  12.     if (pSerialPDD == NULL) {*/
  13.         RETAILMSG (1, (TEXT("Create one object for 16c554!\r\n")));
  14.         pSerialPDD= new CPdd16550(lpActivePath,pMdd, pHwObj);
  15.         if (pSerialPDD && !pSerialPDD->Init()) {
  16.             delete pSerialPDD;
  17.             pSerialPDD = NULL;
  18.         }
  19.    //}
  20.     return pSerialPDD;
  21. }
复制代码

DeviceArrayIndex == 0 才构造.为什么要这样,我的注册表中,扩展的DeviceArrayIndex 是从5开始的. 这样砌不是和不使用IISR一样了?
后面发现
LoadIntChainHandler
在两处地方使用:
一个在SL_init中
还有一个就是上面构造 pSerialPDD = new CPdd16550Isr(lpActivePath,pMdd, pHwObj);在用。
引用 6 楼 nick_TS16949 的回复:
引用 4 楼 papapa123123 的回复:
引用 1 楼 nick_TS16949 的回复:
使用LoadIntChainHandler函数来注册ISR来共享中断,1个SYSINTID对应不同的ISR HANDLE。。

你的意思可是使用 IISR?


对的,IISR可以使多个设备共享同一个硬件IRQ,将ISR安装到平台中,需要这两个步骤:
1、调用LoadIntChainHandler函数来加载包含ISR代码的DLL
2、该ISR须把IRQ转化为某个SYSINTR_XXX并返回。

微软提供了IISR的示例程序GIISR,…
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
现在还有这样的疑问:
如果这个IISR是不是只针对一个设备初始化。
如果不是
我想是不是可以改掉if语句if (DeviceArrayIndex == 0||DeviceArrayIndex == 1||DeviceArrayIndex == 2||DeviceArrayIndex == 3)
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
DeviceArrayIndex 这个是在IISR里查找被触发的设备时用的,如果有几个共享一个ISR,那么DeviceArrayIndex应该被设为不同的0,1,2...
所以你的if( DeviceArrayIndex == 0 )
我就不明白了,为什么要这么做?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表