处理应用程序或驱动程序的中断需要两个步骤。首先,中断必须使用关联的事件进行初始化。其次,IST 必须等待响应内核中断的中断事件。以下是我在做平时应用中的一个例子。
一、中断初始化。简单来说,主要有以下步骤
首先定义一个中断信息结构体,用于提供中断和线程的信息。
- //中断信息
-
typedef struct tagINSTINFO{
-
HANDLE m_hIntThread; //中断处理线程
-
HANDLE m_hIntEvent; //事件
-
BOOL m_bRunning; //是否在运行
-
} INTRINFO, *LPINTRINFO;
然后创建事件
- //创建事件
-
s_TIMER1.m_hIntEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
事件创建以后,创建一个线程用于等待事件的发生,事件何时何怎么发生呢?在下面会有提到。之所以要创建挂起的 IST (中断服务线程),是因为如果创建不挂起的IST的话可能会导致 InterruptInitialize 失败,因为该事件已经处于等待状态。
- //创建等待信号线程
-
s_TIMER1.m_hIntThread = ::CreateThread(
-
NULL, 0,
-
TIMER1ThreadIST,
-
NULL,
-
CREATE_SUSPENDED,
-
NULL
-
);
线程创建以后,由于我这里用了CREATE_SUSPENDED,线程就会调用WaitForSingleObject一直的等待,等待有人把他唤醒。该怎么唤醒,这就是接下来这一步要做的。我接下来调用InterruptInitialize函数把定时器1中断与上文创建的事件绑定,绑定之后当定时器1中断发生时,即触发中断,进而激活事件,WaitForSingleObject等待结束,上文创建的中断线程也得以运行。
- InterruptInitialize(
-
SYSINTR_TIMER1,
-
s_TIMER1.m_hIntEvent,
-
NULL,
-
0))
整个过程的实现代码如下:
- //中断信息
-
typedef struct tagINSTINFO{
-
-
HANDLE m_hIntThread; //中断处理线程
-
HANDLE m_hIntEvent; //事件
-
BOOL m_bRunning; //是否在运行
-
-
} INTRINFO, *LPINTRINFO;
-
-
static INTRINFO s_TIMER1 = {NULL, NULL, TRUE};
-
-
BOOL StartupTIMER1Interrupt(VOID) //启动定时器1中断线程
-
{
-
//创建事件
-
s_TIMER1.m_hIntEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
-
-
if (s_TIMER1.m_hIntEvent == NULL)
-
return FALSE;
-
-
//创建等待信号线程
-
s_TIMER1.m_hIntThread = ::CreateThread(
-
NULL, 0,
-
TIMER1ThreadIST,
-
NULL,
-
CREATE_SUSPENDED,
-
NULL
-
);
-
-
if (s_TIMER1.m_hIntThread == NULL)
-
return FALSE;
-
-
//初始化中断,InterruptInitialize把定时器1中断与上文创建的事件绑定,
-
//当定时器1中断发生时,即触发中断,进而激活事件,上文创建的线程也得以运行。
-
if (::InterruptInitialize(
-
SYSINTR_TIMER1,
-
s_TIMER1.m_hIntEvent,
-
NULL,
-
0))
-
{
-
//设置线程优先级
-
::CeSetThreadPriority(
-
s_TIMER1.m_hIntThread,
-
PRIORITY_TIMER1
-
);
-
-
//启动线程
-
::ResumeThread(s_TIMER1.m_hIntThread);
-
}
-
-
s_TIMER1.m_bRunning = TRUE;
-
return TRUE;
-
}
中断线程函数如下
- DWORD TIMER1ThreadIST(LPVOID lpdata) //时钟1中断线程函数
-
{
-
DWORD dwStatus;
-
INT i;
-
-
while (s_TIMER1.m_bRunning)
-
{
-
dwStatus = ::WaitForSingleObject(
-
s_TIMER1.m_hIntEvent,
-
INFINITE
-
);
-
-
if (!s_TIMER1.m_bRunning) break;
-
-
if (dwStatus == WAIT_OBJECT_0)
-
{
-
if (g_systemStatus.m_playingRscan)
-
{
-
g_systemInfo.m_playCounter++;
-
}
-
-
g_timer1Counter++;
-
g_gatherInfo.m_readEnabled = FALSE;
-
-
if (!g_systemStatus.m_freezeState)
-
{
-
i = IOMEMADDR(IO_ULTRASOINC_PULSER_R);
-
}
-
-
::InterruptDone(SYSINTR_TIMER1);
-
}
-
}
-
-
return 0;
-
}
ps:这里没有把全部变量和函数的定义写出来。
阅读(3193) | 评论(0) | 转发(0) |