作者:ARM-WinCE
关于WinCE的中断处理,OAL中主要是实现了ISR部分,一般IST会在设备驱动中实现。推荐一篇WinCE的中断架构的文章,如下:
http://msdn.microsoft.com/zh-cn/library/ms836807.aspx
建议对WinCE中断不了解的朋友,可以先看看这片文章。架构如图:

这张图想必很多人都见过,主要这张图太经典了,所以还是贴出来唠叨几句,硬件中断产生以后,会导致内核ISR的运行,然后由OAL中的ISR来处理相应的中断,最后导致相对应的IST运行完成真正的中断处理。所以在WinCE中,中断处理由ISR和IST共同完成。ISR主要完成中断源的确定,屏蔽该中断并返回给内核相对应的系统中断号,ISR应该尽量短小。IST则是完成真正的中断处理,比如数据的传输和解析等。当然不是所有的中断处理都需要ISR和IST,看需要,比如WinCE的系统Timer中断就只需要ISR完成。
在OAL中支持中断,需要实现以下几个中断处理函数:
1. BOOL OEMInterruptEnable(DWORD sysIntr, VOID* pData, DWORD dataSize)
sysIntr:要被使能的系统中断号
pData:传入的数据指针,该数据由InterruptInitialize函数传入
dataSize:传入数据的大小
该函数用于使能某一个硬件中断。在设备驱动调用InterruptInitialize来初始化一个中断的时候,内核就会调用该函数来使能相应的硬件中断。
2. VOID OEMInterruptDisable(DWORD sysIntr)
sysIntr:要被屏蔽的系统中断号
该函数用于屏蔽一个硬件中断。如果设备驱动调用InterruptDisable函数,则该函数会被调用。
3. VOID OEMInterruptDone(DWORD sysIntr)
sysIntr:要被重新使能的系统中断号
该函数标志着一个中断处理过程的完成。当设备驱动调用InterruptDone函数的时候,该函数会被调用,重新使能相应的硬件中断。
4. ULONG OEMInterruptHandler(ULONG ra)
ra:指令计数,在实际应用中,没有太大意义
当硬件中断产生的时候,该函数就会被调用完成ISR部分的中断处理。一般会在该函数中读取系统的中断标记位,确定中断源并返回相应的系统中断号。
5. void OEMInterruptHandlerFIQ(void)
针对于ARM处理器,该函数用于处理快速中断。
上面5个函数完成了中断的相关处理。这里要提到两个概念:IRQ和SYSINTR。IRQ是指物理中断或者叫硬件中断,而SYSINTR指的是系统中断,也有的地方称为虚拟中断或者逻辑中断,我个人觉得还是叫系统中断比较好。每一个IRQ会和一个系统中断SYSINTR相对应,当硬件中断产生时,ISR实际上是处理IRQ中断,然后返回相应的系统中断SYSINTR给内核,内核会根据相应的SYSINTR触发相应的IST来完成中断处理。
IRQ和SYSINTR之间的对应关系称为映射,分为静态映射和动态映射。静态映射是指在系统编译时IRQ已经和SYSINTR相对应,一般通过OALIntrStaticTranslate函数来实现。而动态映射是指WinCE系统启动后,动态关联IRQ与SYSINTR,一般通过KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR…)来实现。
SYSINTR的类型在nkintr.h中定义,OEMInterruptHandler函数在处理完中断以后,会返回不同类型的SYSINTR给内核,内核会根据返回值进行下一步操作,分为以下几种类型:
SYSINTR_NOP:表示不需要进行任何处理
SYSINTR_RESCHED:表示要进行一次系统调度
SYSINTR_CHAIN:表示不是该中断源产生,在中断链中寻找下一个中断
SYSINTR_RTC_ALARM:表示RTC报警产生
SYSINTR_TIMING:用于ILTiming测试
SYSINTR_PROFILE:用于系统的profile
SYSINTR_FIRMWARE:用于用户自定义系统中断号,所有自定义的系统中断号都应该基于该值进行累加加1,这些自定义的系统中断号用于和IRQ一一对应。
在以前,如果要实现OAL中的中断部分,我们需要自己建立一个IRQ表和一个SYSINTR表,然后实现前面提到的5个函数,还要实现一个InterruptInitialize的函数,该函数用于初始化中断,会在OEMInit中被调用,就完事了。自从WinCE5.0以后,微软提出了PQOAL架构,中断的实现变得“曲折”了。要实现的函数如下:
1. BOOL OALIntrInit()
该函数为中断初始化函数,会在OEMInit中被调用,用于初始化系统的中断,以及完成一些中断的静态映射。
2. BOOL OALIntrRequestIrqs(DEVICE_LOCATION *pDevLoc, UINT32 *pCount, UINT32 *pIrqs)
pDevLoc:一个DEVICE_LOCATION结构指针,包含设备信息
pCount:作为输入表示最大的IRQ数,作为输出表示实际获得的IRQ数
pIrqs:指向一个实际获得的IRQ数组
该函数用于通过设备的物理地址来得到IRQ信息,一般用于总线设备。
3. BOOL OALIntrEnableIrqs(UINT32 count, const UINT32 *pIrqs)
count:要使能多少个IRQ
pIrqs:要被使能的IRQ数组
该函数用于使能IRQ中断,该函数会被OEMInterruptEnable函数调用。
4. VOID OALIntrDisableIrqs(UINT32 count, const UINT32 *pIrqs)
count:要禁用多少个IRQ
pIrqs:要被禁用的IRQ数组
该函数用于禁用IRQ中断,该函数会被OEMInterruptDisable函数调用。
5. VOID OALIntrDoneIrqs(UINT32 count, const UINT32 *pIrqs)
count:要重新使能多少个IRQ
pIrqs:要被重新使能的IRQ数组
该函数用于重新使能IRQ中断,会被OEMInterruptDone函数调用。
除了上述5个函数以外,还要实现的一个重要函数就是OEMInterruptHandler了,这个函数前面介绍过,这里不说了。实际上在WinCE5.0以后,在/Platform/Common/Src/Common/INTR/Base目录下有个“map.c”文件,该文件实现了中断的相关接口函数,实现了中断的动态/静态映射,还完成了SYSINTR与IRQ之间的转换,我们只需要实现对硬件中断的操作和初始化就可以了。
最后还有几个函数要说一下,如下:
BSPIntrInit:被OALIntrInit函数调用
BSPIntrEnableIrq:被OALIntrEnableIrqs函数调用
BSPIntrDisableIrq:被OALIntrDisableIrqs函数调用
BSPIntrDoneIrq:被OALIntrDoneIrqs函数调用
BSPIntrRequestIrqs:被OALIntrRequestIrqs函数调用
这些函数可以被称为板级中断处理函数,总感觉这些函数有点多余,一般实现了OALIntrInit,OALIntrEnableIrqs,OALIntrDisableIrqs,OALIntrDoneIrqs和OALIntrRequestIrqs就可以了,但这是基于处理器级的实现,对于基于同一处理器的不同的板子可能中断要做一些修改,这些修改就可以在BSPIntrInit,BSPIntrEnableIrq,BSPIntrDisableIrq,BSPIntrDoneIrq和BSPIntrRequestIrqs里面完成。
在这里,OAL中的中断处理函数基本都介绍了。我想最好的理解方法就是看代码了。一般在OAL中只是做一些开关中断和清中断标记位的操作,真正的数据处理交给IST去做。但有的时候,有些特殊设备的中断会很频繁,IST来不及响应,解决办法就是在ISR中将数据保存在一块内存中,然后根据需要,每隔多少个硬件中断返回一次系统中断,从而激活IST将数据一次性读走,这里涉及一个问题就是在ISR和IST中共享数据,在config.bib中预留一块共享内存就可以了。
分享到:
相关推荐
WinCE 6.0中的外部中断处理主要包括两个关键组件:中断服务例程(ISR)与中断服务线程(IST)。 - **中断服务例程(ISR)**: 处于内核级别的低级处理程序,负责响应中断信号,通常实现于OEM适配层(OAL)中。ISR的主要职责...
本文主要探讨WinCE中的中断处理流程,包括从硬件中断触发到中断服务例程(ISR)执行以及最终中断处理线程(IST)的唤醒全过程。 #### 二、中断处理流程 1. **中断发生**:当中断发生时,硬件向CPU发送中断信号,CPU会...
在Windows CE (Wince)操作系统中,针对基于ARM架构的硬件中断处理,有几个关键的函数和过程需要理解。本文将详细介绍这些概念,帮助你更好地掌握Wince如何处理ARM中断。 首先,我们来看`InterruptInitialize()`函数...
在Windows CE 5.0操作系统中,中断机制是设备驱动程序与硬件交互的关键部分,它允许设备在需要时及时通知CPU进行处理。中断机制分为物理中断和逻辑中断两个层面。 1. **物理中断**: 物理中断(IRQs)是硬件设备...
当中断发生时,BSP开发者需要关注`OEMInterrupteEnable`、`OEMInterruptHandler`和`OEMInterruptDone`这三个OAL函数,它们分别用于使能中断、处理硬件中断并完成中断处理。 中断处理是驱动程序开发的核心部分,理解...
本文旨在从板级系统移植的角度出发,详细介绍Windows CE移植过程中的关键部分——原始设备制造商适配层(OAL),并探讨其结构及开发方法。 #### OAL简介 OAL(Original Equipment Manufacturer Adaptation Layer,...
中断处理涉及多个层次的交互,从硬件中断到操作系统内核,再到OEM适配层(OAL),最后是中断服务线程(IST)。本文深入探讨了这些层面,帮助OEM和应用程序开发者理解如何有效地处理中断。 首先,中断过程始于硬件...
在中断处理过程中,OAL层负责识别具体的硬件中断(IRQ),并将它们映射到系统中断(SYSINTR)。开发者通常在这个层面上编写代码,以支持特定的硬件特性。 4. **IST处理层**:中断服务线程(IST)是专门用于处理中断...
2. **中断服务模块**:OAL提供了中断处理机制,将硬件中断映射到Windows CE的中断处理框架中。中断服务程序处理硬件中断,然后调用相应的中断处理函数,确保系统对硬件事件的快速响应。 3. **内存管理模块**:由于...
NK.EXE中的中断处理机制能够快速有效地处理来自不同设备的中断请求,确保系统的稳定运行。中断处理还包括了对硬件中断的优先级管理,以保证高优先级的中断能够被及时响应。 综上所述,Windows CE 5.0的体系架构非常...
USB驱动程序的开发是Windows CE设备驱动开发中的常见任务,它涉及到与硬件的交互、注册类驱动、处理中断请求等。USB鼠标和U盘驱动的添加,不仅展示了如何为特定硬件设备编写驱动,还涉及到USB协议的理解和驱动模型的...
- **WinCE的OAL**: OAL (Operating System Abstraction Layer) 是WinCE中用于抽象硬件接口的部分,确保了操作系统能够跨不同的硬件平台运行。 - **Eboot与OAL的作用**: Eboot负责硬件初始化,而OAL则提供了硬件抽象...
WINCE 操作系统提供了多种中断处理机制,包括中断服务例程 ISR、实时时钟 RTC 等。 WINCE 5.0 和 6.0 的差异 WINCE 5.0 和 6.0 之间的主要差异在于操作系统层的实现。WINCE 6.0 相比 WINCE 5.0 增加了更多的功能和...
内核开始执行,进行系统级初始化,包括设置中断处理、内存管理、进程调度等核心功能。这个阶段还会注册驱动程序,使系统能够识别和操作硬件。 5. **HAL(Hardware Abstraction Layer)**: HAL是OAL的上层,...
此外,内核加载过程中还需要对硬件设备进行进一步的初始化,如时钟设置、中断控制器配置等。任何这些环节出错都可能导致启动失败。 (3)OAL(OEM Adaption Layer)初始化失败 OAL 作为硬件与 WinCE 内核之间的...
- 第一阶段:初始化操作系统抽象层(OAL),包括硬件驱动、中断处理、内存管理等,直到FirstSchedule,这是调度器开始运行的标志。 - 第二阶段:系统开始执行应用程序,包括服务、驱动和其他系统组件的初始化。 ...
通过对WinCE6.0中EBOOT的概览及其关键知识点的分析,我们可以了解到,EBOOT作为WinCE6.0定制过程中的一个重要组成部分,不仅在开发效率方面发挥了重要作用,而且在实现特定硬件平台的支持方面也具有不可替代的地位。...
3. **OAL(OEM Adaption Layer)初始化**:OAL位于WinCE内核与硬件之间,起到屏蔽硬件设备细节和抽象硬件功能的作用。这一阶段主要通过一组函数来实现OAL的功能。 除了这三个基础步骤外,完整的WinCE系统启动还需要...
OAL负责WinCE系统的运行硬件平台初始化、中断服务例程、计时器、实时时钟、内核调试等功能。 3. **设备驱动程序**:这部分包括支持板卡外围设备和运行时相关附加设备正常运行所需的驱动程序。 4. **运行时镜像的...