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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinCE 6.0中断驱动程序分析

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinCE 6.0中断驱动程序分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Windows Embedded CE 6.0的中斷處理過程主要分為兩部分:

  • ?中斷服務例程(ISR):處于內核中的低級處理程序,中斷發生時首先被調用。
  • 中斷服務線程(IST):處于驅動或者應用中的中斷處理線程,由系統調度,完成大部分的中斷處理工作。

ISR的實現在OALOEM適配層)中,它只處理最低級的中斷響應,通常是獲取IRQSYSINTR并設置MCU內部的中斷控制寄存器。中斷處理的主要部分在驅動或者應用的中斷處理線程中。中斷處理線程與其他普通線程一樣,使用同一個線程優先級管理系統。ISRIST之間通過事件對象進行同步。IST中創建一個事件對象,并使用函數WaitForSingleObject()等待該事件被觸發。ISR中通知內核觸發相應的事件對象。Windows Embedded CE 6.0的中斷處理的過程如下圖所示。

                  Windows Embedded CE 6.0的中斷處理過程

  在其他的一些嵌入式操作系統中,在介紹中斷處理時經常會提到一個中斷向量表的概念,如uC/OS。當中斷發生時它會進入IRQ的處理程序,并根據IRQ的值跳轉到事先分配好的中斷向量表相應的中斷處理函數中。但在WinCE中實際上并不存在中斷向量表的概念,而只有一個異常向量表,對應于MCU的幾種運行模式。WinCE的中斷處理對應于兩個異常IRQHandlerFIQHandler,通常我們使用的是IRQHandler。當外部中斷產生時,系統執行IRQHandler(),IRQHandler()中調用OEMInterruptHandler()獲取IRQ對應的SYSINTR,然后根據SYSINTR調用函數OEMNotifyIntrOccurs()觸發與SYSINTR關聯的事件,最后由IST完成主要的中斷處理工作。這種中斷處理機制在一定程度上影響了系統的實時性,但提高了IST的靈活性。有關WinCE系統實時性分析,將在另外一篇中描述。

???? 下面結合DEVICEEMULATORPWRBUTTON驅動進行分析。該驅動也是一個流驅動,所以可以用驅動調試助手進行動態加載和卸載,但需要對代碼進行相應的修改,否則會出問題。

??? 首先看PBT_Init()函數,代碼如下:

Code
DWORD
PBT_Init(DWORD?dwContext)
{
????DWORD???IDPowerButtonThread;
????DWORD???IDResetButtonThread;
????HMODULE?hmCore;

????
//
????
//?從CORE?Library中獲取電源管理器"SetSystemPowerState"的函數指針/
????pfnSetSystemPowerState?=?NULL;

????hmCore?
=?(HMODULE)?LoadLibrary(_T("coredll.dll"));

????
if(hmCore?!=?NULL)
????
{
????????pfnSetSystemPowerState?
=?(PFN_SetSystemPowerState)?GetProcAddress(hmCore,?_T("SetSystemPowerState"));

????????
if(pfnSetSystemPowerState?==?NULL)
????????
{
????????????FreeLibrary(hmCore);
????????}

????}


????
//初始化相關的虛擬內存地址
????InitializeAddresses();

????
//?創建POWER?Button的IST和RESET?Button的IST
????ResetButtonIntrThreadHandle?=?CreateThread(0,?0,?(LPTHREAD_START_ROUTINE)?ResetButtonIntrThread,?0,?0,?&IDResetButtonThread);
????
if?(ResetButtonIntrThreadHandle?==?0)
????
{
????????RETAILMSG(
1,?(TEXT("PBT:?CreateThread()?Fail\r\n")));
????}

????PowerButtonIntrThreadHandle?
=?CreateThread(0,?0,?(LPTHREAD_START_ROUTINE)?PowerButtonIntrThread,?0,?0,?&IDPowerButtonThread);
????
if?(PowerButtonIntrThreadHandle?==?0)
????
{
????????RETAILMSG(
1,?(TEXT("PBT:?CreateThread()?Fail\r\n")));
????}


????
return?(dwContext);
}

? ? ? RESET ButtonISTPOWER ButtonIST基本一致,所以這里只分析POWER ButtonIST,代碼如下。? ? ??

Code
static?DWORD
PowerButtonIntrThread(PVOID?pArg)
{
????
//初始化中斷寄存器,使能相應的中斷
????EnablePowerButtonInterrupt();

????
//創建一個事件
????PwrButtonIntrEvent?=?CreateEvent(NULL,?FALSE,?FALSE,?NULL);

????
//
????
//?根據IRQ獲取一個SYSINTR
????
//
????if?(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,?&PwrButtonIrq,?sizeof?PwrButtonIrq,?&PwrButtonSysIntr,?sizeof?PwrButtonSysIntr,?NULL))
????
{
????????RETAILMSG(
1,?(TEXT("PBT:?Error!?Failed?to?request?sysintr?value?for?power?button?interrupt.\r\n")));
????????
return(0);
????}

????
????
//關聯SYSINTR和之前創建的事件
????if?(!(InterruptInitialize(PwrButtonSysIntr,?PwrButtonIntrEvent,?0,?0)))
????
{
????????RETAILMSG(
1,?(TEXT("ERROR:?PwrButton:?Interrupt?initialize?failed.\r\n")));
????}


????
//POWER?Button按下的處理程序
????for?(;;)
????
{
????????WaitForSingleObject(PwrButtonIntrEvent,?INFINITE);
????????
????????
if?(PowerButtonIsPushed())?//確認按鍵確實被按下,消除抖動
????????{
????????????Sleep(
200);?????????//延遲200ms,排除長按的情況
????????????if?(!PowerButtonIsPushed())????//按鍵被有效釋放
????????????{
????????????????
//
????????????????
//關閉系統?
????????????????
//
????????????????if(pfnSetSystemPowerState?!=?NULL)
????????????????
{
????????????????????RETAILMSG(
1,(TEXT("PBT:?Signalling?power?manager?to?suspend\r\n")));
????????????????????pfnSetSystemPowerState(NULL,?POWER_STATE_SUSPEND,?POWER_FORCE);
????????????????}
?else?{
????????????????????RETAILMSG(
1,(TEXT("PBT:?Suspending?by?calling?PowerOffSystem\r\n")));
????????????????????PowerOffSystem();
????????????????}

????????????????
//
????????????????
//結束當前線程的時間片
????????????????Sleep(0);
????????????}

????????????
else
????????????????RETAILMSG(
1,(TEXT("PBT:?Button?held?too?long?(ignored)\r\n")));
????????}

????????
else
????????????RETAILMSG(
1,(TEXT("PBT:?Feeble?button?press?or?noise?triggered?it?(ignored)\r\n")));

????????InterruptDone(PwrButtonSysIntr);
????}

}

?   以上代碼結構清晰,不再贅述。但這樣編譯出來的驅動是不能通過驅動調試助手動態加載的,必須進行相應的修改才行。主要原因是沒有善始善終,分配的系統邏輯中斷沒有釋放,系統邏輯中斷與事件的關聯也沒有取消。實驗現象是,能通過驅動調試助手加載卸載,但中斷并不能正常工作了。下面介紹一下解決這個問題的辦法。

  首先定義一個全局變量g_bThreadExit初始化為FALSE。IST修改后的代碼如下:

Code
static?DWORD
PowerButtonIntrThread(PVOID?pArg)
{
//初始化中斷寄存器,使能相應的中斷
????EnablePowerButtonInterrupt();

????
//創建一個事件
????PwrButtonIntrEvent?=?CreateEvent(NULL,?FALSE,?FALSE,?NULL);

????
//
????
//?根據IRQ獲取一個SYSINTR
????
//
????if?(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,?&PwrButtonIrq,?sizeof?PwrButtonIrq,?&PwrButtonSysIntr,?sizeof?PwrButtonSysIntr,?NULL))
????
{
????????RETAILMSG(
1,?(TEXT("PBT:?Error!?Failed?to?request?sysintr?value?for?power?button?interrupt.\r\n")));
????????
return(0);
????}

????
????
//關聯SYSINTR和之前創建的事件
????if?(!(InterruptInitialize(PwrButtonSysIntr,?PwrButtonIntrEvent,?0,?0)))
????
{
????????RETAILMSG(
1,?(TEXT("ERROR:?PwrButton:?Interrupt?initialize?failed.\r\n")));
????}

????
????
//?POWER?Button按下的處理程序
????for?(;;)
????
{
????????WaitForSingleObject(PwrButtonIntrEvent,?INFINITE);
????????????????
????????
if(g_bThreadExit)
????????
{
????????????
break;????
????????}


????????
if?(PowerButtonIsPushed())?????//確認按鍵確實被按下,消除抖動
????????{
????????????Sleep(
200);?????????//延遲ms,排除長按的情況
????????????if?(!PowerButtonIsPushed())????//按鍵被有效釋放
????????????{
????????????????
//
????????????????
//關閉系統
????????????????
//
????????????????if(pfnSetSystemPowerState?!=?NULL)
????????????????
{
????????????????????RETAILMSG(
1,(TEXT("PBT:?Signalling?power?manager?to?suspend\r\n")));
????????????????????pfnSetSystemPowerState(NULL,?POWER_STATE_SUSPEND,?POWER_FORCE);
????????????????}
?else?{
????????????????????RETAILMSG(
1,(TEXT("PBT:?Suspending?by?calling?PowerOffSystem\r\n")));
????????????????????PowerOffSystem();
????????????????}

????????????????
//
????????????????
//結束當前線程的時間片
????????????????
//
????????????????Sleep(0);
????????????}

????????????
else
????????????????RETAILMSG(
1,(TEXT("PBT:?Button?held?too?long?(ignored)\r\n")));
????????}

????????
else
????????????RETAILMSG(
1,(TEXT("PBT:?Feeble?button?press?or?noise?triggered?it?(ignored)\r\n")));

????????InterruptDone(PwrButtonSysIntr);
????}

????
????
//取消IRQ與SYSINTR之間的關聯
????KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&PwrButtonSysIntr,?sizeof(UINT32),NULL,0,?NULL);
????
????
//取消Event與PwrButtonSysIntr之間的關聯
????InterruptDisable(PwrButtonSysIntr);

????CloseHandle(PwrButtonIntrEvent);
????
????RETAILMSG(
1,?(TEXT("PowerButtonIntrThread?Exit.\r\n")));
????
return?0;
}

  PBT_Deinit()修改后的代碼如下:

Code
BOOL
PBT_Deinit(DWORD?dwContext)
{
????RETAILMSG(
1,?(TEXT("PBT:?PBT_Deinit()\r\n")));
????
//設置退出線程的標志
g_bThreadExit?=?TRUE;
????
//模擬一個中斷事件
SetInterruptEvent(PwrButtonSysIntr);
????
//延遲500ms,確保IST退出
Sleep(500);

????
return?(TRUE);
}

  經過以上修改,該中斷驅動程序就可以通過驅動調試助手動態加載和卸載,并能正常工作了。另外,在模擬器中由于沒有外部中斷按鍵,可以通過創建一個特定名稱的事件與中斷關聯,并在另外一個應用或者驅動中設置該事件以模擬一個外部中斷按鍵的觸發,這種方法也可以在實際平臺中根據需要使用。示例代碼如下:

Code
//打開與中斷關聯的事件
gIntrEvent?=?CreateEvent(NULL,?FALSE,?FALSE,?_T("PBTINTR"));
//設置該事件,模擬一個中斷的觸發
SetEvent(gIntrEvent);
IST中創建與中斷關聯的事件代碼修改如下:
PwrButtonIntrEvent?
=?CreateEvent(NULL,?FALSE,?FALSE,?_T("PBTINTR"));

  總的來說,WinCE中斷處理過程結構清晰,方便開發人員靈活設計IST。在使用驅動調試助手調試有關中斷的驅動程序時,需要善始善終,否則會出現中斷不能正常工作的情況。

總結

以上是生活随笔為你收集整理的WinCE 6.0中断驱动程序分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费污视频在线观看 | 狠狠干干干 | 亚洲av无码乱码国产精品 | 国产极品美女高潮无套在线观看 | 欧美日韩一区二区综合 | 亚洲av无码乱码国产麻豆 | 国产调教| 特级做a爰片毛片免费69 | 欧美日韩视频无码一区二区三 | 少妇又紧又色又爽又刺激 | 国产精品日韩精品欧美精品 | 超碰97在线看 | 三级黄色片网站 | 欧美精品一级在线观看 | 人妻在卧室被老板疯狂进入 | 国产真人毛片 | 偷偷色噜狠狠狠狠的777米奇 | 欧美伦理一区 | 亚洲一区二区三区不卡视频 | 亚洲午夜久久久久久久久久久 | 亚洲国产黄色 | 日本一区二区三区免费观看 | 成人亚洲网站 | 欧美一级网 | 国产精品一区二三区 | 人妖和人妖互交性xxxx视频 | 男人天堂色 | 按摩ⅹxxx性hd中国 | 欧美手机看片 | 日本在线一区二区三区 | 五月天激情四射 | 国产在线综合网 | 九九热这里有精品视频 | 国产成人欧美一区二区三区的 | 色八戒av| 国产a一区 | 国产欧美一区二区三区精品酒店 | 色欲AV无码精品一区二区久久 | 久久亚洲av无码西西人体 | 日韩亚洲国产精品 | 久久东京 | 日韩porn| 极品尤物魔鬼身材啪啪仙踪林 | 国产精品a久久久久 | 窝窝午夜精品一区二区 | 日韩欧美综合一区 | 免费午夜av | 少妇熟女高潮流白浆 | 五月激情综合 | 天天综合天天做天天综合 | 国产东北女人做受av | 免费大片黄在线观看视频网站 | 一级黄色片免费在线观看 | 日本一区免费视频 | 日韩av日韩 | 午夜精品一区 | 一本色道久久综合狠狠躁 | 色资源在线观看 | 日本黄色录像片 | 爱爱视频在线播放 | 九七人人爽| 青草国产视频 | 国外亚洲成av人片在线观看 | 亚洲av永久无码精品一区二区国产 | 精品久久久久久久无码 | 少妇3p视频 | 91亚洲专区 | 久久国产精品网站 | 在线一区观看 | 成人av手机在线 | 国产一级视频在线 | 寡妇av| 国产精品7777777 | 宅男午夜影院 | 久久99精品久久久久子伦 | 91嫩草欧美久久久九九九 | 欧美福利在线 | 久久久国产成人一区二区三区 | 欧美精品在线一区 | 爱的色放3| 国产精品无码一区二区无人区多人 | www.youjizz.com日本 | 日韩www| 亚洲精品在线播放视频 | 捆绑调教视频网站 | 欧美日韩国产在线 | av片在线播放 | 国产真实伦对白全集 | 欧美亚洲第一页 | xxx在线视频 | 蕾丝视频污 | 黄在线网站 | jizz高潮| 亚洲色偷精品一区二区三区 | av美女网站 | 成人资源在线 | 日韩一区二区不卡视频 | 亚洲一线在线观看 | 亚洲欧美在线观看视频 |