阅读:2824回复:6
WinCe6.0下的中断
Microsoft? Windows? CE将中断处理分成两个步骤:中断服务程序ISR和中断服务线程IST。如果中断被使能,则当中断产生时,内核将调用该中断注册的ISR,ISR执行完后将返回系统中断号,内核检查系统中断号并且设置相关的事件,内核设置相关事件后,相应的IST将开始执行。
下图描述了内核中断处理程序、本地驱动程序的相互联系以及与硬件之间的联系。 |
|
沙发#
发布于:2008-03-27 08:59
Microsoft? Windows? CE的处理流程:
(1)如果一个驱动程序要处理一个中断,那么驱动程序首先要建立一个事件(CreateEvent),然后调用InterruptInitialize将该事件与中断号绑定,这一步会使能该中断,OAL中的OEMInerrupteEnable会被调用,如果该函数不返回true的话,InterruptInitialize就会失败。然后驱动程序中的IST就可以使用WaitForSingleObject函数来等待中断的发生。 (2)当一个硬件中断发生之后,操作系统陷入异常,中断向量指示进入CE的异常处理程序,该异常处理程序然后调用OAL的OEMInterruptHandler函数,该函数检测硬件之后,将硬件中断转换为软件的中断号,返回给系统。该中断号就是上面提到的InterruptInitialize中使用的那个中断号。系统得到该中断号之后,就会找到该中断号对应的事件,并唤醒等待相应事件的线程(IST),然后IST就可以在用户态进行中断处理。处理完成之后,IST需要调用InterruptDone来告诉操作系统中断处理结束,操作系统调用OAL中的OEMInterruptDone函数,最后完成中断的处理。 在上面的描述中,驱动程序需要使用的是InterruptInitialize,WaitForSingleObject和InterruptDone等函数,而BSP开发者需要主要考虑的是OEMInerrupteEnable,OEMInterruptHandler,OEMInterruptDone等函数。 |
|
板凳#
发布于:2008-03-27 09:00
在Microsoft? Windows? CE下添加支持中断的驱动,主要是修改BSP包中相关的文件,具体描述如下。
1定义硬件中断 参考芯片手册关于中断处理模块的相关寄存器定义硬件中断,所在文件为安装目录下: \PLATFORM\COMMON\SRC\SOC\PXA27X_MS_V1\INC \Bulverde_intr.h,定义的硬件中断如下: #define IRQ_CAMQCKCAP 33 #define IRQ_WTM 32 #define IRQ_RTCALARM 31 #define IRQ_RTC_TIC 30 #define IRQ_OSMR3 29 #define IRQ_OSMR2 28 #define IRQ_OSMR1 27 #define IRQ_OSMR0 26 #define IRQ_DMAC 25 #define IRQ_SSP 24 #define IRQ_MMC 23 #define IRQ_FFUART 22 #define IRQ_BTUART 21 #define IRQ_STUART 20 #define IRQ_ICP 19 #define IRQ_I2C 18 #define IRQ_LCD 17 #define IRQ_SSP2 16 #define IRQ_USIM 15 #define IRQ_AC97 14 #define IRQ_I2S 13 #define IRQ_PMU 12 #define IRQ_USBFN 11 #define IRQ_GPIOXX_2 10 #define IRQ_GPIO1 9 #define IRQ_GPIO0 8 #define IRQ_OSMRXX_4 7 #define IRQ_PWRI2C 6 #define IRQ_MEMSTICK 5 #define IRQ_KEYPAD 4 #define IRQ_USBOHCI 3 #define IRQ_USBNONOHCI 2 #define IRQ_BASEBAND 1 #define IRQ_SSP3 0 2定义逻辑中断 所在文件:\PLATFORM\MAINSTONEIII\SRC\INC\Bsp_cfg.h #define SYSINTR_OHCI (SYSINTR_FIRMWARE+1) // 17 #define SYSINTR_TOUCH (SYSINTR_FIRMWARE+2) // 18 #define SYSINTR_TOUCH_CHANGED (SYSINTR_FIRMWARE+3) // 19 #define SYSINTR_KEYPAD (SYSINTR_FIRMWARE+4) // 20 #define SYSINTR_PCCARD_CSC_S0 (SYSINTR_FIRMWARE+5) // 21 #define SYSINTR_PCCARD_CD_S0 (SYSINTR_FIRMWARE+6) // 22 #define SYSINTR_PCCARD_CSC_S1 (SYSINTR_FIRMWARE+7) // 23 #define SYSINTR_PCCARD_CD_S1 (SYSINTR_FIRMWARE+8) // 24 #define SYSINTR_AUDIO (SYSINTR_FIRMWARE+9) // 25 #define SYSINTR_USBFN (SYSINTR_FIRMWARE+10) // 26 #define SYSINTR_SFUART (SYSINTR_FIRMWARE+11) // 27 #define SYSINTR_BFUART (SYSINTR_FIRMWARE+12) // 28 #define SYSINTR_FFUART (SYSINTR_FIRMWARE+13) // 29 #define SYSINTR_PWRBTN (SYSINTR_FIRMWARE+14) // 30 #define SYSINTR_RFID (SYSINTR_FIRMWARE+15) // 31 用户可以根据需要添加相应的逻辑中断。 3 OAL层的中断处理 所在文件:\PLATFORM\MAINSTONEIII\SRC\OAL\OALLIB\intr.c OAL层的中断处理包括如下所述的功能,用户可根据需要添加相关的处理。 (1)中断初始化 由函数BOOL BSPIntrInit(void) 完成,实现的功能有:为相关寄存器分配虚拟地址、相关中断的初始化、将逻辑中断与硬件中断相关联。 (2)中断使能 由函数 UINT32 BSPIntrEnableIrq(UINT32 irq) 完成,完成中断使能的功能,用户添加的中断需要在此添加中断使能的处理。 (3)中断禁止 由函数 UINT32 BSPIntrDisableIrq(UINT32 irq) 完成,完成中断禁止的功能,用户添加的中断需要在此添加中断禁止的处理。 (4)中断完成 由函数 UINT32 BSPIntrDoneIrq(UINT32 irq) 完成,该函数在中断处理完成后被调用,完成打开中断的功能,用户添加的中断需要在此添加相应的处理。 (5)中断激活 由函数UINT32 BSPIntrActiveIrq(UINT32 irq) 完成,该函数在中断产生后被调用,完成分配系统中断号的功能,用户添加的中断需要在此添加相应的处理。 |
|
地板#
发布于:2008-03-29 09:41
和5.0的有什么差别?
|
|
地下室#
发布于:2008-04-11 17:47
好像和5.0的相关函数名不一样
|
|
5楼#
发布于:2009-08-27 15:00
圖怎麼不見了~~~奇怪說~~~~
|
|
6楼#
发布于:2009-08-28 17:43
顶楼主一个,把自己知道的东西写出来,支持!!!
|
|