S3C2410中断分析
S3C2410中文手册第14章 中断控制器

第十四章中断控制器概述S3C2410中断控制器接收56个中断源的中断请求。
中断源由如DMA控制器、UART、IIC等内部外设提供。
这些中断源中,UARTn和EINTn中断是以或逻辑输入到中断控制器的。
当从内部外设和外部中断请求引脚接收到多个中断请求时,经过中断仲裁后,中断控制器向ARM920T请求FIQ或者IRQ中断。
仲裁过程与硬件优先级有关,仲裁结果写入中断请求寄存器。
中断请求寄存器帮助用户确定哪个中断产生。
中断控制器操作程序状态寄存器PSR中的F位和I位如果PSR中的F位被置1,CPU不接收FIQ快速中断,同样如果I位PSR被置1,CPU不接收IRQ中断,因此中断控制器能够通过将PSR的F和I位和相应的INTMSK中的位清零来接收中断。
中断模式ARM920T有两种中断模式:FIQ和IRQ。
在中断请求时所有的中断源决定使用哪个模式。
中断请求寄存器S3C2410有两种中断请求寄存器:源请求寄存器(SRCPND)和中断请求寄存器(INTPND)。
这些请求寄存器揭示了一个中断是否正在请求。
当中断源请求中断服务时SRCPND寄存器中的相应位肯定被置1,然而,中断仲裁之后则只有INTPND寄存器的某1位被自动置1。
即使该中断被屏蔽,SRCPND寄存器中的相应位也会被置1,但是INTPND寄存器将不会改变。
当INTPND寄存器的某位被置1,且I位或者F位清零时中断服务即开始。
SRCPND和INTPND寄存器能够被读和写,因此服务函数必须通过向SRCPND和INTPND中相应位写入“1”来清除中断请求条件。
中断屏蔽寄存器INTMSK通过中断屏蔽寄存器的哪个屏蔽位被置1可以知道哪个中断被禁止。
如果INTMSK的某个屏蔽位为0,此中断将会被正常服务。
如果中断源产生了一个请求,SRCPND中的源请求位被置位,即使相应屏蔽位为1。
中断源下表列出了中断控制器支持的56个中断源中断优先级产生模块其中32个中断请求的优先级逻辑有由个rotation based仲裁位组成:6个一级仲裁位和一个二级位,如图14-2所示。
ARM9S3C2410x中文datasheet资料(绝对完整版)03S3c2410中断异常处理概述

使用中断的步骤:1、当发生中断IRQ时,CPU进入“中断模式”,这时使用“中断模式”下的堆栈;当发生快中断FIQ时,CPU进入“快中断模式”,这时使用“快中断模式”下的堆栈。
所以在使用中断前,先设置好相应模式下的堆栈。
2、对于“Request sources(without sub -register)”中的中断,将INTSUBMSK寄存器中相应位设为03、将INTMSK寄存器中相应位设为04、确定使用此的方式:是FIQ还是IRQ。
a.如果是FIQ,则在INTMOD寄存器设置相应位为1b.如果是IRQ,则在RIORITY寄存器中设置优先级使用中断的步骤:5、准备好中断处理函数,a.中断向量:在中断向量设置好当FIQ或IRQ被触发时的跳转函数,IRQ、FIQ的中断向量地址分别为0x00000018、0x0000001c b.对于IRQ,在跳转函数中读取INTPND寄存器或INTOFFSET 寄存器的值来确定中断源,然后调用具体的处理函数c.对于FIQ,因为只有一个中断可以设为FIQ,无须判断中断源d.中断处理函数进入和返回6、设置CPSR寄存器中的F-bit(对于FIQ)或I-bit(对于IRQ)为0,开中断s3c2410 中断异常处理在进入正题之前,我想先把ARM920T的异常向量表(Exception Vectors)做一个简短的介绍。
:]ARM920T的异常向量表有两种存放方式,一种是低端存放(从0x00000000处开始存放),另一种是高端存放(从0xfff000000处开始存放)。
关于为什么要分两种方式进行存放这点我将在介绍MMU的文章中进行说明,本文采用低端模式。
ARM920T能处理有8个异常,他们分别是:Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),Reserved,IRQ,FIQ下面是某个采用低端模式的系统源码片段:/****************************************************** ***********************_start:b Handle_Resetb HandleUndefb HandleSWIb HandlePrefetchAbortb HandleDataAbortb HandleNotUsedb HandleIRQb HandleFIQ…..…..other codes…...******************************************************* **********************/上面这部分片段一般出现在一个名叫“head.s”的汇编文件的里,“b Handle_Reset”这条语句就是系统上电之后运行的第一条语句。
基于s3c2410的任务切换软中断级服务的实现

基于s3c2410的任务切换软中断级服务的实现1.关于软中断指令软件中断指令(SWI)可以产生一个软件中断异常,这为应用程序调用系统例程提供了一种机制。
语法:SWI {} SWI_number SWI执行后的寄存器变化:lr_svc = SWI指令后面的指令地址spsr_svc = cpsr pc = vectors + 0x08cpsr模式= SVC cpsr I = 1(屏蔽IRQ中断)处理器执行SWI指令时,设置程序计数器pc为向量表的0x08偏移处,同事强制切换处理器模式到SVC模式,以便操作系统例程可以在特权模式下被调用。
每个SWI指令有一个关联的SWI号(number),用于表示一个特定的功能调用或特性。
【例子】一个ARM工具箱中用于调试SWI的例子,是一个SWI号为0x123456的SWI 调用。
通常SWI指令是在用户模式下执行的。
SWI执行前:cpsr = nzcVqift_USER pc = 0x00008000 lr = 0x003fffff ;lr = 4 r0 = 0x12执行指令:0x00008000 SWI 0x123456SWI执行后:cpsr = nzcVqIft_SVC spsr = nzcVqift_USER pc = 0x00000008 lr = 0x00008004 r0 = 0x12SWI用于调用操作系统的例程,通常需要传递一些参数,这可以通过寄存器来完成。
在上面的例子中,r0 用于传递参数0x12,返回值也通过寄存器来传递。
处理软件中断调用的代码段称为中断处理程序(SWI Handler)。
中断处理程序通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的。
SWI号由下式决定:SWI_number = AND NOT《0xff000000》其中SWI instruction就是实际处理器执行的32位SWI指令SWI指令编码为:31 - 28 27 - 24 23 - 0 cond 1 1 1 1 immed24指令的二进制代码的bit23-bit0是24bit的立即数,即SWI指令的中断号,通过屏蔽高8bit 即可获得中断号。
第7章S3C2410中断

南昌大学信息工程学院
中断方式控制的I/O操作步 骤
南昌大学
NANCHANG UNIVERSITY
中断源及其识别方法
• 嵌入式系统中,需要采用中断控制方式 的I/O端口或部件有许多,如S3C2410芯 片中就有56个中断源。而通常微处理器 能够提供的中断请求信号线是有限的, 如ARM920T核提供给外部的中断请求 信号线仅有IRQ和FIQ两根。因此,当有 中断产生时,微处理器就必须通过一定 的方式识别出是哪个中断源发来的请求 信号,以便转向其对应的中断服务程序 例程,这就是中断源的识别。
嵌入式系统设计
南昌大学信息工程学院
南昌大学
NANCHANG UNIVERSITY
图
• 中断的形象示意:
嵌入式系统设计
南昌大学信息工程学院
南昌大学
NANCHANG UNIVERSITY
· 初始化微处理器中用于中断方式的寄存器,开放中 断。 · I/O端口或部件完成数据操作后并产生中断请求信 号。 · 当中断请求信号有效时,微处理器可能处在不可中 断状态。等到微处理器允许中断时,微处理器就 保存当前状态,停止它现行的操作并开始进行中 断源的识别。 · 在识别出优先级最高的中断源后,微处理器转到对 应的中断服务例程入口,并应答中断,I/O端口 或部件收到应答信号后,撤消其中断请求。 · 微处理器读入或写出数据,当中断服务例程结 束后,回到原来的被中断程序处继续执行。
嵌入式系统设计
南昌大学信息工程学院
南昌大学
NANCHANG UNIVERSITY
中断未决寄存器
嵌入式系统设计
• INTPND寄存器是32位寄存器,寄存器中的每一位 对应一个中断源。只有未被屏蔽且具有最高优先 级、在源未决寄存器中等待处理的中断请求可以 把其对应的中断未决位置1。因此,INTPND寄存 器中只有一位可以设置为1,同时,中断控制器 产生IRQ信号给ARM920T核。在IRQ的中断服务例 程里,设计者可以读取该寄存器,从而获知哪个 中断源被处理。 • 当INTPND寄存器的一个未决位被设置为1,只要 ARM920T核内部的状态寄存器PSR中的I标志和F标 志被清零,对应的中断服务例程就可以开始执行 。INTPND寄存器是可读写的,在中断服务例程里 面必须清除中断未决位。 南昌大学信息工程学院
嵌入式10_S3C2410处理器中断控制器

据ARM系列中断处理的特点,各种异常中断对应
于ARM系列的不同工作模式 。
1、S3C2410的中断类型
2、异常中断的响应过程和返回过程
(1)异常中断响应过程
1) 保存CPSR到将要执行的异常中断的SPSR; 2)设置CPSR的值:设置CPSR相应位的值使处理器进 入特定的处理器模式,按要求屏蔽中断; 3)设置LR寄存器:将中断相应模式的LR寄存器的值设 置为异常中断的返回地址; 4)处理程序计数器PC:将PC值设为相应的中断向量的
*****************************************/
void EnableIrq(int bit) { rINTMSK |= ~(bit); }
(5)中断偏移寄存器(INTOFFSET)
中断偏移寄存器中的值显示了INTPND寄存器中哪个
IRQ模式的中断请求。这个位在清除SRCPND和INTPND 后被自动清除。
4、中断控制寄存器
4、S3C2410的中断控制寄存器
#define rSRCPND #define rINTMOD #define rINTMSK #define rPRIORITY #define rINTPND (*(volatile unsigned *)0x4a000000) (*(volatile unsigned *)0x4a000004) (*(volatile unsigned *)0x4a000008) (*(volatile unsigned *)0x4a00000a) (*(volatile unsigned *)0x4a000010)
(1)源中断申请寄存器( SRCPND)
(1)源中断申请寄存器( SRCPND)
(2)中断模式寄存器(INTMOD)
S3C2410的外部中断实验

实验4 S3C2410 外部中断实验一、实验目的掌握S3C2410 通用F口配置为外部中断的方法,会在MDK中可视化配置外部中断,理解外部中断的触发过程,熟练掌握和中断相关寄存器的使用以及中断服务函数的编程方法。
二、实验预备知识熟悉UP-NETARM2410实验箱的结构,S3C2410的外设接口电路,熟悉MDK编程软件的使用方法,熟悉汇编语言程序设计的一般方法。
三、实验内容将I/O口中的PF2配置成外部中断 2 EINT2,编写汇编语言程序编译并下载到UP-NETARM2410实验箱,控制GPC5/GPC6/GPC7上所接的三个LED闪烁,主程序中的实验现象是什么?按下EINT2开关后触发外部中断2实验现象又是什么,请在实验结果中自己作答。
四、参考程序主程序核心代码:32 LDR R0, = SRCPND33 MOV R1, #0x034 STR R1, [R0, #0x4]35 MVN R1, #0x0436 STR R1, [R0, #0x8]37 MOV R1, #0x7F38 STR R1, [R0, #0xC]394041 ledflash42 LDR R0, =GPCDA T_ADDR43 MOV R1, #0x044 EOR R1, R1, #LED_MASK45 STR R1, [R0] ; LED OFF4647 BL Delay4849 MOV R1, #0x6050 EOR R1, R1, #LED_MASK51 STR R1, [R0] ; LED ON5253 BL Delay5455 B ledflash56 Delay57 MOV R3, #0x0F000058 MOV R4, #0x0F000059 subcycle160 SUB R3, R3, #161 subcycle262 SUB R4, R4, #163 CMP R4, #064 BGE subcycle26566 CMP R3, #067 BGE subcycle168 BX LR中断服务程序核心代码:136 ; int2 service137 int2_isr138 ; SUB R14, R14, #4139 ; STMFD SP!, {R0-R8, R14}; save env 140 STMFD SP!, {R0-R1}141142 LDR R0, = SRCPND143 MOV R1, #0x40144 STR R1, [R0] ; clear SRCPND145146 LDR R1, [R0, #0x10]147 STR R1, [R0, #0x10] ; clear INTPND 148149 ; int2-LED3 ON of OFF150 LDR R0, =GPCDAT_ADDR151 MOV R1, #0x0152 EOR R1, R1, #LED3_MASK153 STR R1, [R0] ; LED OFF154155 BL Delay156157 MOV R1, #0x80158 EOR R1, R1, #LED3_MASK159 STR R1, [R0] ; LED ON160161 BL Delay五、实验结果请自己作答。
S3C2410的中断异常处理机制

S3C2410的中断异常处理机制发表日期:1/12/2007 2:33:44 PM 来源:《电子元器件应用》S3C2410的中断异常处理机制摘要:ARM处理器在嵌入式系统中的地位越来越重要,S3C2410作为ARM9微处理器家族中的一员,应用已十分广泛。
文中简述了ARM处理器的中断异常种类、响应和返回过程;重点讨论了S3C2410中断控制器的结构和处理机制,以及对IRQ中断的具体处理流程,最后给出了详细的参考代码。
关键词:ARM9微处理器;S3C2410;IRQ;中断异常处理王皓平一帆西安电子科技大学通信工程学院引言在ARM微处理器的编程,特别是系统初始化代码的编写中,通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发。
中断处理的编程实现需要深入了解ARM 内核和处理器本身的中断特征,以便设计一种快速简便的中断处理机制。
当异常中断发生时,若系统执行完当前指令,那么将跳转到相应的异常中断处理程序处执行。
而当异常中断处理程序执行完成后,程序将返回到发生中断的指令的下一条指令处执行。
在进入异常中断处理程序时,要保存被中断的程序的执行现场。
而从异常中断处理程序退出时,则要恢复被中断的程序的执行现场。
ARM 体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,可用来指定各异常中断及其处理程序的对应关系。
当一个异常出现以后,ARM 微处理器会执行以下几步操作:(1)保存处理器当前状态、中断屏蔽位以及各条件标志位;(2)设置当前程序状态寄存器CPSR 中相应的位;(3)将寄存器lr_mode设置成返回地址;(4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。
在接收到中断请求以后,ARM处理器内核会自动执行以上四步,而程序计数器PC总是跳转到相应的固定地址。
从异常中断处理程序中返回下面的两个基本操作:一是恢复被屏蔽的程序的处理器状态;二是返回到发生异常中断的指令的下一条指令处继续执行。
S3C2410 中断程序的实现

S3C2410 中断程序的实现
在此要注意的是区别中断向量表和异常向量表。
中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。
以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。
定义中断向量表的物理地址:
代码
将中断处理程序入口地址放入中断向量表:
代码
定义中断处理程序:
代码
定义异常向量表:
代码
定义异常处理函数:
代码
异常处理宏HANDLER的定义:代码
定义IRQ 中断处理宏IRQHandle:
代码
申明IRQ 异常的服务程序为:IsrIRQ,即,发生IRQ 异常时,执行“b HandlerIRQ”即是
运行IsrIRQ代码:
代码
IRQ 异常处理程序:
代码
由上可以知道,当一个IRQ 中断发生时,CPU将从0X18(IRQ 异常入口地址)取指执行,在这一步PC 的跳转是有硬件实现的。
在入口0x18 地址处放的是一条跳转指令,这条指令将跳到IRQ 异常处理程序运行,IRQ 异常处理程序主要是根据中断源查找中断向量表。
获得中断入口地址后,接着CPU 跳转中断处理程序运行。
在嵌入式系统中异常向量表和中断向量表都是存于FLASH起始的一段空间中。
而异常处理和中断处理程序都是运行在RAM中的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S3C2410中断分析具体详细解释这段来自:/ghy0504/blog/item/db90649a0f554bbfc8eaf47a.html /renpine/archive/2009/10/04/4631854.aspx具体写的很详细,后面画个图对流程进行详细解释,方便自己查阅,并结合wince里面底层中断的代码分析下。
S3C2410有24个外部中断引脚:EINT0~EINT23,但是对于EINT0~EINT3这4个外部中断而言,使用比较简单;对于其它20个而言,使用稍稍复杂一些。
首先,来看S3C2410的中断控制器,有6个中断裁决器分为2级,第1级5个,第2级1个。
第1级的5个裁决器管理32个中断源,在这32个中断源中有2个是保留的,24个是给内部中断源的,而外部中断只给了6个中断:EINT0、EINT1、EINT2、EINT3、EINT4~7、EINT8~23。
EINT4~EINT7、EINT8~EINT23都是共享一个中断。
中断控制器中主要的相关寄存器有:INTMSK、SRCPND、PRIORITY、INTPND,还有一个INTMOD。
但是对于外部中断还有几个寄存器:EXTINTn、EINTMSK、EINTPEND等。
对于外部中断EINT0~EINT3由于没有共享,因此外部寄存器中只有EXTINT0和它们有关,进行中断触发电平信号的设置。
但是对于其他的20个外部中断而言,所有上面提到的寄存器都有关系。
实际上对于EINT4~EINT23,实际上可以看作有3级屏蔽,第1级屏蔽是CPSR中的I-Bit和F-Bit,第2级屏蔽是EINTMASK([4:23]每一位对应一个相应的外部中断),第3级屏蔽是INTMSK(Bit4、Bit5);对于EINT0~EINT3而言,只是INTMSK中的Bit0~Bit3,因此在变成初始化时应该要特别注意。
在外部中断有中断请求时,由于EINT4~7、EINT8~23分别共享中断,因此在SRCPND 中分别对应Bit4、Bit5,最终导致INTPND中的相应位置1(在任何时刻只能有一个位置1),但是如何分辨这些共享的中断?可以通过查询EINTPEND来进行(Bit4~Bit23分别对应1个外部中断)。
由于在相应中断后在服务例程中应将挂起寄存器中相应的位清0来清除未处理状态,因此对于EINT4~7、EINT8~23这20个外部中断的清除挂起寄存器的顺序是:1. EINTPEND(可能多位同事为1),方法:向要清0的位写1,其它位写0,但要注意由于第4位保留,因此不要试图向第4位写1,可能会导致不可预料的结果。
2.SRCPND(可能多位同时为1),方法:向要清0的位写1,其它位写0。
3.INTPND,方法:向其写本身的数据(即INTPND=INTPND)。
下面具体介绍各个寄存器的功能:SRCPND(Source Pending Register)寄存器有效位32位,可读写,每一位涉及到一个中断源,SRCPND是主中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND的相应位便被置1,也就是说SRCPND 在同一时刻可以有若干位同时被置1,另外,此寄存器不受中断控制器的优先权逻辑的影响。
如果此中断没有被INTMSK寄存器屏蔽、或者是快中断(FIQ)的话,它将被进一步处理。
通过写数据到这个寄存器能清除SPCPND相应的位。
INTMODE(Interrupt Mode Register)寄存器有效位为32位,可读写,每一位与SRCPND中各位相对应,它的作用是指定该位相应的中断源处理模式(IRQ还是FIQ)。
若某位为0,则该位相对应的中断按IRQ模式处理,为1则以FIQ模式进行处理,该寄存器初始化值为0x00000000,即所有中断皆以IRQ模式进行处理。
此中断控制器中只有一个中断源能用FIQ mode(在紧急中断下使用FIQ mode),因此INTMODE仅有一位能置1。
INTMSK(Interrupt Mask Register)寄存器有效位为32位,可读写,INTMSK为主中断屏蔽寄存器与SRCPND寄存器对应,它的作用是决定该位相应的中断请求是否被处理。
若某位被设置为1,则该位相对应的中断产生后将被忽略(CPU不处理该中断请求),设置为0则CPU对其进行处理。
该寄存器初始化值为0xFFFFFFFF,既默认情况下所有的中断都是被屏蔽的。
PRIORITY(IRQ PRIORITY Control Register)寄存器有32位,有效位[20:0],可读写,此寄存器的作用是如果有几个中断源同时触发,按照图2.2.1的流向,假如这几个中断源都没被屏蔽,并且都是IRQ模式,因此就要判定哪个中断源的优先级最高,使其在INTPND寄存器中对应位置1,CPU转向相应的中断服务程序,让中断服务程序来处理相应的中断请求。
INTPND(Interrupt Pending Register)寄存器有效位为32位,可读写,看起来和SRCPND寄存器一样,其实他们在功能上有着重大的区别。
他在某一时刻只能有1个位被置1,INTPND 某个位被置1(该位对应的中断在所有已触发的中断里具有最高优先级且该中断没有被屏蔽),则表示CPU即将或已经在对该位相应的中断进行处理。
因此SRCPND寄存器说明有什么中断被触发了,而INTPND寄存器说明CPU即将或已经在对某一个中断进行处理。
INTOFFSET(Interrupt Offset Register)寄存器有效位为32位,只读,此寄存器的值显示IRQ mode的哪个中断请求在INTPND寄存器中,通过清SRCPND和INTPND 这位能自动清除,FIQ mode中断不会影响INTOFFSET寄存器,因此此寄存器仅对IRQ mode中断有效。
SUBSRCPND(Sub Source Pending Register)寄存器有32位,有效位[10:0],可读写,它们中的每一位分别代表一个中断源,SRCPND是主中断源引脚寄存器,它是副中断源引脚寄存器,情况类似SRCPND。
INTSUBMSK(Interrupt Sub Mask Register)寄存器有32位但有效位为11位,可读写,如果mask bit位是0,此中断请求被服务,情况类似INTMSK。
图解分析图上面部分表述内部中断流程,产生了两个中断INT_TXD和INT_RTC,INT_TXD经过SubMask后为INT_UART0,这里SRCPND有两个中断标志,最后假设INT_UART0优先级高,最后在INTPND里面INT_UART0置一了。
子屏蔽模块里面其实主要是一些同一控制器有多个中断标志的情况,可以这样认为就是控制器本身的标志位,三星这样做反而有点迷惑人,成熟厂家一般都是作为一个模块控制器本身的寄存器标志来做的。
图下部分为外部中断产生流程,外部24个中断分为3组,在达到内部中断流程入口时候,分为了EINT0\EINT1\EINT2\EINT3\EINT4_7\EINT8_23这六个标志,到达NO_SUB REQ SOURCE,为非子屏蔽掩码部分。
故当外部中断的EINT4_7与EINT8_23到来时,需要去读取EINTMASK与EINTPEND来确定为哪个中断源。
INTPND标志置一后:1、NO_SUB_REQ_SOURCE则直接清楚SRCPND和INTPND对应标志位即可。
2、SUB_REQ_SOURCE则在取得对应子中断号后清除SUBSRCPND、SRCPND和INTPND对应标志位。
3、EXTINT,EINT0~EINT3与NO_SUB_REQ_SOURCE相同,EINT4_7\EINT8_23先清除EINTMASK和EINTPEND后再进行与NO_SUB_REQ_SOURCE相同动作。
具体代码这里分析Wince模拟器里面的中断处理代码就很清除了。
ULONG OEMInterruptHandler(ULONG ra){UINT32 sysIntr = SYSINTR_NOP;UINT32 irq, irq2 = OAL_INTR_IRQ_UNDEFINED, mask;fInterruptFlag = TRUE; // Signal OemIdle to come out of idle.// Get pending interrupt(s)irq = INREG32(&g_pIntrRegs->INTOFFSET);// 系统心脏脉动定时器,不需要屏蔽中断处理,直接就按照NO_SUB_REQ_SOURCE 进行。
if (irq == IRQ_TIMER4) {// Clear the interruptOUTREG32(&g_pIntrRegs->SRCPND, 1 << IRQ_TIMER4);OUTREG32(&g_pIntrRegs->INTPND, 1 << IRQ_TIMER4);// Rest is on timer interrupt handlersysIntr = OALTimerIntrHandler();}// 调试中断用,需要屏蔽后再按照NO_SUB_REQ_SOURCE处理,等系统将任务处理结束后再行开启mask。
else if (irq == IRQ_TIMER2){// Mask and clear the interrupt.mask = 1 << irq;SETREG32(&g_pIntrRegs->INTMSK, mask);OUTREG32(&g_pIntrRegs->SRCPND, mask);OUTREG32(&g_pIntrRegs->INTPND, mask);// The rest is up to the profiling interrupt handler (if profiling// is enabled).//if (g_pProfilerISR){sysIntr = g_pProfilerISR(ra);}}else{#ifdef OAL_ILTIMINGif (g_oalILT.active) {g_oalILT.isrTime1 = OALTimerCountsSinceSysTick();g_oalILT.savedPC = 0;g_oalILT.interrupts++;}#endifif (irq == IRQ_EINT4_7 || irq == IRQ_EINT8_23) {// Find external interrupt number//外部两组中断源,先找出具体中断号,再将其清除,并将该中断号给屏蔽,等处理结束后再行开启mask = INREG32(&g_pPortRegs->EINTPEND);mask &= ~INREG32(&g_pPortRegs->EINTMASK);mask = (mask ^ (mask - 1)) >> 5;irq2 = IRQ_EINT4;while (mask != 0) {mask >>= 1;irq2++;}// Mask and clear interruptmask = 1 << (irq2 - IRQ_EINT4 + 4);SETREG32(&g_pPortRegs->EINTMASK, mask);OUTREG32(&g_pPortRegs->EINTPEND, mask);// calculate mask for primary interruptmask = 1 << irq;// update irqirq = irq2;} else {// 其它NO_SUB_REQ_SOURCE,按照NO_SUB_REQ_SOURCE处理,该处需要屏蔽。