##S3C2440中断##

1、一个概念
FIQ:不同于IRQ的中断方式,处理速度比IRQ中断更快,是由于有辅助寄存器的存在,R8~R14,可以快速保存现场
IRQ:不同于FIQ的中断方式,处理速度比FIQ中断更慢,是由于无更多的辅助寄存器,R12~R14,不能够快速的保存现场,需要进行额外的压栈操作

Tip:FIQ只能设置一个,即INTMOD寄存器中只能有一个为1

2、中断源的优先级
ARBIT0:
EINT0
EINT1
EINT2
EINT3
ARBIT1:
EINT4-7
EINT8-23
……
check the S3C2440 technical manual
3、特殊的
EINT4-EINT23 此范围内的中断需要在S3C2440的PORT I/O寄存器中进行操作,中断处理完毕后也需要把其中的标志位清除掉
4、关于CPSR寄存器
CPSR寄存器用来设定工作模式,禁止/开启总中断,以及标定是否有溢出,进位,结果为0等
CPSR寄存器有4个八位区域,分别是
标志域(F) 状态域(S) 扩展域(X) 控制域(C)
31-24 23-16 15-8 7-0
N,Z,C,V I,F,T,M4~M0
NZCV:
N:结果是否为负数
Z:结果是否为0
C:进位|借位|移位溢出
V:溢出标志
IFT
I:IRQ中断
F:FIQ中断
T:CPU状态标志
M4~M0:模式选择
[M4-M0]
10000:用户模式(USER) 先前写的程序就是默认进入管理模式
10001:快中断模式(FIQ)
10010:中断模式(IRQ)
10011:管理模式(supervisor)
10111:数据访问种终止模式(abort)
11011:未定义指令终止模式(undefined)
11111:系统模式(system)
5、关于模式转化
SPSR:程序状态保护寄存器(Save process status register)
用于保存CPSR的值

R14:链接寄存器,存放程序运行地址下一条指令地址

中断模式启动,以下工作由CPU自动完成:
5.1.1:PC指针加4或者8(与中断模式有关)存放入lr(R14)寄存器
5.1.2:将CPSR现有状态保存到SPSR中
5.1.3:切换CPSR寄存器模式
5.1.4:令PC指针指向相应中断所在中断向量表中的地址,跳转执行

中断模式中:
5.2.1:若要使用某些寄存器,保存寄存器到中断模式栈中stmdb sp!,{Rn} @数据压栈
5.2.2:调用中断处理函数
5.2.3:从栈中恢复保存的寄存器数据,ldmia sp!,{Rn}^ @ ‘^’ 的意思就是恢复SPSR值到CPSR中

从中断模式返回:
5.3.1:将lr(R14)减去4或者8赋值给PC寄存器
5.3.2:将异常模式的SPSR值返回给CPSR

6、关于中断返回地址
6.1、中断的时候PC指针指向一条指令,但是还未执行就跳向中断函数去执行中断处理函数,但是lr中保存的是PC+4的值,即未执行断点的下一条指令
所以在退出的时候需要将lr的值减去4,继续执行断点处的程序。
由此也可以得出一个结论:中断发生的检测在指令间隙

tips:

sub Rm,Rn,#off3 将Rn寄存器值减去3bit的off3的值,结果存放在Rm中

INTOFFSET中存放的是每种中断的偏移地址,由中断向量首地址开始,依次可以查询到各个中断的地址

函数调用:
bl:函数调用调用之前把下一条指令的地址拷贝到R14,即lr寄存器,函数调用完毕的时候返回可用mov pc,lr
b: 不保存返回地址,单纯的跳转,需要手动保存函数运行地址

MOV指令:
MOV指令的操作值范围,两个1之间的最大间隔不能够超过8,即可以通过0-255进行循环右移偶数次产生的数就是合法的MOV操作数

你可能感兴趣的:(S3C2440-中断)