cpu运行模式切换以及异常处理

来源:互联网 发布:经济增长数据 编辑:程序博客网 时间:2024/05/17 09:04
s3c6410的cpu核总共有7中模式,体现在cpsr[4..0]寄存器上:
user 用户模式
fiq 快速中断模式
irq 通常的中断模式
svc 管理模式
abt 数据访问终止模式
sys 系统模式
und 未定义指令中止模式

一般在发生异常的时候会伴随cpu运行模式的自动切换,通常都是切换至除用户模式以外的其他模式。用户模式只有手动切换(即通过修改cpsr的值来切换模式),那么在发生异常的时候:
硬件会做如下的事情:
①cpu切换到该异常对应的模式(如 swi软中断指令会使cpu进入svc模式,发生一般中断则进入irq模式,遇到cpu不认识的机器码则会使cpu切换到未定义指令中止模式)
②cpu切换正在使用的寄存器R13(sp),R14(lr)
③保存当前cpsr到当前模式下的spsr,将下一条指令的地址保存到当前模式下的R14(lr)
④接着跳转到相应的异常处理的地址下。(如reset跳到0x0 swi跳到0x8 等等)
        ——此处延伸出了一个实验时遇到的问题:用了正确的程序,即使运行也得不到正确的结果。究其原因是因为我程序运行的时候是在superboot上downlaod并run在ddram上的。从0x5000_0000地址上开始运行。而跳转时跳到0x0 即开发板刚上电的时候映射到的那块区域。如果是nandflash 启动,开发板会自动将前8K搬到stepping stone,如果是sd卡启动,则是sd卡的前8K(此处是猜的)。 所以使用superboot在运行程序的时候就不会出现正确的结果,就算发生中断了也是跳到superboot程序的第x条语句执行。

那么在编程时候,软件应该做什么呢?
①设置新的堆栈(因为每个模式都有对应的新的R13(sp 堆栈指针))
②保存现场(将每个模式下非独有的,公共的寄存器保存下来,以及R14(lr 此时R14存的是跳转前的下一条地址,用于中断返回))
③处理中断(根据相应参数,或进行相应轮询的过程来确定选择哪个中断服务程序,或直接在此处贴上公共的处理代码)
④恢复现场(将刚刚保存的对应寄存器恢复,并且将硬件上保存下来的spsr恢复到cpsr中)
0 0