|
非常感谢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这个对象时。
- CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
- {
- CSerialPDD * pSerialPDD = NULL;
- if (DeviceArrayIndex == 0 ) { //这里的DeviceArrayIndex必须等于0时,这么理解那么我四个串口最多只有一个是0,那其它3个怎么办?不用构造了?
- RETAILMSG (1, (TEXT("Create IISR for 16c554!\r\n")));
- pSerialPDD = new CPdd16550Isr(lpActivePath,pMdd, pHwObj);//这里构造一个isr对象?
- if (pSerialPDD && !pSerialPDD->Init()) { //并且初始化失败才执行下面if里的.
- delete pSerialPDD;
- pSerialPDD = NULL;
- }
- }
- if (pSerialPDD == NULL) {
- RETAILMSG (1, (TEXT("Create one object for 16c554!\r\n")));
- pSerialPDD= new CPdd16550(lpActivePath,pMdd, pHwObj);
- if (pSerialPDD && !pSerialPDD->Init()) {
- delete pSerialPDD;
- pSerialPDD = NULL;
- }
- }
- return pSerialPDD;
- }
复制代码
我开始用独立中断时这样的
- CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
- {
- CSerialPDD * pSerialPDD = NULL;
- /*if (DeviceArrayIndex == 0 ) {
- RETAILMSG (1, (TEXT("Create IISR for 16c554!\r\n")));
- pSerialPDD = new CPdd16550Isr(lpActivePath,pMdd, pHwObj);
- if (pSerialPDD && !pSerialPDD->Init()) {
- delete pSerialPDD;
- pSerialPDD = NULL;
- }
- }
- if (pSerialPDD == NULL) {*/
- RETAILMSG (1, (TEXT("Create one object for 16c554!\r\n")));
- pSerialPDD= new CPdd16550(lpActivePath,pMdd, pHwObj);
- if (pSerialPDD && !pSerialPDD->Init()) {
- delete pSerialPDD;
- pSerialPDD = NULL;
- }
- //}
- return pSerialPDD;
- }
复制代码
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,…
|
|