|
请教一下CE6.0共享中断的问题,我要做一个GPIO共享中断,使用的是X86架构的板子,我自己写了仿照GIISR写了一个ISR,在驱动中调用LoadIntChainHandler()这个函数将ISR与IRQ添加到可安装的ISR链表中,可是我发现在IST结束时,我的ISR并没有被释放掉,我是用FreeIntChainHandler()释放ISR,这是我的处理代码:
//载入GIO_ISR.dll
g_isrHandle = LoadIntChainHandler(_T("GIO_ISR.dll"),_T("ISRHandler"),pIstInfo->irq);
//获取系统逻辑中断
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&pIstInfo->irq,sizeof(pIstInfo->irq),&pIstInfo->SysIntr,sizeof(pIstInfo->SysIntr),NULL);
//传递参数到ISR中
KernelLibIoControl(g_isrHandle,IOCTL_IISR_INFO,&info,sizeof(ISR_INFO),NULL,0,NULL);
这是结束IST函数:
BOOL StopIst(PIST_INFO pIstInfo)
{
DWORD Result;
//判断线程是否创建
if ( pIstInfo->hThread != NULL) {
//设置线程退出标识
pIstInfo->IstQuit = true;
SetEvent(pIstInfo->hEvent);
//等待事件退出线程
Result = WaitForSingleObject(pIstInfo->hEvent,INFINITE);
if (WAIT_OBJECT_0 == Result) {
//断开中断
InterruptDisable(pIstInfo->SysIntr);
//释放系统逻辑中断
KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&pIstInfo->SysIntr,sizeof(pIstInfo->SysIntr),NULL,0,NULL);
//释放ISR
FreeIntChainHandler(pIstInfo->hISR);
CloseHandle(pIstInfo->hEvent);
CloseHandle(pIstInfo->hThread);
CloseHandle(pIstInfo->hISR);
pIstInfo->hEvent = NULL;
pIstInfo->hThread = NULL;
pIstInfo->IstQuit = false;
pIstInfo->irq = 0;
pIstInfo->SysIntr = 0;
pIstInfo->hWnd = NULL;
}
else {
return false;
}
}
return true;;
}
我怀疑使用FreeIntChainHandler(pIstInfo->hISR);时没有调用ISR中的DestroyInstance()函数,有一点迷惑处是,MSDN上的DestroyInstance()函数是BOOL类型,而MS的GIISR中的代码却是void类型,不知是否还有其它玄机,还望各位大侠慷慨赐教,在下不胜感激。
|
|