2011年9月5日 星期一

[筆記] Windows CE 硬體中斷處理

這裡只講 IST, 不是 ISR, 而實際上我覺的 IST 稍稍好用一點, 雖然它比較不即時.

構成硬體中斷通知總共須要四樣東西, 產生步驟大概是這樣:
1.硬體的中斷向量值, 這個要 chip design vendor 提供. 這裡稱 A.
2.CreateEvent 產生的 Event handle, 這裡稱 B.
3.KernelIoControl 用 IOCTL_HAL_REQUEST_SYSINTR, 這裡是傳入 A, 產生 C.
4.InterruptInitialize function 傳入 C 和 B, 到這裡才算是把中斷跟事件連接起來.
5.用 CreateThread 產生一個 IST (Interrupt Service Thread) (稱為D) 去等那個 C.

example. IRQ_GPIO2_PIN20 這個是 BSP 裡提供的一個定義值, 也就是 A.

static DWORD WINAPI ThreadHDS(LPVOID lpParam);

HANDLE hHND = CreateEvent(0, 0, 0, 0); //這個是B.
HANDLE hThread = 0; //要被產生的 D.
DWORD dwSysIntr = 0; //要被產生的 C.

if(hHND && hHND!=INVALID_HANDLE_VALUE)
{
DWORD dwIRQ = IRQ_GPIO2_PIN20;

if(KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(dwIRQ), &dwSysIntr, sizeof(DWORD), 0))
{ //這裡開始把中斷向量掛上去, 在 dwIRQ 裡傳回一個系統裡的對應代號.
if(InterruptInitialize(dwSysIntr, hHND, NULL, 0))
{ //當這個中斷進來後, 就去 SetEvent(hHND).
//開一個 thread (D) 下去等那個 event (
hThrea =
CreateThread( 0,
0,
(LPTHREAD_START_ROUTINE)ThreadHDS
hHND, //在這裡只傳入被產生的那個 handle.
0,
&dwThreadID
);
}
}
}

static DWORD WINAPI ThreadHDS(LPVOID lpParam)
{
HANDLE hHND = (HANDLE)hHND; //HANDLE 本身是 void* 所以可以這樣玩..

while(WaitForSingleObject(hHND, INFINITE) != WAIT_FAILED)
{ //以下是如果有等到事件觸發時才會有的動作.
Sleep(100);
//這邊就可以再塞 SendMessage 這類的東西把事件傳給 MFC 的 AP 使用.
}
return 0;
}

WaitForMultipleObject 我沒有實驗成功, 有人說 CE 底下這個 function 不 work, 等哪天試出來時再丟上來修改範例...

沒有留言: