这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于arm下异常的处理

共4条 1/1 1 跳转至

关于arm下异常的处理

菜鸟
2006-03-29 18:20:22     打赏

看过"ARM微处理器的编程模型"之后,得知:

ARM体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。当一个异常出现以后,ARM微处理器会执行以下几步操作:
1)保存处理器当前状态、中断屏蔽位以及各条件标志位;
2)设置当前程序状态寄存器CPSR中相应的位;
3)将寄存器lr_mode设置成返回地址;
4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。
在接收到中断请求以后, ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。
从异常中断处理程序中返回包括下面两个基本操作:
1)恢复被屏蔽的程序的处理器状态;
2)返回到发生异常中断的指令的下一条指令处继续执行。

请问:

1.以上这些操作是不是就是由ARM处理器自动完成,不需要程序来实现,还是其它?

2.我看到uclinux在处理异常时,做了保护状态寄存器,返回地址等操作,这样的话,不就是应该在程序中来实现以上操作了吗?(代码如下)

vector_IRQ: @
@ save mode specific registers
@
ldr r13, .LCsirq
sub lr, lr, #4
str lr, [r13] @ save lr_IRQ //保存返回地址lr_IRQ
mrs lr, spsr
str lr, [r13, #4] @ save spsr_IRQ //保存中断时的机器状态spsr_IRQ
@
@ now branch to the relevent MODE handling routine
@
//有两种模式下产生中断:svc和user,即管理模式和用户模式
mrs r13, spsr @ switch to SVC_32 mode
bic r13, r13, #MODE_MASK @ preserve F and T bits //保护FIQ
orr r13, r13, #MODE_SVC|I_BIT //禁止IRQ中断
msr spsr_c, r13 @ switch to SVC_32 mode //切换到svc中断模式下

//计算入口地址,保存到lr寄存器中
and lr, lr, #15 //lr=spsr,lr=spsr&0x0f 获得状态寄存器的低4位【0-3】0x0f
ldr lr, [pc, lr, lsl #2] //lr=pc+lr<<2 lr=0或者8 0x10用户 0x11快速中断 0x12中断 0x13管理

//根据cpu模式跳转到相应模式的入口
movs pc, lr @ Changes mode and branches

3.在linux中,对于发生异常后,在程序中究竟应该做一些哪些操作呢?比如切换处理器的模式?为什么在发生IRQ中断后,必须把CPU切换成SVC模式呢,当时不是已经是IRQ模式呢?

请大家帮帮忙,谢谢了!

如果你认为问题中还有没描述清楚的地方,请指出来,我会尽快补上。




关键词: 关于     异常     处理     中断     程序    

菜鸟
2006-03-30 17:47:00     打赏
2楼

大家帮帮忙啊,谢谢


菜鸟
2006-03-31 17:29:00     打赏
3楼

首先谢谢楼上的同志,不知能否再详细一点描述。另外对于第二和第三个问题能否提点一下。


菜鸟
2007-02-02 16:52:00     打赏
4楼

谢谢各位的回复,我已经明白了。其实,最重要的部分是处理器处理完毕之后,我们自己应该如何去处理下面的事情。


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]