娇小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-04-15 17:16

AT89C51外部中斷實驗實現8盞燈的同時亮滅(用外部開關控制)
本實驗運用keil uvision4軟件以及isis7 Professional仿真軟件完成的。需事先安裝好這兩個軟件,下面開始我們的實驗: 我們先用isis7 繪制出如圖所示的電路圖: 由于我對中間單片機芯片有些許移動,因此,線有點亂,望理解!(此處運用INT0) 接下來,我們開始在keil軟件中編程輸入以下代碼: #include reg51.h sbit K=P3^3; /*void delays() { unsigned i,j,k; for(i=20;i 0;i--) for(j=20;j 0;j--) for(k=248;k 0;k--); } */ void main(void) {
[單片機]
AT89C51外部<font color='red'>中斷實驗</font>實現8盞燈的同時亮滅(用外部開關控制)
STM32F107的通用定時器中斷實驗總結
1. STM32F107的通用定時器是指: TIM2、TIM3、TIM4、TIM5、 STM32F107的高級定時器是指: TIM1、TIM8 STM32F107的基本定時器是指: TIM6、TIM7 2. STM32F107的通用定時器(TIM2、TIM3、TIM4、TIM5)的模式有向上計數、向下計數、中央對齊模式。 向上計數模式:計數器從0計數到自動加載值(TIMx_ARR),然后重新從0開始計數并且產生一個計數器溢出事件。 向下計數模式:計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然后從自動裝入的值重新開始,并產生一個計數器向下溢出事件。 中央對齊模式(向上/向下計數):計數器
[單片機]
S3C6410開發(3)-編譯運行第一個流水燈程序
編寫程序 由于我們是在純裸機上編程,沒有uboot之類的程序為我們初始化硬件資源,所以我們要編寫一個帶有初始化功能的匯編文件。同時為了直觀地感受到程序的運行,我們在里面添加一個流水燈的小程序。在工作目錄新建一個 statup.s 的文件,編寫初始化程序并根據電路板原理圖配置LED的GPIO的模式和輸出電平。 .global _start _start: // 把外設的基地址告訴CPU ldr r0, =0x70000000 // 對于6410來說內存(0x00000000~0x60000000) // 外設(0x70000000-0x7fffffff) orr r0, r0, #0
[單片機]
s3c6410 uart 裸機 輪詢 非fifo
/* uart 非中斷模式R,輪詢,不用fifo */ #include stdio.h #include uart.h #include gpio.h #include sysc.h #define UART0 ( ( volatile UART_REGS * ) (UART_BASE)) u32 Inp32(u32 xx) { return xx; } void GpioInit() { // 設置gpio ,使用uart0 u32 TEMP; TEMP = GPIO- rGPIOACON; TEMP &= ~(0XFF); TEMP |= 0X22; GPIO- rGPIOACON =
[單片機]
基于S3C6410的ARM11學習(一) 基礎知識
手上有一塊OK6410的板子,就想起來花點時間學習下經典的ARM系列ARM11。了解一下ARM11的開發流程,以及怎么跑系統。 ARM11和之前學習的STM32的開發是很不一樣的。STM32,都是把代碼燒到STM32芯片FLASH中,然后代碼從FLASH中執行,而且程序執行是不需要外部掛ram的,因為芯片的內部就集成了一定大小的ram。 而ARM11是不一樣的,內部沒有FLASH和ram,所以就需要外掛flash設備和ram設備,然后ARM11通過存儲控制器來操作這些設備。 從圖中就可以直觀的看出區別了。對于S3C6410,因為內部沒有存儲器,所以需要將代碼燒錄到外掛的FLASH設備,這里FLASH設備可以有多
[單片機]
基于<font color='red'>S3C6410</font>的ARM11學習(一) 基礎知識
S3C6410添加開機logo(Wince6.0)(一)
Wince加入開機畫面方法一般有以下兩種: 1、 在文件中下定義一個常量大數組,如const unsigned char logo ,在顯示圖片的地方利用for循壞把數組都拷貝到framebuffer中。對于我的系統來說,800*600@16Bpp的分辨率,一張圖片就有將近1M的容量,已遠超過EBOOT的大小限制(據說是512K),雖然可以用過降低圖片質量來縮減容量,但這種對付的方法不像是我們工程師的作為嘛。pass! 2、 把圖片數據存放到Flash的某位置,啟動時使用特定的方法讀取。此方法可以說是主流的做法,但是涉及到的問題也很多。 1)要研究Wince中Flash扇區的分布和功能,修改扇區和其對應功能的映射。
[單片機]
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程序
蘋果發新版iCloud for Windows 增加鑰匙串密碼管理應用
蘋果公司今天發布了新版iCloud for Windows應用,12.5版更新為Windows用戶增加了新的?iCloud?鑰匙串密碼管理應用。 使用新的密碼管理選項,運行Windows的用戶可以訪問他們的?iCloud?鑰匙串密碼,并且可以添加、編輯、復制和粘貼、刪除和查找用戶名或密碼。今年1月,蘋果發布了Windows版?iCloud?的更新版,暗示將推出新的密碼應用,但蘋果直到現在才開始實施。 微軟Edge和Windows Chrome的新?iCloud?密碼擴展與密碼功能協同工作,允許?iCloud?密碼在Windows機器上自動填寫,就像在Safari中一樣。為網站創建的用戶名和密碼會自動添加到密碼應用中。
[手機便攜]
蘋果發新版iCloud for <font color='red'>Windows</font> 增加鑰匙串密碼管理應用
小廣播
設計資源 培訓 開發板 精華推薦

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 兴宁市| 二手房| 郧西县| 黄浦区| 卓尼县| 南安市| 若尔盖县| 秦皇岛市| 井冈山市| 江津市| 临泽县| 通辽市| 淮北市| 唐河县| 得荣县| 玉门市| 冀州市| 苏州市| 南昌县| 鲁山县| 江西省| 盱眙县| 深州市| 花莲县| 新源县| 屏东市| 思南县| 营山县| 邛崃市| 自治县| 镇雄县| 曲松县| 静海县| 怀安县| 高阳县| 灯塔市| 印江| 石狮市| 阿瓦提县| 青海省| 蒙自县|