Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48778
  • 博文数量: 25
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-13 05:50
文章分类

全部博文(25)

文章存档

2011年(5)

2010年(1)

2009年(19)

我的朋友

分类:

2009-04-13 09:51:49

当一个异常出现后,ARM处理器会执行以下的步骤:

1. 将下一条指令的地址存入LR中。 如果是Thumb状态 那么就存入下一条指令的偏移量。

2. 将CPSR的内容 保存到SPSR中

3. 强制设置CPSR的运行模式位

4. 跳转到异常处理的向量处,执行异常处理代码.

还可以设置中断禁止位, 如果异常发生时处于Thumb模式下, 那么当异常向量地址加载到PC时,

处理器自动切换至ARM状态

 

ARM微处理器对异常处理的伪代码 可以表示为

R14_ Return_Link

SPSR_ = CPSR

CPSR[4:0] = Exception Mode Number

CPSR[5] = 0    ;当运行于ARM 状态时

IF  == RESET or FIQ

then

    CPSR[6] == 1  ;forbiden fiq interrupt  

CPSR[7]==1  

PC = exceptional vector address

 

2. 异常返回

将连接寄存器减去相应的偏移量后,赋值给PC,返回

SPSR 赋值给CPSR

若在异常处理时禁止了中断,在此要清除

 

;-----------------------------------------------------------------------

异常的描述:

1. FIQ

不管是在ARM状态下还是Thumb状态下只要执行FIQ异常时, 都会执行下面的指令从FIQ处返回:

SUBS PC,R14_fiq,#4

改指令是 用连接寄存器 减去4 后 赋值给PC 然后再将SPSR_fiq 赋值给CPSR 然后返回。

2. IRQ

这是正常的中断请求

不管是在ARM状态下还是Thumb状态下只要执行IRQ异常时, 都会执行下面的指令从IRQ处返回:

SUBS PC,R14_irq,#4

改指令是 用连接寄存器 减去4 后 赋值给PC 然后再将SPSR_irq 赋值给CPSR 然后返回。

阅读(765) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~