日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

应用程序中断处理

發(fā)布時間:2024/9/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 应用程序中断处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引用自: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é)

以上是生活随笔為你收集整理的应用程序中断处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。