因為BSP和WinCE系統,已經做了大量的工作,完成了所有底層的處理。所以我們僅調用幾個api,就可以完成驅動程序對中斷的處理。
在WinCE中,中斷被轉換成為了一個事件。所以我們可以創建一個線程,該線程循環等待事件發生,一旦發生則去操作對應設備。這個線程被成為IST。整個過程如下:
在驅動的XXX_Init()中 1.創建一個事件 hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 2.獲得sysIntr,硬件有一個中斷號,如EINT0,等等,但該中斷號并不是WinCE系統能識別的中斷號,故要獲取WinCE的系統中斷號。 KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &sysIntr, sizeof(UINT32), NULL); 其中Irq為硬件中斷號,如EINT0等等。 當調用完KernelIoControl函數后,硬件中斷號對應的系統中斷號,則會保存在sysIntr中。 3.將事件與中斷號相連接 在連接前,先禁止該中斷,連接后調用一次InterruptDone則會啟動該中斷。 InterruptDisable(sysIntr); if(!InterruptInitialize(sysIntr, hEvent, NULL, 0) ) goto error; InterruptDone(sysIntr); 4.創建中斷服務線程(IST) hThread = CreateThread(NULL, 0, &IST, NULL, 0, NULL); 至此,就完成了有關設備中斷的初始化操作。接下來實現創建中斷服務線程即可 其樣式如下,省略了對設備操作的代碼。 DWORD IST(LPVOID param) { DWORD we; while(hThread) { we = WaitForSingleObject(DPRAM.hEvent, INFINITE); ...; InterruptDone(sysIntr); }
return ERROR_SUCCESS; }
|