您的位置 首页 动态

arm反常处理函数的规划

异常处理函数的设计1异常发生时处理器的动作当任何一个异常发生并得到响应时,ARM内核自动完成以下动作:拷贝CPSR到SPSR_mode>

反常处理函数的规划

1 反常产生时处理器的动作
当任何一个反常产生并得到呼应时,ARM 内核主动完结以下动作:

复制 CPSR 到 SPSR_

设置恰当的 CPSR 位:

改动处理器状况进入 ARM 状况

改动处理器形式进入相应的反常形式

设置中止制止位制止相应中止

更新 LR_

设置 PC 到相应的反常向量

留意当呼应反常后,不论反常产生在ARM 仍是Thumb 状况下,处理器都将

主动进入ARM 状况。另一个需求留意的当地是中止使能被主动封闭,也便是说

缺省情况下中止是不行重入的。

除这些主动完结的动作之外,假如在汇编级进行手动编程,还需求留意保存

必要的通用寄存器。

2 进入反常处理循环后软件的使命
进入反常处理程序今后,用户能够彻底依照自己的志愿来进行程序规划,包

括调用Thumb 状况的函数,等等。可是关于绝大多数的体系来说,有一个过程

有必要处理,便是要把中止控制器中对应的中止状况标识清掉,标明该中止请求已

经得到呼应。不然等退出中止函数今后,又立刻会被再一次触发,然后进入周而

复始的死循环。

3 反常的回来
当一个反常处理回来时,一共有3 件工作需求处理:

通用寄存器的康复

状况寄存器的康复

PC 指针的康复

通用寄存器的康复选用一般的仓库操作指令,而PC 和CPSR 的康复能够通

过一条指令来完结,下面是3 个比方:

MOVS pc, lr 或 SUBS pc, lr, #4 或LDMFD sp!, {pc}^

这几条指令都是一般的数据处理指令,特别之处便是把PC 寄存器作为了目

标寄存器,而且带了特别的后缀“S”或“^”,在特权形式下,“S”或“^”的作

用便是使指令在履行时,一起完结从SPSR 到CPSR 的复制,到达康复状况寄存器的意图。

咱们知道在ARM 架构里,PC 值指向当时履行指令的地址加8 处。也便是说,

当履行指令A(地址0x8000)时,PC 等于指令C 的地址(0x8008)。假设指令

A 是“BL”指令,则当履行时,会把PC(=0x8008)保存到LR 寄存器里边,但

是接下去处理器会立刻对LR 进行一个主动的调整动作:LR=LR-0x4。这样,最

终保存在LR 里边的是B 指令的地址,所以当从BL 回来时,LR 里边正好是正

确的回来地址。

相同的调整机制在所有LR 主动保存操作中都存在,比方进入中止呼应时处

理器所做的LR 保存中,也进行了一次主动调整,而且调整动作都是LR=LR-0x4。

由此咱们来对不同反常类型的回来地址进行顺次比较:

假设在指令B 处(地址0x8004)产生了中止呼应,进入中止呼应后LR 上经

过调整保存的地址值应该是C 的地址0x8008。

(a) 假如产生的是软件中止,即B 是“SWI”指令

从SWI 中止回来后下一条履行指令便是C,正好是LR 寄存器保存的地址,

所以只需直接把LR 康复给PC。

(b) 假如产生的是“IRQ”或“FIQ”等指令

由于外部中止请求中止了B 指令的履行,当中止回来后,需求从头回到B

指令的履行,也便是回来地址应该是B(0x8004),需求把LR 减4。

(c) 假如产生的是“Data Abort”

在B上进入数据反常的呼应,但导致数据反常的原因却应该是上一条指令A。

当中止处理程序修正数据反常今后,要回到A 上从头履行导致数据反常的指令,

因而回来地址应该是LR 减8。

假如本来的指令履行状况是Thumb,反常回来地址的剖析与此相似,对LR

的调整正好与ARM 状况彻底一致。

4 ARM 编译器对反常处理函数编写的扩展
考虑到反常处理函数在现场维护和回来地址的处理上与一般函数的不同之

处,不能直接把一般函数体连接到反常向量表上,需求在上面加一层封装,下面

是一个比方:

IRQ_Handler ;中止呼应,从向量表直接跳来

STMFD SP!, {R0-R12, LR} ;维护现场,一般只需维护{r0-r3,lr}即可

BL IrqHandler ;进入一般处理函数,C 或汇编均可

LDMFD SP!, {R0-R12, LR} ;康复现场

SUBS PC, LR, #4 ;中止回来,留意回来地址

为了方便运用高档言语直接编写反常处理函数,ARM 编译器对此作了特定

的扩展,能够运用函数声明关键字__irq,这样编译出来的函数就满意反常呼应

对现场维护和康复的需求,而且主动参加对LR 进行减4 的处理,契合IRQ 和

FIQ 中止处理的要求。

__irq void IRQ_Handler (void)

{…}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/259860.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部