您的位置 首页 5G

s3c2410 中止反常处理

在进入正题之前,我想先把ARM920T的异常向量表(ExceptionVectors)做一个简短的介绍。:]ARM920T的异常向量表有两种存放方式,一…

在进入正题之前,我想先把ARM920T的反常向量表(Exception Vectors)做一个简略的介绍。:]

ARM920T 的反常向量表有两种寄存办法,一种是低端寄存(从0x00000000处开端寄存),另一种是高端寄存(从0xfff000000处开端寄存)。关于为什 么要分两种办法进行寄存这点我将在介绍MMU的文章中进行阐明,本文选用低端形式。ARM920T能处理有8个反常,他们别离是:
Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),Reserved,IRQ,FIQ
下面是某个选用低端形式的体系源码片段:

_start:
b Handle_Reset
b HandleUndef
b HandleSWI
b HandlePrefetchAbort
b HandleDataAbort
b HandleNotUsed
b HandleIRQ
b HandleFIQ
…..

..
other codes

上面这部分片段一般呈现在一个名叫“head.s”的汇编文件里,“b Handle_Reset”这条句子便是体系上电之后运转的榜首条句子。也便是说这部分代码的二进制码有必要坐落内存的最开端部分(这正是低端寄存形式), 由于上电后CPU会从SDRAM的0x00000000处取榜首条指令并履行。

Address Instruct
0x00000000:b Handle_Reset
0x00000004:b HandleUndef
0x00000008:b HandleSWI
0x0000000C:b HandlePrefetchAbort
0x00000010:b HandleDataAbort
0x00000014:b HandleNotUsed
0x00000018:b HandleIRQ
0x0000001C:b HandleFIQ

上面是该程序段在体系上电后加载到内存后的散布状况,咱们能够看到每条指令占用了4个字节。
上电后,PC指针会跳转到Handle_Reset处开端运转。今后体系每逢有反常呈现,则CPU会依据反常号,从内存的0x00000000处开端查表 做相应的处理,比方体系触发了一个IRQ反常,IRQ为第6号反常,则CPU将把PC指向0x00000018地址 (4*6=24=0x00000018)处运转,该地址的指令是跳转到“中止反常服务例程”(HandleIRQ)处运转。以上便是我对反常向量表的一个 简略介绍。现在能够进入咱们文章的主题 “中止反常处理”,s3c2410的中止分快中止(FIQ)和一般中止(IRQ),咱们评论的重点是一般中止(IRQ)。
s3c2410的中止反常处理模块一共由以下寄存器构成
SRCPND(SOURCE PENDING REGISTER)
INTMOD(INTERRUPT MODE REGISTER)
INTMSK(INTERRUPT MASK REGISTER)
PRIORITY( PRIORITY REGISTER)
INTPND(INTERRUPT PENDING REGISTER)
INTOFFSET(INTERRUPT OFFSET REGISTER)
SUBSRCPND(INTERRUPT SUB SOURCE PENDING)
INTSUBMSK(INTERRUPT SUB MASK REGISTER)

下面我将解说每个寄存器在一个中止处理流程中所扮演的人物:
SRCPND/ SUBSRCPND这两个寄存器在功用上是相同的,它们是中止源引脚寄存器,在一个中止反常处理流程中,中止信号传进中止反常处理模块后首要遇到的便是SRCPND/ SUBSRCPND,这两个寄存器的效果是用于标示出哪个中止请求被触发。SRCPND的有用位为32,SUBSRCPND的有用位为11,它们中的每一位别离代表一个中止源。SRCPND为主中止源引脚寄存器,SUBSRCPND为副中止源引脚寄存器。
这儿列举出SRCPND的各个位信息:

每个位的初始值皆为0。假定现在体系触发了TIMER0中止,则第10bit将被置1,代表TIMER0中止被触发,该中止请求行将被处理(若该中止没有被屏蔽的话)。SUBSRCPND状况与SRCPND相同,这儿就不多讲了。
INTMOD寄存器有用位为32位,每一位与SRCPND中各位相对应,它的效果是指定该位相应的中止源处理形式(IRQ仍是FIQ)。若某位为0,则该位相对应的中止按IRQ形式处理,为1则以FIQ形式进行处理,该寄存器初始化值为0x00000000,即一切中止皆以IRQ形式进行处理。(具体请参阅s3c2410操作手册)。
INTMSK/ INTSUBMSK寄存器为中止屏蔽寄存器 ,INTMSK为主中止屏蔽寄存器,INTSUBMSK为副中止屏蔽寄存器。INTMSK有用位为32,INTSUBMSK有用位为11,这两个寄存器各个位与SRCPND和SUBSRCPND别离对应。它们的效果是决议该位相应的中止请求是否被处理。若某位被设置为1,则该位相对应的中止发生后将被疏忽(CPU不处理该中止请求),设置为0则对其进行处理。这两个寄存器初始化后的值是0xFFFFFFFF和0x7FF,既默许状况下一切的中止都是被屏蔽的。
到目前为止咱们一共解说了SRCPND,INTMOD,INTMSK,SUBSRCPND,INTSUBMSK
五个寄存器,在持续解说PRIORITY寄存器之前咱们先来看一张图。
先弄清楚一点,现在要评论的是一个中止优先级的判别问题。为什么会有中止有先级的问题呢?咱们知道CPU某个时间只能对一个中止源进行中止处理,假如现在 有3个中止一起发生了,那CPU要按什么次第处理这个3个中止呢?这正是引进优先级判别的原因地点,通过优先级判别,CPU能够按某种次第逐一处理中止请 求。3sc2410的优先级判别分为两级。
如上图所示,SRCPND寄存器对应的32个中止源一共被分为6个组,每个组由一个ARBITER(0~5)寄存器对其进行办理。中止有必要先由所属组的ARBITER(0~5)进行榜首次优先级判别(榜首级判别)后再发往ARBITER6进行终究的判别(第二级判别)。ARBITER(0~5)这六个组的优先级现已固定,咱们无法改动,也便是说由ARBITER0操控的该组中止优先级最高(该组发生的中止进行榜首级判别后永久会以REQ0向ARBITER6传递曩昔)其次是ARBITER1, ARBITER2, ARBITER4, ARBITER4, ARBITER5.咱们能够操控的是某个组里边各个中止的优先级次第。怎样操控?通过PRIORITY寄存器进行操控:]
以下是PRIORITY寄存器各个位的参数表
从表上咱们能够知道PRIORITY寄存器内部各个位被分为两种类型,一种是ARB_MODE,另一种为ARB_SEL, ARB_MODE类型有5组对应ARBITER(2~6)(PS:此处应更正为ARB_MODE类型有7组对应ARBITER(0~6),在datasheet中上表还有续表,为ARB_MODE1-0),ARB_SEL类型有7组对应ARBITER(0~6)。现在我将以ARBITER2为例,解说中止组与PRIORITY寄存器中ARB_SEL, ARB_MODE之间的相互关系。
首要咱们看到ARBITER2寄存器办理的该组中止里包含了6个中止,别离是INT_TIMER0,INT_TIMER1,INT_TIMER2,INT_TIMER3,INT_TIMER4,INT_UART2,她们的默许中止请求号别离为REQ0,REQ1,REQ2,REQ3,REQ4,REQ5。咱们先看PRIORITY寄存器中的ARB_SEL2,该参数由两个位组成,初始值为00。从该表能够看出00界说了一个次第0-1-2-3-4-5,这个次第便是这组中止组的优先级摆放,这个次第指明晰以中止请求号为0(REQ0)的INT_TIMER0具有最高的中止优先级,其次是INT_TIMER1,INT_TIMER2…。假定现在ARB_SEL2的值被咱们设置为01。则一个新的优先级次第将被运用,01对应的优先级次第为0-2-3-4-1-5,从中能够看出优先级最高和最低的中止请求和之前没有改动,但原本处于第2优先级的INT_TIMER1中止现在变成了第5优先级。从ARB_SEL2被设置为00,01,10,11各个值所呈现的状况咱们能够看出,除最高和最低的优先级不变以外,其他各个中止的优先级其实是在做一个旋转摆放(rotate)。为了到达对各个中止相等对待这一方针,咱们能够让优先级次第在每个中止请求被处理完之后主动进行一次旋转,怎样主动让它旋转呢?咱们能够通过ARB_MODE2到达这个意图,该参数只需1个 bit,置1代表敞开对应中止组的优先级次第旋转,0则为封闭。现实受骗该方位为1之后,每处里完某个组的一个中止后,该组的ARB_SEL便递加在1(到达11后康复为00)。
现在咱们另ARB_MODE2=1,ARB_SEL2=00,则当时ARBITER2的优先级次第为0-1-2-3-4-5,假定现在该组的1号中止请求INT_TIMER1和2号中止请求INT_TIMER2被一起触发,CPU依据优先级判别后决议先把INT_TIMER1中止向ARBITER6进行发送(在ARBITER6做第终究优先级判别),接着再向ARBITER6发送INT_TIMER2中止。请注意,在INT_TIMER1被处理完毕后,该组中段的优先级次第被主动做了一次旋转,旋转后ARBITER2的优先级次第变为0-2-3-4-1-5。假定之后某个时间该组的INT_TIMER1和INT_TIMER2又被一起触发,则此刻CPU优先处理的会是INT_TIMER2。若咱们另ARB_MODE2=0,则改组的中止优先级次第在任何状况下都不做任何改动,除非咱们人为地从头设置了ARB_SEL2的值。
呼。。。好累。。。总算说完了费事的优先级-_-…持续。。。
INTPND寄存器可能是整个中止处理过程中咱们要特别注意的一个寄存器了,他的操作比较特别,怎样特别?请听我渐渐道来.:]
先看一下该寄存器各位具体功用列表
正如你所见的,INTPND寄存器与SRCPND长得如出一辙,但他们在中止反常处理中却扮演着不同的人物,假如说SRCPND是中止信号进入中止处理模块后所通过的榜首个场所的话,那么INTPND则是中止信号在中止处理模块里阅历的最终一个寄存器。它的每个位对应一个中止请求,若该位被置1,则标明相应的中止请求被触发,描绘到这儿你可能会发现它不只和SRCPND长得如出一辙,就连功用都相同,其实不然,他们在功用上有着严重的差异。SRCPND是中止源引脚寄存器,某个位被置1标明相应的中止被触发,但咱们知道在同一时间内体系能够触发若干个中止,只需中止被触发了,SRCPND的相应位便被置1,也便是说SRCPND在同一时间能够有若干位一起被置1,但是INTPND则不同,他在某一时间只能有1个位被置1,INTPND 某个位被置1(该位对应的中止在一切已触发的中止里具有最高优先级且该中止没有被屏蔽),则标明CPU行将或现已在对该位相应的中止进行处理。所以咱们能够有一个总结:SRCPND阐明晰有什么中止被触发了,INTPND阐明晰CPU行将或现已在对某一个中止进行处理。
特别注意:每逢某一个中止被处理完之后,咱们有必要手动地把SRCPND/SUBSRCPND , INTPND三个寄存器中与该中止相应的位由1设置为0,方才我说INTPND的操作很特别,它的特别之处就在于对当咱们要把该寄存器中某个值为1的位设置为0时,咱们不是往该方位0,而是往该方位1。假定SRCPND=0x00000003,INTPND=0x00000001,该值阐明当时0号中止和1号中止被触发,但当时正在被处理的是0号中止,处理完毕后咱们应该这样设置INTPND和SRCPND:
SRCPND=”0x00000002″ //位0被置为0
INTPND =0x00000001 //位0被置为0(办法是往该位写入1)
INTOFFSET寄存器的功用则很简略,它的效果仅仅用于标明哪个中止正在被处理。下面是该寄存器各位具体功用列表
若当时INT_TIMER0被触发了,则该寄存器的值为10,以此类推。
现在我把整个中止流程用一个图加以阐明
以上这个图清楚地阐明晰一个中止反常处理流程。
下面我用INT_TIMER0, INT_TIMER2和INT_UART0三个中止完整地介绍一次中止反常处理。首要咱们得做几个假定:
假定1:这三个中止的屏蔽被撤销。
假定2:PRIORITY寄存器中ARB_MODE2,ARB_MODE5皆为0,既不进行优先级的主动旋转排序,任何时候
ARBITER2,ARBITER5操控的中止组优先级次第别离为0-1-2-3-4-5和1-2-3-4。
假定3:这三个中止皆为IRQ类型。
假定4:这三个中止一起被触发。
INT_TIMER0,INT_TIMER2和INT_UART0三个中止被一起触发,此刻三个中止信号流向SRCPND寄存器,使该寄存器中的第10位,12位,28位被置为1,中止信号持续向前流经INTMASK寄存器,这三个中止都没有被屏蔽,所以信号进一步流经INTMODE寄存器,这三个中止皆为IRQ类型,故中止信号持续向前流向PRIORITY寄存器,通过优先级判别,INT_TIMER0中止信号使INTPND寄存器的第10方位1(INT_TIMER0优先级最高),此刻INTOFFSET寄存器的值为10,CPU转向相应的中止服务例程进行处理。处理完毕后,咱们的程序将INTPND和SRCPND的第10置为0,至此INT_TIMER0中止处理完毕。此刻SRCPND的第12位,28位仍为1(这两个中止请求未被处理),故他们会持续被CPU已方才描绘的办法进行处理。
中止反常处理就先讲到这吧 :]

以上是原帖内容,再次感谢作者。。。

PS:

在对2410的裸板进行中止试验的过程中,从菜鸟的视点动身,我把学到了一些东西和之前ARM体系结构的理论结合起来:

1、在ARM处理器中,r13(sp)和r14(lr)别离对应6个不同状态下的物理寄存器,其间1个是用户、体系形式共用的,其他别离对应5种反常形式(Exception Mode)。要在后续程序中运用中止,则应先把要用到的各种形式的仓库设置好,如设置IRQ和体系形式的sp:

msr cpsr_c,#0xd2@进入IRQ形式,IRQ和FIQ都处于禁止状态
ldr sp,=0x33000000

msr cpsr_c,#0xdf@进入体系形式,IRQ和FIQ都处于禁止状态
ldr sp,=0x34000000

blinit_irq @初始化中止
msr cpsr_r,#0x5f@置操控域的I位为0,翻开irq中止。试验中只用到irq

2、假如用到按键等中止操控,是归于外部中止的(External Interrupt),就需要装备EINT相关的寄存器。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/275117.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部