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

Windows CE6.0中斷實(shí)驗(yàn)過(guò)程

發(fā)布者:JoyfulJourney最新更新時(shí)間:2024-11-07 來(lái)源: cnblogs關(guān)鍵字:Windows  中斷實(shí)驗(yàn)  S3C6410 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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)

[1] [2] [3]
關(guān)鍵字:Windows  中斷實(shí)驗(yàn)  S3C6410 引用地址:Windows CE6.0中斷實(shí)驗(yàn)過(guò)程

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

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

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

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 上饶市| 丹巴县| 明水县| 安庆市| 怀柔区| 岳阳县| 景东| 谷城县| 会东县| 广宗县| 盖州市| 淮安市| 常州市| 莲花县| 利川市| 西峡县| 长沙县| 鄢陵县| 阜平县| 阿城市| 修文县| 阆中市| 长顺县| 道孚县| 河南省| 汝阳县| 阜平县| 六盘水市| 郁南县| 益阳市| 安远县| 阿城市| 白朗县| 汉川市| 平山县| 广南县| 泗阳县| 灵寿县| 遂平县| 通渭县| 汝阳县|