应用程序中断处理
引用自:http://blog.csdn.net/shuiii/archive/2007/12/01/1910321.aspx
理應(yīng)用程序或驅(qū)動程序的中斷需要兩個步驟。首先,中斷必須使用關(guān)聯(lián)的事件進(jìn)行初始化。其次,IST? 必須等待響應(yīng)內(nèi)核中斷的中斷事件。
中斷初始化
以下示例代碼將設(shè)置? IST? 并將? IST? 與特定的中斷相關(guān)聯(lián)。初始化中斷的關(guān)鍵步驟包括:?
創(chuàng)建事件?
獲取? IRO? 的系統(tǒng)中斷號?
創(chuàng)建掛起的中斷服務(wù)線程? (IST)?
調(diào)用? InterruptInitialize? 以創(chuàng)建? IRQ? 與事件的關(guān)聯(lián)?
創(chuàng)建未掛起的? IST? 可能會導(dǎo)致? InterruptInitialize? 失敗,因為該事件已經(jīng)處于等待狀態(tài)。
將線程優(yōu)先級設(shè)置為相應(yīng)的優(yōu)先級?
恢復(fù)? IST?
Void? SetupInterrupt(? void? )
{ //? 創(chuàng)建事件
//
g_hevInterrupt? =? CreateEvent(NULL,? FALSE,? FALSE,? NULL);
if? (g_hevInterrupt? ==? NULL)?
{???????????? RETAILMSG(1,? (TEXT("DEMO:? Event? creation? failed!!!\r\n")));
??????????? return;
}
//? 使? OAL? 將? IRQ? 轉(zhuǎn)換成系統(tǒng)? IRQ
//
fRetVal??????????? =? KernelIoControl(? IOCTL_HAL_TRANSLATE_IRQ,?
??????????????????????????????????????????????? &dwIrq,
??????????????????????????????????????????????? sizeof(? dwIrq? ),
??????????????????????????????????????????????? &g_dwSysInt,
??????????????????????????????????????????????? sizeof(? g_dwSysInt? ),
??????????????????????????????????????????????? NULL? );
//? 創(chuàng)建等待信號的線程
//
g_fRun????? =? TRUE;
g_htIST????????????????? =? CreateThread(NULL,????? //? 安全性
????????????????????????????? 0,????????????? //? 沒有堆大小
????????????????????????????? ThreadIST,????? //? 中斷線程
????????????????????????????? NULL,??????????? //? 沒有參數(shù)
????????????????????????????? CREATE_SUSPENDED,? //? 創(chuàng)建掛起的線程
????????????????????????????? &dwThreadID????? //? 線程? ID
????????????????????????????? );
//? 設(shè)置線程的優(yōu)先級? -? 隨意選擇了? 5
//
m_nISTPriority? =? 5;
if(? !CeSetThreadPriority(? g_htIST,? m_nISTPriority? ))
{???????????? RETAILMSG(1,(TEXT("DEMO:? Failed? setting? Thread? Priority.\r\n")));
??????????? return;
}
//? 初始化中斷
//
if? (? !InterruptInitialize(g_dwSysInt,g_hevInterrupt,NULL,0)? )?
{???????????? RETAILMSG? (1,? (TEXT("DEMO:? InterruptInitialize? failed!!!\r\n")));
??????????? return;
}
//? 使線程啟動
//
ResumeThread(? g_htIST? );
}
需要特別注意的是,調(diào)用? InterruptInitialize? 僅獲取? SYSINTR? 值和事件。內(nèi)核不知道或者說也不關(guān)心將要等待事件的線程。這樣一來,就可以建立多種應(yīng)用程序和驅(qū)動程序體系結(jié)構(gòu)。應(yīng)用程序的簡單主循環(huán)可以初始化中斷,然后立即等待事件。一個中斷只能與一個事件關(guān)聯(lián),并且調(diào)用? WaitForMultipleObjects? 的過程中不能使用該事件。我們將會看到一個簡單的線程為中斷服務(wù)。這是大多數(shù)實現(xiàn)方案中的標(biāo)準(zhǔn)解決方法。
應(yīng)用程序中斷服務(wù)例程:
以下是中斷服務(wù)線程? (IST)? 的示例代碼。此? IST? 中斷處理線程的關(guān)鍵組件包括:?
等待中斷事件?
確認(rèn)有一個來自操作系統(tǒng)的事件?
在盡可能短的時間內(nèi)處理中斷?
調(diào)用? InterruptDone()?
在調(diào)用? InterruptDone? 之前,操作系統(tǒng)不會提供有關(guān)此? IRQ? 的另一個中斷。
再次等待中斷事件?
DWORD????? WINAPI????? ThreadIST(? LPVOID? lpvParam? )
{?????? DWORD????? dwStatus;
????? //? 始終檢查運行標(biāo)志
????? //
????? while(? g_fRun? )
????? {
??????????? dwStatus????? =? WaitForSingleObject(g_hevInterrupt,? INFINITE);
??????????? //? 確保擁有對象
??????????? //
??????????? if(? dwStatus? ==? WAIT_OBJECT_0? )
??????????? {
????????????????? //? 在此處理中斷
????????????????? //
????????????????? g_dwInterruptCount? ++;
????????????????? //? 完成中斷
????????????????? //
????????????????? InterruptDone(? g_dwSysInt? );
??????????? }
????? }
????? return? 0;
}[
轉(zhuǎn)載于:https://www.cnblogs.com/harber/archive/2007/12/18/1004995.html
總結(jié)
- 上一篇: JavaFx实现-渐变效果之一
- 下一篇: NCNE二级复习资料-网络监视、管理和排