1、嵌入式创新实验 华中农业大学 计算机系 s3c2410 中断异常处理 嵌入式创新实验华中农业大学 计算机系 倪福川参考题目1) 基于嵌入式web的数据采集系统2 )基于ARM+Linux的MapReduce 的实现3)基于web的嵌入式数据库Sqlite管理4)基于web 的嵌入式视频智能监控5) 嵌入式中间件技术 Web Service 6).嵌入式创新实验华中农业大学 计算机系 倪福川ARM920T异常向量表存放方式一种是低端存放(从0 x00000000处开始存放),另一种是高端存放(从0 xfff000000处开始存放)。采用低端模式。ARM920T能处理有8个异常,采用低端模式的系统
2、源码片段:/*_start:b Handle_Resetb HandleUndefb HandleSWIb HandlePrefetchAbortb HandleDataAbortb HandleNotUsedb HandleIRQb HandleFIQ.other codes*/嵌入式创新实验华中农业大学 计算机系 倪福川异常向量表在“head.s”的汇编文件的里,“b Handle_Reset”系统上电之后运行的第一条语句。也就是说这部分代码须位于内存的最开始部分(这正是低端存放模式),因为上电后CPU会从SDRAM的0 x00000000处取第一条指令并执行。 Address Instr
3、uct0 x00000000: b Handle_Reset0 x00000004: b HandleUndef0 x00000008: b HandleSWI0 x0000000C: b HandlePrefetchAbort0 x00000010: b HandleDataAbort0 x00000014: b HandleNotUsed0 x00000018: b HandleIRQ0 x0000001C: b HandleFIQ上面是该程序段在系统上电后加载到内存后的分布情况,我们可以看到每条指令占用了4个字节。嵌入式创新实验华中农业大学 计算机系 倪福川中断异常处理简介上电后,PC指
4、针会跳转到Handle_Reset处开始运行。以后系统每当有异常出现,则CPU会根据异常号,从内存的0 x00000000处开始查表做相应的处理,比如系统触发了一个IRQ异常,IRQ为第6号异常,则CPU将把PC指向0 x00000018地址(4*6=24= 0 x00000018)处运行,该地址的指令是跳转到“中断异常服务例程”(HandleIRQ)处运行。s3c2410的中断 (FIQ)和(IRQ), 重点是普通中断(IRQ)。嵌入式创新实验华中农业大学 计算机系 倪福川s3c2410的中断异常处理模块 异常处理模块共由以下寄存器构成SRCPND (SOURCE PENDING REGIS
5、TER)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/
6、SUBSRCPND 两个寄存器在功能上是相同的,它们是中断源引脚寄存器,在一个中断异常处理流程中,中断信号传进中断异常处理模块后首先遇到的就是SRCPND/ SUBSRCPND,这两个寄存器的作用是用于标示出哪个中断请求被触发。SRCPND的有效位为32,SUBSRCPND 的有效位为11,它们中的每一位分别代表一个中断源。SRCPND为主中断源引脚寄存器,SUBSRCPND为副中断源引脚寄存器。嵌入式创新实验华中农业大学 计算机系 倪福川SRCPND 各个位信息每个位的初始值皆为0。假设现在系统触发了TIMER0中断,则第10bit将被置1,代表TIMER0中断被触发,该中断请求即将被处理(
7、若该中断没有被屏蔽的话)。嵌入式创新实验华中农业大学 计算机系 倪福川INTMOD寄存器 有效位为32位,每一位与SRCPND中各位相对应,它的作用是指定该位相应的中断源处理模式(IRQ还是FIQ)。若某位为0,则该位相对应的中断按IRQ模式处理,为1则以FIQ模式进行处理,该寄存器初始化值为0 x00000000,即所有中断皆以IRQ模式进行处理。详细请参考s3c2410操作手册。嵌入式创新实验华中农业大学 计算机系 倪福川INTMSK/ INTSUBMSK 寄存器 INTMSK为主中断屏蔽寄存器,INTSUBMSK为副中断屏蔽寄存器。INTMSK有效位为32,INTSUBMSK有效位为11
8、,这两个寄存器各个位与SRCPND和SUBSRCPND分别对应。它们的作用是决定该位相应的中断请求是否被处理。若某位被设置为1,则该位相对应的中断产生后将被忽略(CPU不处理该中断请求),设置为0则对其进行处理。这两个寄存器初始化后的值是0 xFFFFFFFF和0 x7FF,既默认情况下所有的中断都是被屏蔽的。嵌入式创新实验华中农业大学 计算机系 倪福川PRIORITY寄存器 3sc2410两级优先级判断1)ARBITER(05)六组优先级固定2) ARBITER1, ARBITER2, ARBITER4, ARBITER4, ARBITER5. 的是某组里面各个中断的优先级顺序控制 嵌入式创
9、新实验华中农业大学 计算机系 倪福川PRIORITY寄存器内部各个位被分为两种类型,一种是ARB_MODE,另一种为ARB_SEL, ARB_MODE类型有5组对应ARBITER(26),ARB_SEL类型有7组对应ARBITER(06)。 嵌入式创新实验华中农业大学 计算机系 倪福川中断组与PRIORITY寄存器中ARB_SEL, ARB_MODE之间的相互关系 ARBITER2寄存器管理的该组中断里包括了6个中断,分别是INT_TIMER0,INT_TIMER1,INT_TIMER2,INT_TIMER3,INT_TIMER4,INT_UART2,她们的默认中断请求号分别为REQ0,REQ
10、1,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,从中可以看出优先级最高和最低的中断请求和之前没有变化,但本
11、来处于第2优先级的INT_TIMER1中断现在变成了第5优先级。从ARB_SEL2被设置为00,01,10,11各个值所出现的情况我们可以看出,除最高和最低的优先级不变以外,其他各个中断的优先级其实是在做一个旋转排列(rotate)。为了达到对各个中断平等对待这一目标,我们可以让优先级次序在每个中断请求被处理完之后自动进行一次旋转,如何自动让它旋转呢?我们可以通过ARB_MODE2达到这个目的,该参数只有1个 bit,置1代表开启对应中断组的优先级次序旋转,0则为关闭。事实上当该位置为1之后,每处里完某个组的一个中断后,该组的ARB_SEL便递增在1(达到11后恢复为00)。嵌入式创新实验华中
12、农业大学 计算机系 倪福川令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_
13、TIMER2又被同时触发,则此时CPU优先处理的会是INT_TIMER2。若我们另ARB_MODE2=0,则改组的中断优先级次序在任何情况下都不做任何改变,除非我们人为地重新设置了ARB_SEL2的值。嵌入式创新实验华中农业大学 计算机系 倪福川INTPND 寄存器 SRCPND长得一模一样,但他们在中断异常处理中却扮演着不同的角色 嵌入式创新实验华中农业大学 计算机系 倪福川SRCPND是中断信号进入中断处理模块后所经过的第一个场所的话,那么INTPND 则是中断信号在中断处理模块里经历的最后一个寄存器。它的每个位对应一个中断请求,若该位被置1,则表示相应的中断请求被触发,描述到这里你可能会
14、发现它不仅和SRCPND长得一模一样,就连功能都一样,其实不然,他们在功能上有着重大的区别。SRCPND是中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND的相应位便被置1,也就是说SRCPND 在同一时刻可以有若干位同时被置1,然而INTPND则不同,他在某一时刻只能有1个位被置1,INTPND 某个位被置1(该位对应的中断在所有已触发的中断里具有最高优先级且该中断没有被屏蔽),则表示CPU即将或已经在对该位相应的中断进行处理。于是我们可以有一个总结:SRCPND说明了有什么中断被触发了,INTPND说明了CPU即
15、将或已经在对某一个中断进行处理。嵌入式创新实验华中农业大学 计算机系 倪福川注意:每当某一个中断被处理完之后,我们必须手动地把SRCPND/SUBSRCPND , INTPND三个寄存器中与该中断相应的位由1设置为0,刚才我说INTPND的操作很特别,它的特别之处就在于对当我们要把该寄存器中某个值为1的位设置为0时,我们不是往该位置0,而是往该位置1。假设SRCPND=0 x00000003,INTPND=0 x00000001,该值说明当前0号中断和1号中断被触发,但当前正在被处理的是0号中断,处理完毕后我们应该这样设置INTPND和SRCPND:SRCPND=0 x00000002 /位0
16、被置为0INTPND =0 x00000001 /位0被置为0(方法是往该位写入1)嵌入式创新实验华中农业大学 计算机系 倪福川INTOFFSET寄存器 若当前INT_TIMER0被触发了,则该寄存器的值为10,以此类推。嵌入式创新实验华中农业大学 计算机系 倪福川整个中断流程 嵌入式创新实验华中农业大学 计算机系 倪福川用INT_TIMER0, INT_TIMER2和INT_UART0三个中断完整地介绍一次中断异常处理。首先我们得做几个假设:假设1:这三个中断的屏蔽被取消。 假设2:PRIORITY寄存器中ARB_MODE2,ARB_MODE5皆为0,既不进行优先级的自动旋转排序,任何时候A
17、RBITER2,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已刚才描述的方式进行处理嵌入式创新实验华中农业大学 计算机系 倪福川