|
因为当时看定时器的时候,理解中断用了很长的时间,所以我把中断和定时器分开了。
中断的确是个好东西。
定时器可以进行定时,可以每隔多长时间发出一个脉冲,这个脉冲可以在tout引脚用示波器检测到。而如果我想隔一段时间做一件或多件其他的事情(不再单单发出脉冲),就要用到中断了。
将定时器设置工作在中断方式,然后在这个中断信号来临的时候do something。
wince6.0的中断方式有特定的模式,如下:
void IntProcess()
{
UINT32 IRQ;//作为中断号
HANDLE IntEvent;用这个事件和中断号联系起来,如此中断产生,则激活事件
IntEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!IntEvent)
{
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to create event.\r\n")));
return FALSE;
}
IRQ = 10; //IRQ_TIMER0;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr, sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr, IntEvent, NULL, 0))
{
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
while(1)
{
dwStatus=WaitForSingleObject(IntEvent, INFINITE);//在无限的时间里等待事件,时间来临则返回WAIT_OBJECT_0,当然还有其他的返回值,可以参考其他资料
if(dwStatus==WAIT_OBJECT_0)
{
yourthings……
}
InterruptDone(g_KeySysIntr);//中断结束,可以相应下次中断
}
}
实验报告:
一开始进入中断,但是中断频率变小,原因是使用了RETAILMSG函数来打印串口信息。调试的时候用此函数可以清晰的看出返回值,但是它耗费的时间太长,导致下次中断来临,却执行不到InterruptDone,导致遗失中断信号。
注意中断程序执行时间,避免遗失中断信号。
2012.11.16 |
|