|
因為BSP和WinCE係統,已經做了大量的工作,完成了所有底層的處理。所以我們僅調用幾個api,就可以完成驅動程序對中斷的處理。
在WinCE中(zhong),中(zhong)斷(duan)被(bei)轉(zhuan)換(huan)成(cheng)為(wei)了(le)一(yi)個(ge)事(shi)件(jian)。所(suo)以(yi)我(wo)們(men)可(ke)以(yi)創(chuang)建(jian)一(yi)個(ge)線(xian)程(cheng),該(gai)線(xian)程(cheng)循(xun)環(huan)等(deng)待(dai)事(shi)件(jian)發(fa)生(sheng),一(yi)旦(dan)發(fa)生(sheng)則(ze)去(qu)操(cao)作(zuo)對(dui)應(ying)設(she)備(bei)。這(zhe)個(ge)線(xian)程(cheng)被(bei)成(cheng)為(wei)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; }
|