中断的初始化过程:
中断处理函数是在oal中,文件目录是在intr.c中
OALIntrInit();
OALIntrRequestIrqs();
OALIntrEnableIrqs();
OALIntrDisableIrqs();
OALIntrDoneIrqs();
OEMInterruptHandler();
OEMInterruptEnable();//在platform\common\src\common\intr\common\oem.c
OEMInerruptDisable();//在platform\common\src\common\intr\common\oem.c
OEMInterruptDone();//在platform\common\src\common\intr\common\oem.c
中断的初始化函数是在OEMInit()中调用。
wince6.0中断的调用过程:
1、arm产生中断信号。
2、OEMInterruptHandler开始处理外部中断信号,比如eint0产生中断,这个函数就将eint0中断关闭(屏蔽中断),把中断号转成逻辑中断。触发中断处理线程。
中断注册过程:
Irq = IRQ_IIC;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &gIntrIIC, sizeof(UINT32), NULL))//得到物理中断号的逻辑中断号。
{
DEBUGMSG(ZONE_ERR, (TEXT("ERROR: Failed to request the IIC sysintr.\r\n")));
gIntrIIC = SYSINTR_UNDEFINED;
return(FALSE);
}
// RETAILMSG(1, (TEXT("IIC IRQ mapping: [IRQ:%d->sysIRQ:%d].\r\n"), Irq, gIntrIIC));
// initialize the interrupt
if( !InterruptInitialize(gIntrIIC, pI2C->ISTEvent, NULL, 0) ) //初始化中断,逻辑中断号与事件关联
{
dwErr = GetLastError();
DEBUGMSG(ZONE_ERR,(TEXT("I2C_Init ERROR: Unable to initialize interrupt: %u\r\n"), dwErr));
goto _init_error;
}
InterruptDone(gIntrIIC); //清楚中断,调用底层函数OEMInterrputDone()->OALIntrDoneIrqs();
// create the IST
if ( (pI2C->IST = CreateThread(NULL, 0, I2C_IST, (LPVOID)pI2C, 0, NULL)) == NULL)//创建中断处理线程
{
dwErr = GetLastError();
DEBUGMSG(ZONE_ERR,(TEXT("I2C_Init ERROR: Unable to create IST: %u\r\n"), dwErr));
goto _init_error;
}
// TODO: registry override
if ( !CeSetThreadPriority(pI2C->IST, I2C_THREAD_PRIORITY)) {
dwErr = GetLastError();
DEBUGMSG(ZONE_ERR, (TEXT("I2C_Init ERROR: CeSetThreadPriority ERROR:%d\n"), dwErr));
goto _init_error;
}