应用程序中断处理
引用自:http://blog.csdn.net/shuiii/archive/2007/12/01/1910321.aspx
理應用程序或驅動程序的中斷需要兩個步驟。首先,中斷必須使用關聯的事件進行初始化。其次,IST? 必須等待響應內核中斷的中斷事件。
中斷初始化
以下示例代碼將設置? IST? 并將? IST? 與特定的中斷相關聯。初始化中斷的關鍵步驟包括:?
創建事件?
獲取? IRO? 的系統中斷號?
創建掛起的中斷服務線程? (IST)?
調用? InterruptInitialize? 以創建? IRQ? 與事件的關聯?
創建未掛起的? IST? 可能會導致? InterruptInitialize? 失敗,因為該事件已經處于等待狀態。
將線程優先級設置為相應的優先級?
恢復? IST?
Void? SetupInterrupt(? void? )
{ //? 創建事件
//
g_hevInterrupt? =? CreateEvent(NULL,? FALSE,? FALSE,? NULL);
if? (g_hevInterrupt? ==? NULL)?
{???????????? RETAILMSG(1,? (TEXT("DEMO:? Event? creation? failed!!!\r\n")));
??????????? return;
}
//? 使? OAL? 將? IRQ? 轉換成系統? IRQ
//
fRetVal??????????? =? KernelIoControl(? IOCTL_HAL_TRANSLATE_IRQ,?
??????????????????????????????????????????????? &dwIrq,
??????????????????????????????????????????????? sizeof(? dwIrq? ),
??????????????????????????????????????????????? &g_dwSysInt,
??????????????????????????????????????????????? sizeof(? g_dwSysInt? ),
??????????????????????????????????????????????? NULL? );
//? 創建等待信號的線程
//
g_fRun????? =? TRUE;
g_htIST????????????????? =? CreateThread(NULL,????? //? 安全性
????????????????????????????? 0,????????????? //? 沒有堆大小
????????????????????????????? ThreadIST,????? //? 中斷線程
????????????????????????????? NULL,??????????? //? 沒有參數
????????????????????????????? CREATE_SUSPENDED,? //? 創建掛起的線程
????????????????????????????? &dwThreadID????? //? 線程? ID
????????????????????????????? );
//? 設置線程的優先級? -? 隨意選擇了? 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? );
}
需要特別注意的是,調用? InterruptInitialize? 僅獲取? SYSINTR? 值和事件。內核不知道或者說也不關心將要等待事件的線程。這樣一來,就可以建立多種應用程序和驅動程序體系結構。應用程序的簡單主循環可以初始化中斷,然后立即等待事件。一個中斷只能與一個事件關聯,并且調用? WaitForMultipleObjects? 的過程中不能使用該事件。我們將會看到一個簡單的線程為中斷服務。這是大多數實現方案中的標準解決方法。
應用程序中斷服務例程:
以下是中斷服務線程? (IST)? 的示例代碼。此? IST? 中斷處理線程的關鍵組件包括:?
等待中斷事件?
確認有一個來自操作系統的事件?
在盡可能短的時間內處理中斷?
調用? InterruptDone()?
在調用? InterruptDone? 之前,操作系統不會提供有關此? IRQ? 的另一個中斷。
再次等待中斷事件?
DWORD????? WINAPI????? ThreadIST(? LPVOID? lpvParam? )
{?????? DWORD????? dwStatus;
????? //? 始終檢查運行標志
????? //
????? while(? g_fRun? )
????? {
??????????? dwStatus????? =? WaitForSingleObject(g_hevInterrupt,? INFINITE);
??????????? //? 確保擁有對象
??????????? //
??????????? if(? dwStatus? ==? WAIT_OBJECT_0? )
??????????? {
????????????????? //? 在此處理中斷
????????????????? //
????????????????? g_dwInterruptCount? ++;
????????????????? //? 完成中斷
????????????????? //
????????????????? InterruptDone(? g_dwSysInt? );
??????????? }
????? }
????? return? 0;
}[
轉載于:https://www.cnblogs.com/harber/archive/2007/12/18/1004995.html
總結
- 上一篇: JavaFx实现-渐变效果之一
- 下一篇: 石墨烯行业龙头是谁 石墨烯龙头股一览