JZ2440 中断分析

来源:互联网 发布:pc预测软件 编辑:程序博客网 时间:2024/04/30 15:33
ARM体系结构的7中工作模式
1、用户模式(usr) :ARM处理器正常的程序执行状态
2、快速中断模式(fig) :用于高速的数据传输或通道处理
3、中断模式(irq) :用于通用的中断处理
4、管理模式(svc) :操作系统使用的保护模式
5、数据访问终止模式(abt) :当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
6、系统模式(sys) :运行具有特权的操作系统任务
7、未定义指令终止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

除用户模式外,其他均为特权模式。

可以通过软件来进行模式的切换,例如进入SVC管理模式,代码如下:
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3 //svc模式,cpu状态为ARM工作模式,禁止快速中断和中断
msr cpsr, r0

ARM体系结构CPU的两种工作状态:ARM状态 32位的字对齐的ARM指令
Thumb状态 26位的半字对齐的Thumb指令

S3C2440/S3C2410一上电便是在ARM状态,所以无需关心CPU的工作状态

r13:栈指针寄存器
r14:lr寄存器,pc寄存器的备份
r15:pc寄存器,程序计数器

cpu在运行过程中,如何知道各类外设发生了某些不预期的事情,不如串口接收到了新数据,USB接口中出入了设备,按下了某个按键等,主要有两种方法
(1):查询方式
(2):中断方式

识别中断和清除中断主要是利用两种寄存器来实现
(1):中断控制寄存器
(2):外设相关的寄存器

在S3C2410/S3C2440中,irq中断被分为三类
1、request sources(with sub-register) ,即有子中断的中断类型,S3C2410有11个,S3C2440有15个
2、request sources(without sub-register),无子中断的一类中断
3、EINT4_7,EINT8_23

首先来说明如何判断发生的中断时哪一个
1、通过读取INTPND或者INTOFFSET的值可以知道汇总的中断中哪一个中断发生了

2、汇总的中断中有三种类型的中断 

(1)直接有INTPND便可判断的中断

(2)由子中断汇总的中断
(3)EINT4_7 和EINT8_23
对于情况2:比如关于串口方面的中断INT_RXD0,INT_TXD0,INT_ERR0,此三个中断只要有一个发生了,且没有被屏蔽,则三者在INTPND中的标示
均为INT_UART0,光是看INTPND还无法分辨具体哪一个中断发生,此时需要用到SUBSRCPND寄存器,
SUBSRCPND 的位[2]标志INT_ERR0
SUBSRCPND 的位[1]标志INT_TXD0
SUBSRCPND 的位[0]标志INT_RXD0
同理,其他由子中断汇总的中断都能在SUBSRCPND找到自己子中断的标示。这中子中断在S3C2440中有15个,即在SUBSRCPND需要15位标示,汇总到
INTPND中由6位标示,总的映射关系如下

INT_UART0 :INT_RXD0,INT_TXD0,INT_ERR0
INT_UART1 :INT_RXD1,INT_TXD1,INT_ERR1
INT_UART2 :INT_RXD2,INT_TXD2,INT_ERR2
INT_ADC :INT_ADC_S, INT_TC
INT_CAM :INT_CAM_C, INT_CAM_P
INT_WDT_AC97 :INT_WDT, INT_AC97

对于第三种情况EIN4~EINT 7和EINT8~EINT23这几个外部中断,在INTPND中的标示为EINT4_7 和EINT8_23
映射关系如下
EINT4_7 :EIN4~EINT7
EINT8_23 :EINT8~EINT23
故而光是参考INTPND寄存器无法知道具体发生的中断,这是还需要参考EINTPEND寄存器,这个寄存器中标示了具体发生的中断

这里插放中断流程图

使用中断的步骤:
(1)设置好中断模式和快速中断模式下的栈
(2)准备好中断处理函数,即设置中断向量表,中断向量地址0x00000018

_start: b start_code
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq

然后写中断服务程序,即判断是哪个中断发生,采取什么样的措施

最后清除中断,清除中断位置可以在中断服务程序前,也可以在其后,清中断是从源头开始,例如从SUBSRPND,到SRCPND到INTPND

注意:SRCPND和INTPND之间的关系,他俩都是中断的汇总,相应位标志的中断一样,INTPND经由SRCPND屏蔽和优先级而来,INTPND同一时刻只能
标示一种中断,因为同一时刻只能相应一个中断,而SRCPND可能标示了多个中断,这表明有多个中断同时发生了,不过要经过屏蔽和优先级确定
响应哪个中断。在前面说过有三类中断,这里的屏蔽主要屏蔽第二类中断,因为第一类和第三类中断在进入SRCPND标示之前已经被屏蔽了

(3)进入、退出中断模式或快速中断模式时,需要保存、恢复中断程序的运行环境
对于IRQ代码如下
sub lr ,lr ,#4
stmdb sb!,{r0-r12,lr}
......
ldmid sp!,{r0-r12,pc}^

(4)根据具体中断,设置相关外设。比如设置触发条件,设置引脚功能(中断),设置自己的屏蔽寄存器
(5)对于第一类和第三类中断,设置屏蔽寄存器
(6)设置主屏蔽寄存器INTMASK
(7)启动中断功能,即设置CPSR寄存器

在UBOOT的第一阶段代码中对中断的处理如下
(1)关闭中断使能
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr, r0
(2)屏蔽所有中断
# define INTMSK 0x14400008
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
0 0
原创粉丝点击