一 ·S3C2440/S3C2410中断体系结构:
1.1 ·ARM体系 CPU的7种工作模式:
· 用户模式(usr): ARM处理器正常的程序执行状态
· 快速中断模式(fiq): 用于高速数据传输或通道处理
· 中断模式(irq):用于通用的中断处理
· 管理模式(svc):操作系统使用的保护模式
· 数据访问终止模式(abt): 当数据或指令预取时进入该模式,可用于虚拟存储及存储保护
· 系统模式(sys) :运行具有特权操作系统任务
· 未定义指令中止模式(und): 当为定义的指令执行时进入该模式,可用于支持硬件协处理的软件仿真
1.2 ·ARM体系的CPU两种工作状态:
· ARM状态:此时处理器执行32位字对齐的ARM指令
· Thumb状态:此时处理器执行16位的,半字对齐的 Thumb指令
可以通过软件来进行模式切换,或者发生各类中断,异常时CPU自动进入相应的模式。除用户模式外,其余的6中工作模式都属于特权模式。大多数程序运行于用户模式,进入特权模式是为了处理中断,异常,或者访问被保护的系统资源。
1.3 ·ARM920T的寄存器分为7组,其每个工作模式都拥有对应的寄存器组。其中有些寄存器是共用的,有些寄存器在不同模式下有自己的副本。当切换到另一个工作模式时,那个工作模式的寄存器副本将被使用;这些寄存器成为备份寄存器(下图中使用灰色三角形标记的寄存器)
![](https://i-blog.csdnimg.cn/blog_migrate/a93388077c3c845c37f238a8dbcdef9f.jpeg)
R0-R15可以直接访问,R13-R15稍有特殊,R13又称为栈指针寄存器,通常用于保存栈指针。R14又称为程序连接寄存器或连接寄存器,比如当执行BL子程序调用指令时,R14得到调用前的程序计数器PC(R15)的备份,以供子程序返回之用。当发生中断和异常时,对应的R14_svc、R14_irq、R14_fiq、R14_abt和R14_und保存R15返回值,R15是程序计数器PC。
PC(程序计数器),CPSR(当前程序状态寄存器)寄存器是程序执行时必不可少的寄存器。每组寄存器都有自己独立的SPSR,R14是为了保存CPSR和PC进入异常前的值。
二 ·ARM920T异常处理的过程——从寄存器值的变化和地址跳转两个角度
2.1 ·ARM920T异常处理的过程——寄存器值变化角度
ARM920T CPU 将在异常(包括中断)的进入和退出时自动完成的工作:
在处理异常前,必须保存当前处理器的状态(PC和CPSR值),当中断程序处理程序完成后,原来的程序能够继续执行。
处理一个异常:
· 将下一条指令的地址(PC)保存在相应的LR(R14)寄存器中。如果异常是从ARM状态进入,则保存在LR(R14)寄存器中的下一条指令的地址。如果是从THumb状态进入,则保存在LR寄存器中的是当前PC的偏移值。它能使程序异常返回后从正确的位置重新开始。这就意味着异常处理不需要确定异常是从何种状态进入的。
· 将CPSR复制到相应的SPSR中
· 将CPSR的工作模式位设置为这个异常对应的工作模式
· 令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常的向量表中的相应指令
退出一个异常:
· 前面进入异常工作模式时,连接寄存器中保存了前一个工作模式的下一个指令的地址,将它减去一个适当的值(图二)后赋给PC寄存器。
· 将SPCR值复制回CPSR
进入/退出异常模式PC地址
![](https://i-blog.csdnimg.cn/blog_migrate/d65d99ab7389c6dda974e092ddca1720.jpeg)
CPSR各位意义:
· T位:置位时,CPU处于Thumb状态,否则处于ARM状态
· 中断禁止位: I位和F位属于中断禁止位,他们被置位时,IRQ中断,FIQ中断分别被禁止。
· 工作模式: 表明CPU当前处于什么工作模式,可以编写这些位,使CPU进入指定的工作模式。
中断处理过程:
· 中断控制器汇集各类外设发出的中断信号,然后通知CPU
· CPU保存程序的运行环境(保存相应寄存器的值),调用中断服务程序(ISR)来处理这些中断。
· 在ISR中通过读取中断控制器,外设的相关寄存器来识别这个是那个中断,并进行相应的处理
· 清楚中断: 通过读写中断控制器和外设的相关寄存器来实现
· 最后恢复被中断程序的运行环境(即上面保存的各个寄存器等),继续执行
ARM920T异常处理的过程——地址跳转变化角度
通常嵌入式表都有一张中断向量表,当中断出现时,必须调用向量表,必须调用向量表,向量表一般为与0 地址处,只要在对应的地址上写上跳转指令就实现了中断向量表。
ARM9的中断向量表
地址 异常
0x0000 0000 复位
0x0000 0004 未定义指令
0x0000 0008 软件中断
0x0000 000c 中止(预取指令)
0x0000 0010 中止(数据)
0x0000 0014 保留
0x0000 0018 IRQ(外部中断请求)
0x0000 001c FIQ(快速中断请求)
中断处理的过程如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/05576e519965fd7c5f418822a8119bc1.jpeg)
三 ·S3C2440S3C2410中断相关寄存器寄存器设置
中断相关寄存器的设置包括中断控制寄存器设置和引脚(IO)模式的设置,在这里我只介绍各个环节设计到的寄存器及其功能,而对于具体的设置我不做详细介绍,请参考芯片手册(interruptController And IO Ports)
S3C2440S3C2410中断控制寄存器
下面讲解ARBITER0-ARBITER6控制下的一级端口控制器设置,及关于REQ0-REQ5的 设置EINT8_EINT23里面每个中断源设置暂时不管,把EINT8_EINT23看成整体
S3C2440S3C2410中断控制寄存器有5大类:
· 源待决寄存器(SRCPND)
当中断源产生中断信号时,在SRCPND相应位置位,至于CPU相应哪个中断不是SRCPND的工作。
· 中断模式寄存器(INTMOD)
该寄存器是设置中断模式是FIQ还是IRQ
· 中断掩码寄存器(INTMSK)
该寄存器是中断使能,当置位时,屏蔽该中断信号。
· 优先级寄存器(PRIORITY)
该寄存器是设置IRQ模式下中断的优先级
· 中断源待决寄存器(INTPND)
该寄存器的值决定CPU响应哪个中断,即只有一位被置位,但是该寄存器值一般是不用设置的(清楚中断的需要设置),该寄存器的值是系统自动计算得出来的值
这五类寄存器值的设置里,中断掩码寄存器和优先级寄存器设置是比较复杂的。中断模式寄存器、中断掩码寄存器、中断源待决寄存器涉及到子寄存器(子寄存器说法不很准确)的设置,就是关于EINT8_EINT23中断掩码寄存器的设置和中断源待决寄存器的设置
![](https://i-blog.csdnimg.cn/blog_migrate/8b3ce911a749479e7a8c91ae239f0833.jpeg)
注:INTOFFSET寄存器用来表示INTPND寄存器中那个被置位了,即INTPND寄存器中位[X]为1时INTOFFSET寄存器的值为X(X为0~31)上图展示了中断处理框图(硬件实现角度)Request source(with sub -register)表示INT_RXD0,INT_TXD0等中断源(S3C2440中有15个),他们不同于Request source(without sub-regiser).假如Request source(with sub -register)中的中断源被触发后,SUBSRCPND寄存器的相应位置1,如果此中断没有被INTSUBMSK寄存器屏蔽,它在SRCPND寄存器中的相应位置1,之后的过程和Request source(without sub-regiser)一样了。