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