fanghw
驱动牛犊
驱动牛犊
  • 注册日期2008-03-18
  • 最后登录2008-06-25
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
阅读:2822回复:6

WinCe6.0下的中断

楼主#
更多 发布于:2008-03-27 08:58
Microsoft? Windows? CE将中断处理分成两个步骤:中断服务程序ISR和中断服务线程IST。如果中断被使能,则当中断产生时,内核将调用该中断注册的ISR,ISR执行完后将返回系统中断号,内核检查系统中断号并且设置相关的事件,内核设置相关事件后,相应的IST将开始执行。
下图描述了内核中断处理程序、本地驱动程序的相互联系以及与硬件之间的联系。
fanghw
驱动牛犊
驱动牛犊
  • 注册日期2008-03-18
  • 最后登录2008-06-25
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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等函数。
fanghw
驱动牛犊
驱动牛犊
  • 注册日期2008-03-18
  • 最后登录2008-06-25
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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) 完成,该函数在中断产生后被调用,完成分配系统中断号的功能,用户添加的中断需要在此添加相应的处理。
xyj8303
驱动小牛
驱动小牛
  • 注册日期2007-05-28
  • 最后登录2009-04-01
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望137点
  • 贡献值0点
  • 好评度103点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-03-29 09:41
和5.0的有什么差别?
dding832
驱动牛犊
驱动牛犊
  • 注册日期2007-11-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望158点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-11 17:47
好像和5.0的相关函数名不一样
poineer
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2009-08-27
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-08-27 15:00
圖怎麼不見了~~~奇怪說~~~~
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-08-28 17:43
顶楼主一个,把自己知道的东西写出来,支持!!!
游客

返回顶部