天天看點

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

歡迎加入Wince技術讨論群QQ#326444254

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

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

ISR的實作在OAL(OEM适配層)中,它隻處理最低級的中斷響應,通常是擷取IRQ和SYSINTR并設定MCU内部的中斷控制寄存器。中斷處理的主要部分在驅動或者應用的中斷處理線程中。中斷處理線程與其他普通線程一樣,使用同一個線程優先級管理系統。ISR和IST之間通過事件對象進行同步。IST中建立一個事件對象,并使用函數WaitForSingleObject()等待該事件被觸發。ISR中通知核心觸發相應的事件對象。Windows Embedded CE 6.0的中斷處理的過程如下圖所示。

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

                         Windows Embedded CE 6.0 的中斷處理過程

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

     下面結合DEVICEEMULATOR的PWRBUTTON驅動進行分析。該驅動也是一個流驅動,是以可以用驅動調試助手進行動态加載和解除安裝,但需要對代碼進行相應的修改,否則會出問題。

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

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254
WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

Code

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

      RESET Button的IST和POWER Button的IST基本一緻,是以這裡隻分析POWER Button的IST,代碼如下。       

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254
WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

Code

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

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

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

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254
WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

Code

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

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

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254
WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

Code

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

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

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254
WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

Code

WinCE 6.0中斷驅動程式分析 歡迎加入Wince技術讨論群QQ#326444254

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

繼續閱讀