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

共9条 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-30 23:27:00     打赏
3楼

据我所知,你提到的那几步,除了返回地址保存在lr中是arm自动执行的之外,其他都需要自己写程序实现。

我也是初学,以上仅为个人观点,仅供参考。


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

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


菜鸟
2006-03-31 18:52:00     打赏
5楼

这些操作可以你自己写的程序完成,或利用编译器完成。利用编译器,如果你使用ADS编译,一些异常处理时可以调用一些关键字,如__irq,它可以帮助完成这些,自动保存相关的寄存器,切换状态等。自己写的程序就要根据你的需要来定。

ARM处理器依据指令执行,只是遇到异常自动发生跳转。


菜鸟
2006-04-04 18:42:00     打赏
6楼

1.每种异常都导致内核进入一种特定的模式。此外,可以通过编程改变cpsr进入任何arm处理器模式。用户和系统模式是仅有的可不通过相应异常进入的两种模式,换句话说,要进入这2种模式必须修改cpsr。

当一个异常导致模式改变时,内核会自动地:

把cpsr保存到相应异常模式下的spsr;把pc保存到相应模式下的lr;设置cpsr为相应异常模式;设置pc为相应异常处理程序的入口地址。

2.vector_IRQ: @
@ s**e mode specific registers
@
ldr r13, .LCsirq
sub lr, lr, #4
str lr, [r13] @ s**e lr_IRQ //保存返回地址lr_IRQ
mrs lr, spsr
str lr, [r13, #4] @ s**e spsr_IRQ //保存中断时的机器状态spsr_IRQ

这段程序,是将LR_irp,SPSR_irq保存,来避免下一次中断发生使它们被冲掉。


菜鸟
2007-01-26 20:06:00     打赏
7楼
有些是ARM自己做的,有些要自己写代码

菜鸟
2007-02-02 03:22:00     打赏
8楼

对异常处理来说,模式的切换是处理器自动完成的,同时,处理器还会在切换前把CPSR保存到SPSR里,把返回地址保存到LR里。然后跳转到中断向量。剩下的就要用户自己处理了。


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

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


共9条 1/1 1 跳转至

回复

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