首先:介绍一下wince中断处理过程,
WinCE的中断处理模型
二、WinCE中断体系结构
从结构上看,WinCE中断涉及4 层,即:硬件层、内核层、OAL层、IST处理层。了解这 4层之间的交互传递将对我们了解WinCE中断处理很有帮助。
1、硬件层:
2、OAL层
3、内核层:
4、IST处理层
三、WinCE中断处理实例(按键控制LED)
详细代码下载地址:http://download.csdn.net/detail/maoxiaosan/4418328
大致步骤如下:
1.
2、
3、
4、
5、
6、
7、
采用流驱动编写
详细代码下载地址:http://download.csdn.net/detail/maoxiaosan/4418328
1.初始化GPIO口
//声明的一些变量
HANDLE m_interruptTestEvent = NULL;
HANDLE m_interrupTestThread = NULL;
DWORD m_interruptTestSysId = SYSINTR_UNDEFINED;
DWORD m_interruptTestPhyId = 0;
LPDWORD lpThreadId = NULL;
DWORD threadpriority = 6;
BOOL m_ExitThread = FALSE ;
void InitInterruptTestGPIO(void)
{
RETAILMSG(1,(TEXT("***test InitInterruptTestGPIO
// interrupt led test
v_pIOPregs->GPMCON &= 0xfffffff0; //set pin out
v_pIOPregs->GPMCON |= 0x1;
v_pIOPregs->GPMPUD &= 0xfffffffc ;
v_pIOPregs->GPMPUD |= 0x2;
//interrup sourse gpn0
v_pIOPregs->GPNCON &= 0xfffffffc;
v_pIOPregs->GPNCON |= (0x2<<0);
v_pIOPregs->GPNPUD &= 0xfffffffc;
v_pIOPregs->GPNPUD |= (0x2<<0);
//filter enable
v_pIOPregs->EINT0FLTCON0 = (v_pIOPregs->EINT0FLTCON0 & ~(0x1<<6)) |(0x1<<7);
//Configurate the EINT0 Trigger of Flowing Type 01x 配置EINT0为下降沿触发
v_pIOPregs->EINT0CON0 &= 0xfffffff8;
v_pIOPregs->EINT0CON0 |= (0x2<<0);
}
2.使能中断
BOOL Enble_Test_Interrupt(void)
{
//clear interrupt eint 0
v_pIOPregs->EINT0PEND = (0x1<<0);
//ENable Interrupt MASK EINT0
v_pIOPregs->EINT0MASK =v_pIOPregs->EINT0MASK & ~(0x1<<0);
return true;
}
3.物理中断映射成系统中断号,创建中断事件及中断处理线程
BOOL InitInterruptTest(void)
{
m_interruptTestPhyId
//物理中断映射成系统中断号
if
{
RETAILMSG(1,(TEXT("******test KernelIoControlt fail\r\n")));
m_interruptTestSysId = SYSINTR_UNDEFINED;
return FALSE;
}
//create an event
m_interruptTestEvent
if (NULL == m_interruptTestEvent)
{
RETAILMSG(1,(TEXT("******test create event fail\r\n")));
return FALSE;
}
// 创建一个挂起的线程
m_interrupTestThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)Threadproc,//Interrupt Thread
NULL,
CREATE_SUSPENDED, // Create Suspended
lpThreadId ); // Thread Id
// set the thread priority
threadpriority
if( !CeSetThreadPriority( m_interrupTestThread, threadpriority))
{
RETAILMSG(1,(TEXT("test: Failed setting Thread Priority.\r\n")));
return FALSE;
}
//initialize interrupt event
if (!InterruptInitialize(m_interruptTestSysId,m_interruptTestEvent,NULL,0))
{
ERRORMSG( 1, (TEXT("test interrupt is not initialized\n\r")));
return(FALSE);
}
//启动线程
ResumeThread( m_interrupTestThread );
return TRUE;
}
4.中断线程处理函数
DWORD WINAPIThreadproc(LPVOID lpvParam)
{
DWORD
BOOL
static BOOL count = TRUE;
while (!m_ExitThread)
{
if (m_ExitThread)
{
break;
}
if (dwStatus == WAIT_OBJECT_0)
{
RETAILMSG(1,(TEXT("test thread happend \r\n")));
}
count = ~count;
if(count&0x1)
else
v_pIOPregs->GPMDAT &= 0xfffffffe;//灯亮
InterruptDone(m_interruptTestSysId);
Enble_Test_Interrupt();
}
return FALSE;
}