英創(chuàng)公司新近推出的嵌入式主板EM9160是一款專門面向工業(yè)智能設(shè)備的高性價比ARM9+WinCE平臺,該工控主板不僅配置了常規(guī)的標準通訊接口,如以太、串口、USB,而且還配置了當前智能控制設(shè)備中常用的SPI、I2C以及脈寬調(diào)制輸出PWM,以及精簡ISA總線和外部中斷,以方便客戶做專用電路的擴展。本文主要介紹EM9160的外部中斷使用上的特色,以幫助客戶能快速完成自己的產(chǎn)品開發(fā)。
EM9160的精簡ISA擴展總線,包括了2路獨立的外部硬件中斷輸入ISA_IRQ1和ISA_IRQ2,平時輸入電平應(yīng)為低,當外部設(shè)備產(chǎn)生中斷時,ISA_IRQ1或ISA_IRQ2變高,其上升沿將觸發(fā)中斷,在系統(tǒng)對中斷進行響應(yīng)前,中斷請求信號需保持為高。當應(yīng)用程序?qū)ν庠O(shè)進行相應(yīng)的中斷響應(yīng)處理后,ISA_IRQ1或ISA_IRQ2應(yīng)返回常規(guī)的低電平狀態(tài)。
在WinCE下對于中斷的處理是一個相對比較復雜的過程,當一個硬件中斷發(fā)生時,首先是系統(tǒng)內(nèi)核對中斷進行診別,再啟動相應(yīng)中斷服務(wù)例程來處理這個中斷,在具體實現(xiàn)中斷處理的過程中,需要調(diào)用系統(tǒng)提供的中斷相關(guān)的函數(shù),就涉及到內(nèi)核函數(shù)的調(diào)用。而用戶在使用eVC等工具軟件進行應(yīng)用程序開發(fā)時,是不能直接調(diào)用這些內(nèi)核函數(shù)的。針對這一情況,為了方便客戶對于外部中斷的使用,英創(chuàng)公司設(shè)計完成了在內(nèi)核中直接加載外部中斷的驅(qū)動程序,一旦中斷事件發(fā)生,驅(qū)動程序的中斷線程將響應(yīng)硬件中斷同時產(chǎn)生一個事件,以通知上層的用戶模式線程。按照這種方式導出一個定制的用戶接口(共4個函數(shù)),用戶只需要在應(yīng)用軟件中直接調(diào)用這些定制的接口函數(shù)即可方便地實現(xiàn)對于中斷的應(yīng)用處理,下面就介紹這些相關(guān)的接口函數(shù)。
(1)HANDLE InstallExternIRQ( DWORD dwIRQNo );
功能描述:安裝啟動ISA總線外部中斷。
輸入參數(shù) dwIRQNo: 需要啟動安裝的外部中斷號,輸入值為1或2,分別對應(yīng)ISA總線上的IRQ1和IRQ2。
返回值 = NULL: 安裝ISA總線外部中斷失敗。 != NULL: 啟動ISA總線外部中斷返回的句柄。
(2)HANDLE GetExternIRQEvent( HANDLE hIRQ );
功能描述:獲取ISA總線外部中斷的中斷事件。
輸入?yún)?shù) hIRQ: 調(diào)用函數(shù)InstallExternIRQ( )所返回的外部中斷句柄。
返回值 = NULL: 操作失敗。 != NULL:ISA總線外部中斷的中斷事件。
(3)BOOL EnableExternIRQ( HANDLE hIRQ );
功能描述:使能ISA總線外部中斷,允許下一次的中斷。
輸入?yún)?shù) hIRQ:函數(shù)InstallExternIRQ( )所返回的外部中斷句柄。
返回值 = TRUE:操作成功。 = FASLE:操作失敗。
(4)BOOL UninstallExternIRQ( HANDLE hIRQ );
功能描述:卸載關(guān)閉ISA總線外部中斷。
輸入?yún)?shù) hIRQ:函數(shù)InstallExternIRQ( )所返回的外部中斷句柄。
返回值 = TRUE:操作成功。 = FASLE:操作失敗。
這四個函數(shù)定義在IRQ_API.h文件下,相應(yīng)的IRQ_API.LIB已經(jīng)直接打包在SDK中,用戶直接安裝嵌入式工控主板EM9160的SDK文件即可。
作為應(yīng)用程序來說,可以通過函數(shù)InstallExternIRQ( … )來啟動外部中斷,并通過GetExternIRQEvent( … )獲取中斷事件的句柄。應(yīng)用程序應(yīng)創(chuàng)建一個處理對應(yīng)的外部中斷處理線程,該線程等待中斷事件來觸發(fā),一般用WaitForSingleObject( )來等待事件被觸發(fā),當硬件中斷發(fā)生時,用戶處理線程就可以完成必要的I/O操作來采集數(shù)據(jù)或處理數(shù)據(jù)了,再調(diào)用函數(shù)EnableExternIRQ( )再次開啟硬件中斷。
典型的應(yīng)用程序中斷處理線程如下:
DWORD WINAPI CEM9160_IRQ::IRQThreadFunc(LPVOID lparam)
{
CEM9160_IRQ *lpIRQ = (CEM9160_IRQ*)lparam;
for( ; ; )
{
WaitForSingleObject( lpIRQ-》hIRQEvent, INFINITE ); // 等待硬件中斷事件
ExIRQHandler( ); // 硬件中斷事件處理,用戶可在此函數(shù)中添加中斷處理代碼
EnableExternIRQ( lpIRQ-》hIRQ ); // 再次開啟硬件中斷
}
}
需要注意的是,當具體的中斷處理函數(shù)ExIRQHandler( )執(zhí)行完畢時,硬件中斷請求輸入ISA_IRQ1或ISA_IRQ2的電平已回到低電平狀態(tài),并確保在系統(tǒng)再次使能外部中斷前一直保持為低,即函數(shù)EnableExternIRQ( lpIRQ-》hIRQ )完成前一直保持為低,以防止中斷嵌套。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35402
發(fā)布評論請先 登錄
相關(guān)推薦
評論