S3C2410 && WinCE6.0的中断处理分析

     S3C2410的内核是ARM920T,所以,这里先介绍一下ARM920T的异常。ARM920T中有一个当前程序状态寄存器(CPSR),其中BIT6和BIT7分别控制FIQ和IRQ的使能与否。大家经常说的开中断和关中断,就是指的设置这两个BIT。

       ARM体系的异常中断如下图所示:
                 
     可以看到,ARM920T中一共有7中异常模式,如果同一时刻有多个异常发生,系统则通过优先级顺序来决定处理其中的哪一个异常。他们之间的优先级顺序从高到低依次是:

1.       Reset复位

2.       Data Abort数据访问中止

3.       FIQ 快速中断请求

4.       IRQ 外部中断请求

5.       指令预取中止

6.       未定义的指令和软件中断

当系统发生异常时,PC指针将跳转到相应的异常中断处理程序处。异常中断和其处理程序之间的对应关系被称为异常向量表,就是通常所说的中断向量表。一般情况下,它存放在低地址(0x0),但在WinCE中,该表存放在高地址(0xffff0000)。

S3C2410的中断处理过程如下图所示:
          

可以看到,S3C2410中跟中断密切相关的寄存器主要有以下几个:

SUBSRCPND(二级源待决寄存器):硬件产生中断后,该寄存器的相应位被置1;

SUBMASK(二级屏蔽寄存器):若该寄存器的对应位为1,则屏蔽该中断,不再往前提交;

SRCPND(源待决寄存器):如果是二级中断源产生了中断,当SUBSRCPND和SUBMASK满足条件时,该寄存器的相应位被置1,或者由一级中断源直接引起该寄存器的对应位置1;

MASK(一级屏蔽寄存器):如果该寄存器的对应位为1,则屏蔽该中断,不再往前提交;

MODE(中断模式寄存器):决定中断是FIQ模式还是IRQ模式,系统中只能有一个FIQ中断。若当前中断为FIQ模式,则产生一个FIQ异常,CPU进入FIQ异常处理程序。

PRIORITY(优先级控制寄存器):控制各中断源的优先级。当有多个中断源同时发出请求时由优先级最高的中断源最终产生IRQ。

INTPND(中断待决寄存器):当SRCPND某一位被置1,且没有被屏蔽,则该寄存器的相应位也被置1,同时产生一个IRQ异常,CPU进入IRQ异常处理程序。

IRQ异常处理程序中,需要清除SRCPND、INTPND。清除SRCPND和INTPND的方法比较特殊,并不是往对应的位写0,相反,应该往对应的位写1。一般是将其值读取出来,再写进去,以完成清除SRCPND和INTPND的工作。

除了以上几个寄存器外,2410还有一个INTOFFSET寄存器,用来表明当前是哪一个中断请求处理。WinCE的OEMInterruptHandler()函数,就是根据其值来判断当前是哪一个中断发出请求。该寄存器在清除SRCPND和INTPND时,被自动复位。所以,代码中不必对其进行处理。

如果中断源是EINT4-23,则还需处理EXTINTn、EINTFLT、EINTMASK和EINTPEND等几个寄存器。另外,由于2410的中断引脚一般与IO复用,所以在使用特定的外部中断之前,需要设置相应的GPIO,使其工作在中断模式下。

WinCE6.0中的中断处理过程如下图所示:
               
     可以看到,整个处理过程分为四层,分别是硬件、内核、OAL和驱动。硬件产生一个IRQ,CPU进入中断服务程序,调用OAL中的OEMInterruptHandler()函数,根据IRQ返回一个SYSINTR,内核根据该SYSINTR,设置一个事件,驱动中捕获到该事件,执行相应的处理程序,完成处理后,调用InterruptDone(),通知CPU中断处理完成。

这里说明一下SYSINTR和IRQ的概念。IRQ一般被认为是物理中断号,由硬件决定。SYSINTR是逻辑中断号,一般跟IRQ一一对应。这种对应关系可以在OAL中静态建立,一般通过函数OALIntrStaticTranslate()实现,静态映射的IRQ一般是MCU内部的中断源,如USB Host。为了提高驱动的可移植性,通常采用动态映射的方式,如网卡驱动。不同的硬件平台,可能使用不同的外部中断供网卡使用,通过动态映射的方式,只需修改注册表中的相应键值就能完成驱动的移植,而无须修改代码。驱动中动态映射IRQ的方法是调用函数KernelIoControl(),第一个参数为IOCTL_HAL_REQUEST_SYSINTR,传入物理中断号IRQ,正确返回后,会产生一个SYSINTR,最终完成动态转换的是函数OALIntrRequestSysIntr()。IRQ和SYSINTR的映射关系在文件C:\WINCE600\PLATFORM\COMMON\SRC\COMMON\INTR\BASE\map.c中实现。

驱动中使用中断的典型过程如下:

1.       初始化GPIO,以及相应中断寄存器,配置中断的工作模式。

2.       建立一个SYSINTR与IRQ对应,调用函数KernelIoControl()。

3.       创建一个事件与SYSINTR关联,调用函数CreateEvent()。

4.       创建一个线程,在线程中等待创建的事件,调用函数WaitForSingleObject()。

5.       完成处理后,通知内核本次中断处理结束,调用函数InterruptDone()。

OAL层跟中断相关的有如下几个函数:

OALIntrInit():初始化中断寄存器及相应的GPIO,可建立静态的IRQ到SYSINTR的映射关系。

OALIntrRequestIrqs():获取设备的IRQ号,如通过IO Address获取该设备对应的IRQ。

OALIntrEnableIrqs():使能中断源,主要完成清除中断屏蔽寄存器和中断待决寄存器。

OALIntrDisableIrqs():关闭中断源,通过设置中断屏蔽寄存器的相应位以屏蔽中断源。

OALIntrDoneIrqs():清除中断屏蔽寄存器和中断待决寄存器使MCU能处理下一次中断。

OEMInterruptHandler():将IRQ号转换为SYSINTR,内核的中断服务程序将根据此值设定特定的事件。

内核中跟中断相关的工作主要有以下几个部分:

1.         定义异常处理函数,其实现文件为C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s。

2.         创建中断向量表,其实现文件为C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\exvector.s

3.         中断向量的初始化,其实现在文件C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\mdarm.c中,其中的代码表明WinCE的中断向量表在高端(0xffff0000)。

时间: 2024-09-20 07:34:30

S3C2410 && WinCE6.0的中断处理分析的相关文章

S3C2410下WinCE6.0的启动过程详解

通过前两篇文章的介绍,我们已经知道NBOOT用来引导EBOOT,继而EBOOT加载并引导WinCE操作系统(NK).那么,WinCE6.0的启动过程又是怎样的呢?本文基于S3C2410的平台做一个详细的分析.需要说明的是,WinCE6.0的整个启动过程对于同一类型的MCU来说大同小异,如S3C2410和PXA270同属ARM平台的MCU,所以他们的启动过程是类似的,可以说唯一的不同就在OAL处,而WinCE操作系统的启动正是从OAL开始的.      OAL(OEM Adaptation Lay

WinCE6.0内存分析工具

      <Memory Usage Tool for Windows CE 6.x>中介绍了一个用于查看和分析WinCE6.0内存状态的工具,具体内容参见原文.       该工具主要有两部分组成,一个是运行于设备端的命令行程序(DevHealth60.exe),另一个是运行于PC端的分析和显示内存状态报告的工具(DevHealthViewer6.exe).       为了方便使用,写了一个小工具(HealthHelper)配合DevHealth60.exe.用法很简单,将其和DevHe

Windows Embedded CE 6.0实时性分析

     Windows Embedded CE 6.0是微软公司目前最新的嵌入式操作系统之一,支持四种体系结构的MCU(ARM.MIPS.SH4和x86).在众多的嵌入式操作系统中,它以自己独特的优势脱颖而出,在整个嵌入式操作系统的市场份额中占有很大比重.相比其他嵌入式操作系统,Windows Embedded CE 6.0主要有以下特点: 图形用户界面,与桌面操作系统的图形用户界面基本一致,便于用户接受: 网络连接的支持,包括PAN.LAN.WAN.BlueTooth和WIFI: 多媒体的支

《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异常.介绍了中断向量表的入口.通用的中断处理代码.中断和软中断.延迟处理.中断异常的返回过程. 第二章内容较多,会分几个部分讲述.本部分主要讲进入.退出中断的过程,这部分代码涉及的都是汇编部分.   法律声明:<LINUX3.0内核源代码分析>系列文章由谢宝友(scxby@163.com)发表于ht

WinCE6.0的EBOOT概要

     为一个新的硬件设备定制WinCE6.0操作系统,一般需要完成以下几个主要步骤: 1.       针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须包括BOOTLOADER.OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动. 2.       利用创建的BSP,定制一个系统设计(OS Design).即通过VS2005创建一个Platform Builder的工程.该工程可编译产生最终的运行时映像文

WinCE6.0 KITL概要

KITL(Kernel Independent Transport Layer)即内核独立传输层,它为我们提供了一种调试WinCE的简便方法.KITL将通信服务协议和用于通信的硬件分离开来.所以我们在创建硬件传输层时就省去很多麻烦,否则我们自己必须实现与设备进行数据交互的协议.KITL工作在硬件传输层之上,因此,它无须关心用于通信的具体硬件,我们可以用USB.Serial或者Ethernet作为KITL的调试通道.具体选择哪一个,由硬件平台和软件资源决定.有些设备没有Ethernet和Seria

图标-WinCE6.0电池电量显示的不正确,求有经验的牛人指教

问题描述 WinCE6.0电池电量显示的不正确,求有经验的牛人指教 我用的WinCE6.0系统,现在电池显示这一块有一些问题,我在"控制面板"里看电池信息,在"电池"这个标签下显示剩余电量100%,在"方案"标签下显示"电池电源".可是为什么我的WinCE桌面右下角的电源信息图标是个"小插头",而不是一个小电池图标呢. 我的电池电量检测芯片是DS2782,电池驱动的PDD层我看了也没多大问题,就是这里有点不

Windows XP下安装WinCE6.0开发环境

Windows下如何编译WinCE6.0及开发应用程序,下面介绍(安装之前必须保证C盘有足够的空间!20g左右!主要是因为在安装程序在安装过程中要解压): 在Visual Studio 2005之前,开发WinCE嵌入式程序需要安装Platform Builder,不过Platform Builder已经作为一个插件集成在Visual Studio 2005里了. 1.下载并安装Visual Studio 2005(Visual Studio 2008只支持开发应用程序,不能用来定制WinCE内

wince6.0模拟器的问题

问题描述 wince6.0模拟器的问题 奇怪模拟器ip地址怎么会是55段的呢,我的电脑是1段的,我试过把模拟器改成1段,但是同步连去就会断开了,如果使用55段的时候,又访问不了我电脑上的数据库,有什么配置让模拟器连接的时候使用的就1段的呢或者说跟电脑ip段相同, 下面是模拟器ip地址 下面是我电脑的ip地址(window2003sp2) 解决方案 这个可以自己设置的,检查下配置文件. 解决方案二: WinCE 的模拟器,功能是有限的. 模拟器运行在 PC 上,可以使用 PC 的网络,但这只是一个