青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

唐吉訶德

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(2)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

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

  •  中斷服務(wù)例程(ISR):處于內(nèi)核中的低級(jí)處理程序,中斷發(fā)生時(shí)首先被調(diào)用。
  • 中斷服務(wù)線程(IST):處于驅(qū)動(dòng)或者應(yīng)用中的中斷處理線程,由系統(tǒng)調(diào)度,完成大部分的中斷處理工作。

ISR的實(shí)現(xiàn)在OALOEM適配層)中,它只處理最低級(jí)的中斷響應(yīng),通常是獲取IRQSYSINTR并設(shè)置MCU內(nèi)部的中斷控制寄存器。中斷處理的主要部分在驅(qū)動(dòng)或者應(yīng)用的中斷處理線程中。中斷處理線程與其他普通線程一樣,使用同一個(gè)線程優(yōu)先級(jí)管理系統(tǒng)。ISRIST之間通過事件對(duì)象進(jìn)行同步。IST中創(chuàng)建一個(gè)事件對(duì)象,并使用函數(shù)WaitForSingleObject()等待該事件被觸發(fā)。ISR中通知內(nèi)核觸發(fā)相應(yīng)的事件對(duì)象。Windows Embedded CE 6.0的中斷處理的過程如下圖所示。

                      Windows Embedded CE 6.0的中斷處理過程

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

     下面結(jié)合C:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\DRIVERSPWRBUTTON驅(qū)動(dòng)進(jìn)行分析。該驅(qū)動(dòng)也是一個(gè)流驅(qū)動(dòng),所以可以用驅(qū)動(dòng)調(diào)試助手進(jìn)行動(dòng)態(tài)加載和卸載,但需要對(duì)代碼進(jìn)行相應(yīng)的修改,否則會(huì)出問題。

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


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

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

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

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

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

    }


    
//初始化相關(guān)的虛擬內(nèi)存地址
    InitializeAddresses();

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

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


    
return (dwContext);
}

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


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

    
//創(chuàng)建一個(gè)事件
    PwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    
//
    
// 根據(jù)IRQ獲取一個(gè)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);
    }

    
    
//關(guān)聯(lián)SYSINTR和之前創(chuàng)建的事件
    if (!(InterruptInitialize(PwrButtonSysIntr, PwrButtonIntrEvent, 00)))
    
{
        RETAILMSG(
1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
    }


    
//POWER Button按下的處理程序
    for (;;)
    
{
        WaitForSingleObject(PwrButtonIntrEvent, INFINITE);
        
        
if (PowerButtonIsPushed()) //確認(rèn)按鍵確實(shí)被按下,消除抖動(dòng)
        {
            Sleep(
200);         //延遲200ms,排除長(zhǎng)按的情況
            if (!PowerButtonIsPushed())    //按鍵被有效釋放
            {
                
//
                
//關(guān)閉系統(tǒng) 
                
//
                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();
                }

                
//
                
//結(jié)束當(dāng)前線程的時(shí)間片
                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);
    }

}

    以上代碼結(jié)構(gòu)清晰,不再贅述。但這樣編譯出來的驅(qū)動(dòng)是不能通過驅(qū)動(dòng)調(diào)試助手動(dòng)態(tài)加載的,必須進(jìn)行相應(yīng)的修改才行。主要原因是沒有善始善終,分配的系統(tǒng)邏輯中斷沒有釋放,系統(tǒng)邏輯中斷與事件的關(guān)聯(lián)也沒有取消。實(shí)驗(yàn)現(xiàn)象是,能通過驅(qū)動(dòng)調(diào)試助手加載卸載,但中斷并不能正常工作了。下面介紹一下解決這個(gè)問題的辦法。

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


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

    
//創(chuàng)建一個(gè)事件
    PwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    
//
    
// 根據(jù)IRQ獲取一個(gè)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);
    }

    
    
//關(guān)聯(lián)SYSINTR和之前創(chuàng)建的事件
    if (!(InterruptInitialize(PwrButtonSysIntr, PwrButtonIntrEvent, 00)))
    
{
        RETAILMSG(
1, (TEXT("ERROR: PwrButton: Interrupt initialize failed.\r\n")));
    }

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


        
if (PowerButtonIsPushed())     //確認(rèn)按鍵確實(shí)被按下,消除抖動(dòng)
        {
            Sleep(
200);         //延遲ms,排除長(zhǎng)按的情況
            if (!PowerButtonIsPushed())    //按鍵被有效釋放
            {
                
//
                
//關(guān)閉系統(tǒng)
                
//
                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();
                }

                
//
                
//結(jié)束當(dāng)前線程的時(shí)間片
                
//
                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之間的關(guān)聯(lián)
    KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&PwrButtonSysIntr, sizeof(UINT32),NULL,0, NULL);
    
    
//取消Event與PwrButtonSysIntr之間的關(guān)聯(lián)
    InterruptDisable(PwrButtonSysIntr);

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

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


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

    
return (TRUE);
}

  經(jīng)過以上修改,該中斷驅(qū)動(dòng)程序就可以通過驅(qū)動(dòng)調(diào)試助手動(dòng)態(tài)加載和卸載,并能正常工作了。另外,在模擬器中由于沒有外部中斷按鍵,可以通過創(chuàng)建一個(gè)特定名稱的事件與中斷關(guān)聯(lián),并在另外一個(gè)應(yīng)用或者驅(qū)動(dòng)中設(shè)置該事件以模擬一個(gè)外部中斷按鍵的觸發(fā),這種方法也可以在實(shí)際平臺(tái)中根據(jù)需要使用。示例代碼如下:


//打開與中斷關(guān)聯(lián)的事件
gIntrEvent = CreateEvent(NULL, FALSE, FALSE, _T("PBTINTR"));
//設(shè)置該事件,模擬一個(gè)中斷的觸發(fā)
SetEvent(gIntrEvent);
IST中創(chuàng)建與中斷關(guān)聯(lián)的事件代碼修改如下:
PwrButtonIntrEvent 
= CreateEvent(NULL, FALSE, FALSE, _T("PBTINTR"));

  總的來說,WinCE中斷處理過程結(jié)構(gòu)清晰,方便開發(fā)人員靈活設(shè)計(jì)IST。在使用驅(qū)動(dòng)調(diào)試助手調(diào)試有關(guān)中斷的驅(qū)動(dòng)程序時(shí),需要善始善終,否則會(huì)出現(xiàn)中斷不能正常工作的情況。

posted on 2011-03-01 10:55 心羽 閱讀(775) 評(píng)論(0)  編輯 收藏 引用 所屬分類: wince
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区高清| 久久久精品午夜少妇| 一区二区三区高清视频在线观看| 在线观看日韩精品| 亚洲福利久久| 亚洲精品久久久久久久久久久久| 久久影视三级福利片| 欧美三日本三级少妇三2023| 欧美一级视频免费在线观看| 国产日韩在线看片| 一本大道久久a久久精品综合| 久久国产加勒比精品无码| 欧美大成色www永久网站婷| 久久久久久久一区二区三区| 亚洲国产精品嫩草影院| 最新中文字幕亚洲| 欧美视频亚洲视频| 久久久人成影片一区二区三区| 久久精品人人做人人爽| 亚洲精品乱码视频| 亚洲欧美高清| 亚洲国产成人一区| 亚洲高清二区| 欧美电影美腿模特1979在线看| av成人手机在线| 亚洲欧美日韩综合国产aⅴ| 国内久久婷婷综合| 亚洲精选视频免费看| 国产乱码精品一区二区三区忘忧草| 久久综合伊人| 欧美日韩调教| 麻豆成人在线播放| 国产精品s色| 亚洲第一中文字幕在线观看| 国产精品女人毛片| 欧美本精品男人aⅴ天堂| 欧美系列一区| 欧美激情91| 国产精品中文字幕欧美| 亚洲成在人线av| 国产日韩欧美在线看| 99re在线精品| 亚洲高清资源综合久久精品| 亚洲一区在线视频| 亚洲欧美在线高清| 一本色道久久综合亚洲精品不卡| 久久精品国产免费| 午夜日韩福利| 欧美天天影院| 最新日韩av| 亚洲国产精品久久久久| 欧美亚洲三级| 欧美亚洲日本一区| 欧美三级乱人伦电影| 亚洲国产天堂久久综合| 激情一区二区| 欧美在线影院| 久久久久久久久伊人| 国产精品羞羞答答xxdd| 国产精品99久久99久久久二8| 亚洲乱码国产乱码精品精可以看| 久久久久.com| 老色鬼精品视频在线观看播放| 国产精品制服诱惑| 亚洲欧美激情四射在线日 | 亚洲第一区在线观看| 欧美一站二站| 久久福利毛片| 国产亚洲精品7777| 久久久激情视频| 久久免费国产精品| 日韩一级在线观看| 亚洲在线播放| 国产欧美日韩精品丝袜高跟鞋 | 久久婷婷综合激情| 黑人一区二区| 猫咪成人在线观看| 亚洲激情一区二区| 亚洲无毛电影| 国产精品视频网址| 亚洲欧美中文另类| 免费不卡在线视频| 亚洲精品麻豆| 国产精品久久久久av免费| 亚洲午夜激情网页| 午夜精品视频一区| 国产一区二区三区最好精华液| 欧美专区一区二区三区| 免费成人高清视频| 99精品国产一区二区青青牛奶| 欧美劲爆第一页| 亚洲日本激情| 午夜在线a亚洲v天堂网2018| 国内一区二区三区| 久久在线视频| 在线午夜精品自拍| 久久精品女人的天堂av| 亚洲国产视频一区二区| 欧美日韩一区二区三区高清| 亚洲影视中文字幕| 欧美黑人国产人伦爽爽爽| 亚洲视频观看| 国产一区二区三区丝袜| 免费视频亚洲| 性久久久久久久久久久久| 欧美成人一区在线| 欧美.com| 欧美亚洲网站| 亚洲精品九九| 欧美一区在线视频| 亚洲人成久久| 韩国一区二区在线观看| 欧美日韩精品久久久| 久久久一二三| 午夜精品福利一区二区三区av| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲视频福利| 91久久精品国产91久久性色tv| 国产精品资源| 欧美视频一区二区三区| 久久久之久亚州精品露出| 亚洲图片自拍偷拍| 亚洲经典三级| 欧美成年人网站| 久久久久久久久久看片| 亚洲欧美日韩国产综合| 亚洲最新在线视频| 亚洲激情欧美激情| 国产午夜精品视频| 欧美视频在线观看一区| 欧美激情按摩在线| 欧美1区2区视频| 久久久综合网站| 亚洲欧美亚洲| 亚洲午夜激情网站| 一区二区三区欧美| 狠狠入ady亚洲精品| 国产精品区一区| 蜜臀久久久99精品久久久久久| 欧美在线视频网站| 欧美在线观看一区二区| 欧美一区二区三区免费观看视频 | 久久麻豆一区二区| 欧美在线播放高清精品| 亚洲伦理在线观看| 亚洲老司机av| 中文日韩欧美| 亚洲欧美日韩国产综合精品二区| 一本大道久久a久久精二百| 亚洲三级国产| 一区二区欧美日韩视频| av成人激情| 亚洲欧美中文字幕| 欧美一级片一区| 久久久欧美一区二区| 蜜桃久久精品一区二区| 母乳一区在线观看| 亚洲国产婷婷| 一区二区三区视频观看| 亚洲香蕉网站| 亚洲欧美自拍偷拍| 久久频这里精品99香蕉| 免费观看久久久4p| 欧美日韩亚洲一区二| 国产精品欧美久久| 一区二区三区亚洲| 亚洲毛片av在线| 亚洲欧美制服另类日韩| 久久精品视频导航| 欧美国产日本在线| 亚洲视频电影在线| 欧美在线视频日韩| 欧美黑人一区二区三区| 国产精品免费区二区三区观看| 国产亚洲欧美aaaa| 亚洲国产精品嫩草影院| 亚洲视频一区在线| 久久久综合精品| 亚洲精品日日夜夜| 性做久久久久久久久| 欧美成人r级一区二区三区| 欧美性大战xxxxx久久久| 国产综合色在线| 一本色道久久综合亚洲91| 欧美专区第一页| 亚洲国产日韩欧美| 亚洲免费一在线| 欧美a级大片| 国产婷婷色综合av蜜臀av| 亚洲三级影院| 久久青草久久| 宅男66日本亚洲欧美视频| 久久天天狠狠| 国产毛片一区二区| 99精品国产在热久久| 老司机午夜免费精品视频 | 久久精品视频在线| 99国产精品视频免费观看一公开| 久久久久久久久综合| 国产精品欧美日韩|