娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

Windows CE6.0中斷實驗過程

發布者:JoyfulJourney最新更新時間:2024-11-07 來源: cnblogs關鍵字:Windows  中斷實驗  S3C6410 手機看文章 掃描二維碼
隨時隨地手機看文章

1.實驗目的:通過本次試驗學習Windows CE6.0的中斷處理的過程以及熟悉在驅動程序中運行中斷的編程。

2.我對Windows CE6.0中斷的理解:

Windows? CE將中斷處理分成兩個步驟:中斷服務程序ISR和中斷服務線程IST。如果中斷被使能,則當中斷產生時,內核將調用該中斷注冊的ISR,ISR執行完后將返回系統中斷號,內核檢查系統中斷號并且設置相關的事件,內核設置相關事件后,相應的IST將開始執行。

3.Windows? CE的處理流程:

(1)如果一個驅動程序要處理一個中斷,那么驅動程序首先要建立一個事件(CreateEvent),然后調用InterruptInitialize將該事件與中斷號綁定,這一步會使能該中斷,OAL中的OEMInerrupteEnable會被調用,如果該函數不返回true的話,InterruptInitialize就會失敗。然后驅動程序中的IST就可以使用WaitForSingleObject函數來等待中斷的發生。

(2)當一個硬件中斷發生之后,操作系統陷入異常,中斷向量指示進入CE的異常處理程序,該異常處理程序然后調用OAL的OEMInterruptHandler函數,該函數檢測硬件之后,將硬件中斷轉換為軟件的中斷號,返回給系統。該中斷號就是上面提到的InterruptInitialize中使用的那個中斷號。系統得到該中斷號之后,就會找到該中斷號對應的事件,并喚醒等待相應事件的線程(IST),然后IST就可以在用戶態進行中斷處理。處理完成之后,IST需要調用InterruptDone來告訴操作系統中斷處理結束,操作系統調用OAL中的OEMInterruptDone函數,最后完成中斷的處理。

4.在驅動中安裝中斷的方法:

首先, 在驅動中通過 CreateEvent()函數創建一個 Event 內核對象, 然后通過 InterruptInitialize()

函數負責把某個邏輯中斷號與這個 Event 內核對象關聯起來。當中斷發生時,操作系統負責引發此

Event 事件,函數的原型如下: 

InterruptInitialize(DWORD idInt,         // SYSINTR中斷號 

                    HANDLE hEvent ,     // 與該中斷相關聯的事件句柄 

                    LPVOID pvData,      // 傳給OEMInterruptEnable緩沖指針   

DWORD cbData,      // 緩沖區的大小 

                    )

然后通過 CreatThread()函數來來創建一個線程,在線程函數中用 WaitForSingleObject()來阻塞

當前的線程,等待某個 Event 內核對象標識的事件發生。當中斷發生后,OAL層就會返回邏輯中斷,

與邏輯中斷相關聯的 Event 事件就會被觸發,被阻塞的中斷線程函數就會就緒開始工作。 

InterruptDonce()函數用來告訴操作系統, 對該中斷的處理已完成, 操作系統可重新開啟該中斷。

5.步驟:

1.在vs2005里面新建一個DLL的子項目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)

[1] [2] [3]
關鍵字:Windows  中斷實驗  S3C6410 引用地址:Windows CE6.0中斷實驗過程

上一篇:基于gnu-arm-linux的LPC2220的簡單工程模板
下一篇:基于ARM7(LPC2131)平臺的μC/OS-Ⅱ的移植

推薦閱讀最新更新時間:2025-06-25 19:03

ARM基本接口之外部中斷實驗
實驗目的: 1. 了解中斷的作用; 2. 掌握嵌入式系統中斷的處理流程; 3. 掌握ARM外部中斷編程。 實驗內容(含步驟): 1. 總體步驟:先編譯,啟動目標機,待顯示2440后,進行創建鏈接,下載,運行,觀察是否顯示HELLOO,按下EXINT2按鈕看led燈是否變換顯示效果 2. 實驗過程:在實驗過程中,始終顯示硬件連接失敗,組員認為是目標機與電腦連接問題,拔了插過,但仍然不行,后來多次更換電腦連接,花費了大量時間,終于解決問題,然后在緊迫的時間內修改代碼,編譯,鏈接,下載,運行,終于成功顯示效果。理解原理后,通過在主程序中運行數碼管顯示代碼,使得宿主機能正確顯示HELLOO字樣,然后通過按下EXIN
[單片機]
單片機中斷實驗2
電路圖: 代碼如下: #include reg51.h #include intrins.h sbit p1_0 = P1^0; sbit p1_1 = P1^1; void delay (void) { int a = 500; while(a--) _nop_(); } void LED_01() interrupt 0 using 1 { delay(); if (INT0 == 0) { p1_0 = !p1_0; while (INT0 == 0); } } void LED_02() interrupt 2 using 1 { delay (); if (
[單片機]
S3C6410 SPI全雙工讀寫流程分析
S3C6410 SPI全雙工讀寫流程分析 一、SPI控制器datasheet 1詳細請參考:http://blog.csdn.net/hustyangju/article/details/20474659 2 SPI的所有寄存器都是映射到內核空間的,采用基地址+偏移地址的方式訪問 static volatile void __iomem *spiregs; //global variable for mapping spiregister spiregs = (volatile)ioremap(0x7F00B000,0x30); //just request for the spi0
[單片機]
<font color='red'>S3C6410</font> SPI全雙工讀寫流程分析
基于S3C6410的視頻監控系統的設計與實現
視頻監控的應用領域日益廣泛。隨著電子信息技術、多媒體技術以及網絡技術的快速發展,嵌入式視頻監控技術也得到了快速的發展。相比較傳統的監控系統,嵌入式監控系統具有成本低,小巧靈活,高可靠性等特點。本文以三星S3C6410微處理器為基礎處理器ARM11,實現了一種簡單高效的視頻監控系統。系統既可以使用網線進行傳輸,也可以采用無線USB網卡進行無線傳輸。本文在說明系統框架的同時,著重對系統實現的具體軟件進行了說明。 1 系統的組成和工作原理 嵌入式視頻監控系統由硬件部分和軟件部分組成。硬件部分由視頻采集模塊、視頻編碼模塊、網絡傳輸模塊以及嵌入式處理器模塊組成;軟件部分基于嵌入式操作系統平臺,包括視頻數據采集模塊、視頻編碼模塊和網絡傳
[單片機]
基于<font color='red'>S3C6410</font>的視頻監控系統的設計與實現
windows下用J-link J-Flash下載STM32程序
打開“Option”—》“Project settings…”,進行燒寫前的必要設置,如下圖: 在“General”頁,選擇“USB”,如下圖: 在“Target Interface”頁,選擇“JTAG”,JTAG速度設置為“Auto selection”,如下圖 在“CPU”頁,選擇 開發板 的CPU型號:ST STM32F103VB,如下圖: “FLASH”頁不用設置,默認設置就可以了。 在“Production”頁,我們把“Start application”選上,則在下載成功之后,程序會自動運行。 在設置完成后,我們點擊“應用”和“確定”退出。在JLINK軟件界面左邊,將顯示燒寫
[單片機]
<font color='red'>windows</font>下用J-link J-Flash下載STM32程序
全球首款OLED Windows輕薄掌機AYANEO AIR發布:3399元起
5月29日消息,日前,AYANEO掌機正式發布全球首款超輕薄OLED Windows 掌機——AYANEO AIR,搭載AMD銳龍5 5560U處理器,提供青春版、標準版兩款配置,售價分別為3399元、3999元起。   ID設計上,AYANEO AIR青春版重量僅為395g,厚度為17mm,標準版為410g,厚度為18mm,體積小于Steam Deck,甚至比Switch更輕更小。   核心性能方面,AYANEO AIR搭載AMD銳龍5 5560U處理器,采用7nm工藝制程,6核12線程,基礎頻率2.3GHz,最大睿頻可達4.0GHz。核顯為Vega 6,最高頻率1.6GHz,配置高速M.2 2280 SSD。   據介
[手機便攜]
TQ2440 學習筆記—— 1、Windows平臺下開發工具安裝與環境建立
1、開發工具的安裝與環境建立 系統:win7 64位 SecureCRT軟件:該軟件可以代替Windows中的超級終端,是個非常好的串口工具(其實它的功能很多,不過這里只是使用了它的串口功能) 功能:SecureCRT是一款支持SSH(SSH1和SSH2)的終端仿真程序,簡單的說是Windows下登錄UNIX或Linux服務器主機的軟件。 可以通過登錄虛擬機里面的Linux操作系統,這樣我們就不需要頻繁的進入虛擬機里面進行操作;同時它也可以連通開發板的操作系統,也可以進行操作,通過相應的設置可以完成開發板、虛擬機、PC機三者的互通。 直接解壓即可使用。使用方法: 主要是要注意端口配置: DNW軟件:是
[單片機]
TQ2440 學習筆記—— 1、<font color='red'>Windows</font>平臺下開發工具安裝與環境建立
微軟高通合作:給ARM Windows 10設備提供更完善配套
微軟今天宣布與高通公司建立合作伙伴關系,為保障 Windows on ARM 上應用的運行提供更完善的配套支持,微軟將把具有 FastTrack 測試平臺的 App Assure 進行擴展。 微軟的 App Assure with FastTrack 計劃可免費提供給合格的開發人員或客戶。App Assure 是一個旨在幫助客戶,開發人員和獨立軟件供應商解決應用程序兼容性問題的程序。 另外,也只有高通為 Windows 10 推出了專門的驍龍 8cx/7cx 處理器。高通高管表示:“移動計算的未來是配備 4G / 5G 連接的功能強大,輕薄的長續航 PC。我們很高興看到 App Assure 計劃將幫助確保在搭載驍龍的 W
[手機便攜]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 涿鹿县| 图们市| 凤山县| 辰溪县| 樟树市| 上高县| 山东| 毕节市| 佳木斯市| 临漳县| 丁青县| 新建县| 绥德县| 福安市| 息烽县| 绥中县| 德保县| 元氏县| 青冈县| 江北区| 滦平县| 嘉定区| 武夷山市| 南宁市| 任丘市| 青浦区| 修水县| 修武县| 三穗县| 新竹县| 宿州市| 兴山县| 鲁甸县| 北川| 宝坻区| 饶河县| 寻乌县| 全椒县| 霞浦县| 大丰市| 右玉县|