WinCE 6 0中斷驅動程式分析

2021-06-02 07:14:31 字數 3513 閱讀 3010

windows embedded ce 6.0的中斷處理過程主要分為兩部分:

isr的實現在oal(oem適配層)中,它只處理最低階的中斷響應,通常是獲取irq和sysintr並設定mcu內部的中斷控制暫存器。中斷處理的主要部分在驅動或者應用的中斷處理執行緒中。中斷處理執行緒與其他普通執行緒一樣,使用同乙個執行緒優先順序管理系統。isr和ist之間通過事件物件進行同步。ist中建立乙個事件物件,並使用函式waitforsingleobject()等待該事件被觸發。isr中通知核心觸發相應的事件物件。windows embedded ce 6.0的中斷處理的過程如下圖所示。

windows embedded ce 6.0的中斷處理過程

在其他的一些嵌入式作業系統中,在介紹中斷處理時經常會提到乙個中斷向量表的概念,如uc/os。當中斷發生時它會進入irq的處理程式,並根據irq的值跳轉到事先分配好的中斷向量表相應的中斷處理函式中。但在wince中實際上並不存在中斷向量表的概念,而只有乙個異常向量表,對應於mcu的幾種執行模式。wince的中斷處理對應於兩個異常irqhandler和fiqhandler,通常我們使用的是irqhandler。當外部中斷產生時,系統執行irqhandler(),irqhandler()中呼叫oeminterrupthandler()獲取irq對應的sysintr,然後根據sysintr呼叫函式oemnotifyintroccurs()觸發與sysintr關聯的事件,最後由ist完成主要的中斷處理工作。這種中斷處理機制在一定程度上影響了系統的實時性,但提高了ist的靈活性。有關wince系統實時性分析,將在另外一篇中描述。

下面結合deviceemulator的pwrbutton驅動進行分析。該驅動也是乙個流驅動,所以可以用驅動除錯助手進行動態載入和解除安裝,但需要對**進行相應的修改,否則會出問題。

首先看pbt_init()函式,**如下:

dword pbt_init(dword dwcontext)

}initializeaddresses();

// 建立power button的ist和reset button的ist

resetbuttonintrthreadhandle = createthread(0, 0, (lpthread_start_routine) resetbuttonintrthread, 0, 0, &idresetbuttonthread);

if (resetbuttonintrthreadhandle == 0)

powerbuttonintrthreadhandle = createthread(0, 0, (lpthread_start_routine) powerbuttonintrthread, 0, 0, &idpowerbuttonthread);

if (powerbuttonintrthreadhandle == 0)

return (dwcontext);

} //reset button的ist和power button的ist基本一致,所以這裡只分析power button的ist,**如下。

static dword powerbuttonintrthread(pvoid parg)

//關聯sysintr和之前建立的事件

if (!(interruptinitialize(pwrbuttonsysintr, pwrbuttonintrevent, 0, 0)))

//power button按下的處理程式

for (;;)

else

////結束當前執行緒的時間片

sleep(0);

}else

retailmsg(1,(text("pbt: button held too long (ignored)\r\n")));

}else

retailmsg(1,(text("pbt: feeble button press or noise triggered it (ignored)\r\n")));

interruptdone(pwrbuttonsysintr);}}

以上**結構清晰,不再贅述。但這樣編譯出來的驅動是不能通過驅動除錯助手動態載入的,必須進行相應的修改才行。主要原因是沒有善始善終,分配的系統邏輯中斷沒有釋放,系統邏輯中斷與事件的關聯也沒有取消。實驗現象是,能通過驅動除錯助手載入解除安裝,但中斷並不能正常工作了。下面介紹一下解決這個問題的辦法。

首先定義乙個全域性變數g_bthreadexit初始化為false。ist修改後的**如下:

code

static dword

powerbuttonintrthread(pvoid parg)

//關聯sysintr和之前建立的事件

if (!(interruptinitialize(pwrbuttonsysintr, pwrbuttonintrevent, 0, 0)))

// power button按下的處理程式

for (;;)

if (powerbuttonispushed()) //確認按鍵確實被按下,消除抖動

else

////結束當前執行緒的時間片

//sleep(0);

}else

retailmsg(1,(text("pbt: button held too long (ignored)\r\n")));

}else

retailmsg(1,(text("pbt: feeble button press or noise triggered it (ignored)\r\n")));

interruptdone(pwrbuttonsysintr);

}//取消irq與sysintr之間的關聯

kerneliocontrol(ioctl_hal_release_sysintr,&pwrbuttonsysintr, sizeof(uint32),null,0, null);

//取消event與pwrbuttonsysintr之間的關聯

interruptdisable(pwrbuttonsysintr);

closehandle(pwrbuttonintrevent);

retailmsg(1, (text("powerbuttonintrthread exit.\r\n")));

return 0;

}  pbt_deinit()修改後的**如下:

code

bool

pbt_deinit(dword dwcontext)

經過以上修改,該中斷驅動程式就可以通過驅動除錯助手動態載入和解除安裝,並能正常工作了。另外,在模擬器中由於沒有外部中斷按鍵,可以通過建立乙個特定名稱的事件與中斷關聯,並在另外乙個應用或者驅動中設定該事件以模擬乙個外部中斷按鍵的觸發,這種方法也可以在實際平台中根據需要使用。示例**如下:

總的來說,wince中斷處理過程結構清晰,方便開發人員靈活設計ist。在使用驅動除錯助手除錯有關中斷的驅動程式時,需要善始善終,否則會出現中斷不能正常工作的情況。

WinCE6 0 驅動中的中斷處理的問題

除錯新板的audio部分,聲音有出來,所以接著將headphone的檢測,自動mute掉speaker的功能加進去。將之前的其他處理中斷部分copy過來,燒寫進去後,插拔耳機,始終進不了中斷。查原理圖,發現板子已經將 io口改變,將原來使用此io口的部分注釋掉,新的處理過程才能生效。發現用memmg...

winCE6 0攝像頭驅動分析

分析閱讀的是s3c6410 wince6.0的攝像頭驅動,s5pv210雖然也是6.0,但結構大不相同,暫且不提。根據msdn,應用層呼叫攝像頭驅動初始化時序如下 1 呼叫cam init和cam open。2 dshow呼叫findfirstdevice得到裝置名,呼叫createfile開啟。3...

wince5 0中斷分析 精闢

原帖位址http topic.csdn.net u 20071008 11 d54df4a6 09ef 4d7f aadb 2f60ff3824fc.html 1 wince中第一次對中斷的處理是在oal的oeminit 中,該函式呼叫oalintrinit 完成對中斷的初始化.2 oalintri...