1.實(shí)驗(yàn)?zāi)康模和ㄟ^(guò)本次試驗(yàn)學(xué)習(xí)Windows CE6.0的中斷處理的過(guò)程以及熟悉在驅(qū)動(dòng)程序中運(yùn)行中斷的編程。
2.我對(duì)Windows CE6.0中斷的理解:
Windows? CE將中斷處理分成兩個(gè)步驟:中斷服務(wù)程序ISR和中斷服務(wù)線程IST。如果中斷被使能,則當(dāng)中斷產(chǎn)生時(shí),內(nèi)核將調(diào)用該中斷注冊(cè)的ISR,ISR執(zhí)行完后將返回系統(tǒng)中斷號(hào),內(nèi)核檢查系統(tǒng)中斷號(hào)并且設(shè)置相關(guān)的事件,內(nèi)核設(shè)置相關(guān)事件后,相應(yīng)的IST將開(kāi)始執(zhí)行。
3.Windows? CE的處理流程:
(1)如果一個(gè)驅(qū)動(dòng)程序要處理一個(gè)中斷,那么驅(qū)動(dòng)程序首先要建立一個(gè)事件(CreateEvent),然后調(diào)用InterruptInitialize將該事件與中斷號(hào)綁定,這一步會(huì)使能該中斷,OAL中的OEMInerrupteEnable會(huì)被調(diào)用,如果該函數(shù)不返回true的話,InterruptInitialize就會(huì)失敗。然后驅(qū)動(dòng)程序中的IST就可以使用WaitForSingleObject函數(shù)來(lái)等待中斷的發(fā)生。
(2)當(dāng)一個(gè)硬件中斷發(fā)生之后,操作系統(tǒng)陷入異常,中斷向量指示進(jìn)入CE的異常處理程序,該異常處理程序然后調(diào)用OAL的OEMInterruptHandler函數(shù),該函數(shù)檢測(cè)硬件之后,將硬件中斷轉(zhuǎn)換為軟件的中斷號(hào),返回給系統(tǒng)。該中斷號(hào)就是上面提到的InterruptInitialize中使用的那個(gè)中斷號(hào)。系統(tǒng)得到該中斷號(hào)之后,就會(huì)找到該中斷號(hào)對(duì)應(yīng)的事件,并喚醒等待相應(yīng)事件的線程(IST),然后IST就可以在用戶態(tài)進(jìn)行中斷處理。處理完成之后,IST需要調(diào)用InterruptDone來(lái)告訴操作系統(tǒng)中斷處理結(jié)束,操作系統(tǒng)調(diào)用OAL中的OEMInterruptDone函數(shù),最后完成中斷的處理。
4.在驅(qū)動(dòng)中安裝中斷的方法:
首先, 在驅(qū)動(dòng)中通過(guò) CreateEvent()函數(shù)創(chuàng)建一個(gè) Event 內(nèi)核對(duì)象, 然后通過(guò) InterruptInitialize()
函數(shù)負(fù)責(zé)把某個(gè)邏輯中斷號(hào)與這個(gè) Event 內(nèi)核對(duì)象關(guān)聯(lián)起來(lái)。當(dāng)中斷發(fā)生時(shí),操作系統(tǒng)負(fù)責(zé)引發(fā)此
Event 事件,函數(shù)的原型如下:
InterruptInitialize(DWORD idInt, // SYSINTR中斷號(hào)
HANDLE hEvent , // 與該中斷相關(guān)聯(lián)的事件句柄
LPVOID pvData, // 傳給OEMInterruptEnable緩沖指針
DWORD cbData, // 緩沖區(qū)的大小
)
然后通過(guò) CreatThread()函數(shù)來(lái)來(lái)創(chuàng)建一個(gè)線程,在線程函數(shù)中用 WaitForSingleObject()來(lái)阻塞
當(dāng)前的線程,等待某個(gè) Event 內(nèi)核對(duì)象標(biāo)識(shí)的事件發(fā)生。當(dāng)中斷發(fā)生后,OAL層就會(huì)返回邏輯中斷,
與邏輯中斷相關(guān)聯(lián)的 Event 事件就會(huì)被觸發(fā),被阻塞的中斷線程函數(shù)就會(huì)就緒開(kāi)始工作。
InterruptDonce()函數(shù)用來(lái)告訴操作系統(tǒng), 對(duì)該中斷的處理已完成, 操作系統(tǒng)可重新開(kāi)啟該中斷。
5.步驟:
1.在vs2005里面新建一個(gè)DLL的子項(xiàng)目MyKey,在F:/WINCE600/PLATFORM/SMDK6410/SRC/DRIVERS/目錄下
2.添加MyKey.c和MyKey.h文件,編輯源程序,如下:
MyKey.h:
#ifndef _MYKEY_H
#define _MYKEY_H
#ifdef __cplusplus
Extern 'C' {
#endif
typedef struct {
volatile S3C6410_GPIO_REG *pGPIOregs;
BOOL FlagExitThrd;
} KEY_PUBLIC_CONTEXT, *PKEY_PUBLIC_CONTEXT;
#ifdef __cplusplus
}
#endif
#endif
MyKey.c:
#include #include #include #include #include #include #include #include #include 'MyKey.h' #define Led1Mask 0x01 #define Led2Mask 0x02 #define Led3Mask 0x04 #define Led4Mask 0x08 #define LedAllMask 0x0F #define Butt1Mask 0x01 #define Butt2Mask 0x02 #define Butt3Mask 0x04 #define Butt4Mask 0x08 #define Butt5Mask 0x10 #define Butt6Mask 0x20 static KEY_PUBLIC_CONTEXT *pPublicKey = NULL; static volatile UINT32 dwLedFlag = 1; UINT32 g_SysIntr1 = 0; UINT32 g_SysIntr2 = 0; HANDLE g_hEvent1 = NULL; HANDLE g_hThread1 = NULL; HANDLE g_hEvent2 = NULL; HANDLE g_hThread2 = NULL; /****************************************************************************** * * MyKey button event thread * *******************************************************************************/ INT WINAPI Button1Thread(void) { RETAILMSG(1, (TEXT('Button1 Thread Entered ! /r/n'))); while(!pPublicKey->FlagExitThrd) { UINT16 ch; RETAILMSG(1, (TEXT('Button1 KEY_Read: KEY Device Read Successfully./r/n'))); ch = (UINT16)pPublicKey->pGPIOregs->GPNDAT; RETAILMSG(1,(TEXT('Button1 ReadValue: 0x%x /n'), ch)); RETAILMSG(1, (TEXT('Button1 Thread ! /r/n'))); WaitForSingleObject(g_hEvent1, INFINITE); if(pPublicKey->FlagExitThrd) break; RETAILMSG(1, (TEXT('Button1 Thread Start Running ! /r/n'))); if( dwLedFlag == 1 ) { dwLedFlag = 0; pPublicKey->pGPIOregs->GPMDAT |= LedAllMask; RETAILMSG(1, (TEXT('Button1 pressed---Led ALL On:/r/n'))); } else { dwLedFlag = 1; pPublicKey->pGPIOregs->GPMDAT &= ~LedAllMask; RETAILMSG(1, (TEXT('Button1 pressed---Led ALL Off:/r/n'))); } InterruptDone(g_SysIntr1); } RETAILMSG(1, (TEXT('KEY: KEY Button1Thread Exiting/r/n'))); return 0; } // Key_Button1Thread() INT WINAPI Button2Thread(void) { DWORD LedNum = 1; RETAILMSG(1, (TEXT('Button2 Thread Entered ! /r/n'))); while(!pPublicKey->FlagExitThrd) { UINT16 ch; RETAILMSG(1, (TEXT('Button2 KEY_Read: KEY Device Read Successfully./r/n'))); ch = (UINT16)pPublicKey->pGPIOregs->GPNDAT; RETAILMSG(1,(TEXT('Button2 ReadValue: 0x%x /n'), ch)); RETAILMSG(1, (TEXT('Button2 Thread ! /r/n'))); WaitForSingleObject(g_hEvent2, INFINITE); if(pPublicKey->FlagExitThrd) break; RETAILMSG(1, (TEXT('Button2 Thread Start Running ! /r/n'))); if( LedNum == 1 ) { LedNum = 2; pPublicKey->pGPIOregs->GPMDAT |= Led1Mask; RETAILMSG(1, (TEXT('Button2 pressed---Led 1 on:/r/n'))); } else if ( LedNum == 2 ) { LedNum = 3; pPublicKey->pGPIOregs->GPMDAT |= Led2Mask;; RETAILMSG(1, (TEXT('Button2 pressed---Led 2 On:/r/n'))); } else if ( LedNum == 3 ) { LedNum = 4; pPublicKey->pGPIOregs->GPMDAT |= Led3Mask;; RETAILMSG(1, (TEXT('Button2 pressed---Led 3 On:/r/n'))); } else if ( LedNum == 4 ) { LedNum = 0; pPublicKey->pGPIOregs->GPMDAT |= Led4Mask;; RETAILMSG(1, (TEXT('Button2 pressed---Led 4 On:/r/n'))); } else { LedNum = 1; pPublicKey->pGPIOregs->GPMDAT &= ~LedAllMask;; RETAILMSG(1, (TEXT('Button2 pressed---Led ALL off:/r/n'))); } InterruptDone(g_SysIntr2); } RETAILMSG(1, (TEXT('KEY: KEY Button2Thread Exiting/r/n'))); return 0; } // Key_Button2Thread() BOOL KEY_Deinit(DWORD dwContext) { RETAILMSG(1, (TEXT('KEY_DeInit: dwContext = 0x%x/r/n/n'), dwContext)); // inform IST exit status pPublicKey->FlagExitThrd = TRUE; // free virtual memory if(pPublicKey->pGPIOregs ) { DrvLib_UnmapIoSpace((PVOID)pPublicKey->pGPIOregs); pPublicKey->pGPIOregs = NULL; } if(g_hEvent1) { SetEvent(g_hEvent1); InterruptDisable(g_SysIntr1); CloseHandle(g_hEvent1); } if(g_hEvent2) { SetEvent(g_hEvent2); InterruptDisable(g_SysIntr2); CloseHandle(g_hEvent2); } // Wait for threads to finish WaitForSingleObject(g_hThread1, INFINITE); if(g_hThread1) CloseHandle(g_hThread1); WaitForSingleObject(g_hThread2, INFINITE); if(g_hThread2) CloseHandle(g_hThread2); LocalFree(pPublicKey); return (TRUE); } PKEY_PUBLIC_CONTEXT KEY_Init(DWORD dwContext) { LPTSTR ActivePath = (LPTSTR) dwContext; // HKLM/Drivers/Active/xx BOOL bResult = TRUE; DWORD dwHwIntr = 0; RETAILMSG(1, (TEXT('KEY_Init:dwContext = 0x%x/r/n'), dwContext)); RETAILMSG(1,(TEXT('[KEY] Active Path : %s/n'), ActivePath)); if ( !(pPublicKey = (PKEY_PUBLIC_CONTEXT)LocalAlloc( LPTR, sizeof(KEY_PUBLIC_CONTEXT) )) ) { RETAILMSG(1,(TEXT('[KEY] Can't not allocate for KEY Context/n'))); return NULL; } // GPIO Virtual alloc pPublicKey->pGPIOregs = (volatile S3C6410_GPIO_REG *)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_GPIO, sizeof(S3C6410_GPIO_REG), FALSE); if (pPublicKey->pGPIOregs == NULL)
上一篇:基于gnu-arm-linux的LPC2220的簡(jiǎn)單工程模板
下一篇:基于ARM7(LPC2131)平臺(tái)的μC/OS-Ⅱ的移植
推薦閱讀最新更新時(shí)間:2025-06-25 19:03




- 熱門(mén)資源推薦
- 熱門(mén)放大器推薦
-
Zadig_通用USB驅(qū)動(dòng)程序安裝器
-
TI的Power_Stage_Designer_Tool_4.0工具(用于開(kāi)關(guān)電源拓?fù)湓O(shè)計(jì))
-
Windows API 開(kāi)發(fā)詳解 函數(shù)、接口、編程實(shí)例 完整帶書(shū)簽PDF
-
Applied Computational Physics (Joseph F. Boudreau, Eric S. Swanson) 應(yīng)用計(jì)算物理,900頁(yè)
-
半導(dǎo)體二極管及其應(yīng)用
-
三相電壓型逆變器MATLAB
-
工程電磁場(chǎng)
-
醫(yī)用電源設(shè)計(jì)要素
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- LTC3814-5、5V、14V 至 24V、100W DC/DC 轉(zhuǎn)換器
- 使用 Analog Devices 的 LTC1174HVCS8 的參考設(shè)計(jì)
- MIC94300YMT EV,MIC94300 評(píng)估板,采用紋波阻斷技術(shù)的 200mA 開(kāi)關(guān)
- LT6656AIDC-3.3、3.3V 低功率 ADC 電壓基準(zhǔn)的典型應(yīng)用
- RTL8822CS模塊硬件參考設(shè)計(jì)指南
- MIC94345-GYCS 1.8V 輸出電壓、500mA LDO 與紋波阻斷技術(shù)的典型應(yīng)用
- LT8630EFE 12V、0.6A 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- LT1172IS8、-10 至 -26/1.25A LCD 對(duì)比度電源的典型應(yīng)用
- 用于 LCD 背光的 6-LED 白光 LED 驅(qū)動(dòng)器
- ADP322 三路、200mA、低噪聲、高 PSRR 穩(wěn)壓器的典型應(yīng)用
- ?百度文心4.5來(lái)襲!英特爾Day0即支持端側(cè)部署
- 【廣瀨電機(jī)】關(guān)于中國(guó)發(fā)明專(zhuān)利侵權(quán)訴訟達(dá)成和解的公告
- 英飛凌BMS解決方案推動(dòng)電動(dòng)汽車(chē)創(chuàng)新
- 地平線的L3判斷與實(shí)踐路徑
- 汽車(chē)網(wǎng)絡(luò)升級(jí)攻略:CAN-CAN FD-車(chē)載以太網(wǎng)
- 激光錫焊在汽車(chē)電子中控導(dǎo)航主板的應(yīng)用
- 南芯科技為智能輔助駕駛系統(tǒng)提供全鏈路電源芯片支持
- 蔡司工業(yè)CT重塑汽車(chē)電子連接器無(wú)損檢測(cè)新標(biāo)桿
- 智能電動(dòng)汽車(chē)時(shí)代勝出的三大核心能力
- 新思科技與Arm合作加速軟件定義汽車(chē)系統(tǒng)設(shè)計(jì)
- 技術(shù)文章—隔離數(shù)字輸入小科普
- 多起自燃事故后,特斯拉表示電動(dòng)車(chē)起火率低于汽油車(chē)
- 麗清科技:繼續(xù)擴(kuò)大LED車(chē)燈模塊市場(chǎng)占有率
- Waymo聘用機(jī)器人公司Anki的技術(shù)團(tuán)隊(duì),壯大自動(dòng)駕駛陣容
- ADI和First Sensor合作開(kāi)發(fā)LIDAR產(chǎn)品,加速實(shí)現(xiàn)自動(dòng)駕駛
- 咸陽(yáng)卓英社背光模組項(xiàng)目正式試產(chǎn)
- 富士康斥資百億美元在美建設(shè)液晶工廠:6月8日動(dòng)工
- 小米8曝光:搭載驍龍845 最快下月上市
- Librem 5手機(jī)公布系統(tǒng)UI界面:基于Debian+GNOME打造
- 諾基亞X已獲工信部入網(wǎng)許可:異形全面屏+后置雙攝